From 6ee33c51cca2df5b6a69b901c15c2704ade665d8 Mon Sep 17 00:00:00 2001 From: northpowered Date: Mon, 30 Jan 2023 22:16:03 +0300 Subject: [PATCH] Ready to review --- README.md | 16 +++ docs/cicd.md | 121 ++++++++++++++++++ docs/index.md | 26 +++- docs/monitoring/grafana.md | 19 +++ docs/monitoring/logs.md | 12 ++ docs/{ => monitoring}/metrics.md | 0 .../static}/step_1/get-ingress.png | Bin .../static}/step_1/get-no_get-po.png | Bin .../static}/step_1/ingress-404.png | Bin docs/static/step_2/dns.png | Bin 0 -> 26505 bytes docs/static/step_2/secret.png | Bin 0 -> 16294 bytes docs/tasks/autoscaling.md | 79 ++++++++++++ docs/tasks/cluster_deployment.md | 33 +++++ docs/tasks/future.md | 33 +++++ docs/tasks/logs_configuration.md | 3 + docs/tasks/monitoring_configuration.md | 20 +++ docs/tasks/services_deployment.md | 62 +++++++++ mkdocs.yml | 20 ++- src/load_testing/profile.yaml | 46 +++++++ 19 files changed, 488 insertions(+), 2 deletions(-) create mode 100644 docs/cicd.md create mode 100644 docs/monitoring/grafana.md create mode 100644 docs/monitoring/logs.md rename docs/{ => monitoring}/metrics.md (100%) rename {static => docs/static}/step_1/get-ingress.png (100%) rename {static => docs/static}/step_1/get-no_get-po.png (100%) rename {static => docs/static}/step_1/ingress-404.png (100%) create mode 100644 docs/static/step_2/dns.png create mode 100644 docs/static/step_2/secret.png create mode 100644 docs/tasks/autoscaling.md create mode 100644 docs/tasks/cluster_deployment.md create mode 100644 docs/tasks/future.md create mode 100644 docs/tasks/logs_configuration.md create mode 100644 docs/tasks/monitoring_configuration.md create mode 100644 docs/tasks/services_deployment.md create mode 100644 src/load_testing/profile.yaml diff --git a/README.md b/README.md index e69de29..63d09f0 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,16 @@ +[![Loadgenerator CI/CD](https://github.com/northpowered/k8s-final-cource/actions/workflows/loadgenerator-cicd.yml/badge.svg?branch=main)](https://github.com/northpowered/k8s-final-cource/actions/workflows/loadgenerator-cicd.yml) +[![MkDocs CD](https://github.com/northpowered/k8s-final-cource/actions/workflows/mkdocs-cd.yml/badge.svg)](https://github.com/northpowered/k8s-final-cource/actions/workflows/mkdocs-cd.yml) +--- +# K8S graduate work + +Yandex cloud deployment + +All documentation are placed [here](https://docs.k8s-test.northpowered.space/) + +URLs: + + * [Frontend example](https://frontend.k8s-test.northpowered.space/) + * [Grafana](https://grafana.k8s-test.northpowered.space) + +Grafana credentials: +> viewer:P@ssw0rd \ No newline at end of file diff --git a/docs/cicd.md b/docs/cicd.md new file mode 100644 index 0000000..287b1ab --- /dev/null +++ b/docs/cicd.md @@ -0,0 +1,121 @@ +# GitHub CI/CD + +CI/CD pipelines were made with GitHub actions + +## Loadgenerator manifest + +```yaml +name: Loadgenerator CI/CD + +on: + push: + branches: [ "main" ] + tags: + - 'v*.*.*' + pull_request: + branches: [ "main" ] + +jobs: + setup: + runs-on: ubuntu-latest + outputs: + repo: ${{ steps.vars.outputs.repo }} + tag: ${{ steps.vars.outputs.tag }} + steps: + - name: Use repository + uses: actions/checkout@v2 + - name: Build variables + id: vars + run: | + echo "::set-output name=repo::$GITHUB_REPOSITORY" + echo "::set-output name=tag::$(git rev-parse --short "$GITHUB_SHA")" + - name: Upload repository + uses: actions/upload-artifact@v2 + with: + name: repository + path: | + ${{ github.workspace }}/src + + + build: + needs: setup + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Docker meta + id: meta + uses: docker/metadata-action@v4 + with: + images: | + ghcr.io/${{ github.repository_owner }}/loadgenerator + tags: | + type=schedule + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + type=sha + - name: Login to GitHub Container Registry + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.CR_PAT }} + - name: Build and push + uses: docker/build-push-action@v3 + with: + context: ./src/loadgenerator/ + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + deployment: + needs: [setup, build] + runs-on: ubuntu-latest + steps: + - name: Download repository + uses: actions/download-artifact@v2 + with: + name: repository + - name: Create kube config + run: | + mkdir -p $HOME/.kube/ + echo "${{ secrets.KUBECONFIG }}" | base64 -d > $HOME/.kube/config + chmod 600 $HOME/.kube/config + - name: Install helm + run: | + curl -LO https://get.helm.sh/helm-v3.8.0-linux-amd64.tar.gz + tar -zxvf helm-v3.8.0-linux-amd64.tar.gz + mv linux-amd64/helm /usr/local/bin/helm + helm version + - name: Lint helm charts + run: helm lint ./loadgenerator/helm/ + - name: Deploy + run: | + helm upgrade loadgenerator ./loadgenerator/helm/ +``` + +## MKDocs Github pages deployment + +```yaml +name: MkDocs CD +on: + push: + branches: + - main +permissions: + contents: write +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: 3.x + - run: pip install mkdocs-material + - run: mkdocs gh-deploy --force +``` \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 89e173c..327ad79 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,3 +1,27 @@ -# K8S course +# Getting started Documentation for graduate work of [Skillbox Kubernetes cource](https://skillbox.ru/course/devops-kubernetes/) + +Short description: + + * Cloud provider - Yandex cloud + + * Cloud service - Managed kubernetes + + * Infrastructure was managed by - yactl + + * Ingress - nginx + + * Load balancer - by cloud provider + + * Domain - custom, k8s-test.northpowered.space + +URLs: + + * [Frontend service](https://frontend.k8s-test.northpowered.space/) + * [Grafana](https://grafana.k8s-test.northpowered.space) + * [Documentation](https://docs.k8s-test.northpowered.space/) + +Grafana credentials: + +> viewer:P@ssw0rd \ No newline at end of file diff --git a/docs/monitoring/grafana.md b/docs/monitoring/grafana.md new file mode 100644 index 0000000..96bcebb --- /dev/null +++ b/docs/monitoring/grafana.md @@ -0,0 +1,19 @@ +# Grafana + +## Nodes Info + +[Dashboard link](https://grafana.k8s-test.northpowered.space/d/ZDyXJgoVk/nodes-info?orgId=1) + +## Ingress dashboard + +With GeoMap panel for requests geo location + +[Dashboard link](https://grafana.k8s-test.northpowered.space/d/BZ1BLRoVk/ingress?orgId=1&refresh=30s) + +## Pods info + +[Dashboard link](https://grafana.k8s-test.northpowered.space/d/22EaBgoVz/pods?orgId=1) + +## Pods logs + +[Dashboard link](https://grafana.k8s-test.northpowered.space/d/MPZzoHTVk/pod-logs?orgId=1) \ No newline at end of file diff --git a/docs/monitoring/logs.md b/docs/monitoring/logs.md new file mode 100644 index 0000000..70b99fb --- /dev/null +++ b/docs/monitoring/logs.md @@ -0,0 +1,12 @@ +# Logs + +## Ingress logging + +Nginx log format. Custom format to get coords for **GeoLite2 Database** +``` +log-format-upstream: "local_ts=$time_local remote_addr=$remote_addr remote_user=$remote_user request=[$request] status=$status body_bytes=$body_bytes_sent user_agent=[$http_user_agent] request_length=$request_length request_time=$request_time proxy_upstream=$proxy_upstream_name upstream_response_time=$upstream_response_time $req_id geo_country_name=$geoip_country_name geo_country_code=$geoip_country_code geo_city=$geoip_city latitude=$geoip_latitude longitude=$geoip_longitude" +``` + +## Logs dashboard + +[Dashboard link](https://grafana.k8s-test.northpowered.space/d/MPZzoHTVk/pod-logs?orgId=1) \ No newline at end of file diff --git a/docs/metrics.md b/docs/monitoring/metrics.md similarity index 100% rename from docs/metrics.md rename to docs/monitoring/metrics.md diff --git a/static/step_1/get-ingress.png b/docs/static/step_1/get-ingress.png similarity index 100% rename from static/step_1/get-ingress.png rename to docs/static/step_1/get-ingress.png diff --git a/static/step_1/get-no_get-po.png b/docs/static/step_1/get-no_get-po.png similarity index 100% rename from static/step_1/get-no_get-po.png rename to docs/static/step_1/get-no_get-po.png diff --git a/static/step_1/ingress-404.png b/docs/static/step_1/ingress-404.png similarity index 100% rename from static/step_1/ingress-404.png rename to docs/static/step_1/ingress-404.png diff --git a/docs/static/step_2/dns.png b/docs/static/step_2/dns.png new file mode 100644 index 0000000000000000000000000000000000000000..aefaf68d8848cdbca43b5efa34bc0706fe092d03 GIT binary patch literal 26505 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 T@q7Hc5Jyr>PP9ze;KzReSRx33 literal 0 HcmV?d00001 diff --git a/docs/static/step_2/secret.png b/docs/static/step_2/secret.png new file mode 100644 index 0000000000000000000000000000000000000000..15454f1989a2fc217bd57853e818fb6aa73a1263 GIT binary patch literal 16294 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