From 5dbfc8a290d7396a37b004661e50e129045d4da8 Mon Sep 17 00:00:00 2001 From: dannc Date: Mon, 19 Dec 2022 11:03:01 +0700 Subject: [PATCH] homework 13.4: complete first task, partially complete 2 task --- readme.md | 3 +- .../13.4/project/.helmignore | 23 +++ .../13.4/project/Chart.yaml | 24 +++ .../13.4/project/templates/NOTES.txt | 6 + .../13.4/project/templates/_helpers.tpl | 0 .../project/templates/backend_deployment.yaml | 34 ++++ .../project/templates/backend_service.yaml | 13 ++ .../project/templates/database_configmap.yaml | 14 ++ .../13.4/project/templates/database_pv.yaml | 18 +++ .../13.4/project/templates/database_pvc.yaml | 16 ++ .../project/templates/database_service.yaml | 18 +++ .../templates/database_statefulset.yaml | 47 ++++++ .../templates/frontend_deployment.yaml | 34 ++++ .../13.4/project/values.yaml | 33 ++++ .../13-kubernates-config/13.4/readme.md | 150 ++++++++++++++++++ 15 files changed, 432 insertions(+), 1 deletion(-) create mode 100644 src/homework/13-kubernates-config/13.4/project/.helmignore create mode 100644 src/homework/13-kubernates-config/13.4/project/Chart.yaml create mode 100644 src/homework/13-kubernates-config/13.4/project/templates/NOTES.txt create mode 100644 src/homework/13-kubernates-config/13.4/project/templates/_helpers.tpl create mode 100644 src/homework/13-kubernates-config/13.4/project/templates/backend_deployment.yaml create mode 100644 src/homework/13-kubernates-config/13.4/project/templates/backend_service.yaml create mode 100644 src/homework/13-kubernates-config/13.4/project/templates/database_configmap.yaml create mode 100644 src/homework/13-kubernates-config/13.4/project/templates/database_pv.yaml create mode 100644 src/homework/13-kubernates-config/13.4/project/templates/database_pvc.yaml create mode 100644 src/homework/13-kubernates-config/13.4/project/templates/database_service.yaml create mode 100644 src/homework/13-kubernates-config/13.4/project/templates/database_statefulset.yaml create mode 100644 src/homework/13-kubernates-config/13.4/project/templates/frontend_deployment.yaml create mode 100644 src/homework/13-kubernates-config/13.4/project/values.yaml create mode 100644 src/homework/13-kubernates-config/13.4/readme.md diff --git a/readme.md b/readme.md index cf0ebd6..e2faef9 100644 --- a/readme.md +++ b/readme.md @@ -44,7 +44,7 @@ * [08.6. Создание собственных modules](/src/homework/08-ansible/8.6) * [09.1. Жизненный цикл ПО](/src/homework/09-ci/9.1) * [09.3. CI\CD](/src/homework/09-ci/9.3) -* [09.4 Jenkins](/src/homework/09-ci/9.4) +* [09.4. Jenkins](/src/homework/09-ci/9.4) * [09.5. Teamcity](/src/homework/09-ci/9.5) * [09.6. Gitlab](/src/homework/09-ci/9.6) * [10.1. Зачем и что нужно мониторить](/src/homework/10-monitoring/10.1) @@ -65,3 +65,4 @@ * [13.1. контейнеры, поды, deployment, statefulset, services, endpoints](/src/homework/13-kubernates-config/13.1) * [13.2. разделы и монтирование](/src/homework/13-kubernates-config/13.2) * [13.3. работа с kubectl](/src/homework/13-kubernates-config/13.3) +* [13.4. инструменты для упрощения написания конфигурационных файлов. Helm и Jsonnet](/src/homework/13-kubernates-config/13.4) diff --git a/src/homework/13-kubernates-config/13.4/project/.helmignore b/src/homework/13-kubernates-config/13.4/project/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/src/homework/13-kubernates-config/13.4/project/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/src/homework/13-kubernates-config/13.4/project/Chart.yaml b/src/homework/13-kubernates-config/13.4/project/Chart.yaml new file mode 100644 index 0000000..bdd6814 --- /dev/null +++ b/src/homework/13-kubernates-config/13.4/project/Chart.yaml @@ -0,0 +1,24 @@ +apiVersion: v2 +name: project +description: A Helm chart for Kubernetes + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 1.0.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "1.0.0" diff --git a/src/homework/13-kubernates-config/13.4/project/templates/NOTES.txt b/src/homework/13-kubernates-config/13.4/project/templates/NOTES.txt new file mode 100644 index 0000000..2589bf1 --- /dev/null +++ b/src/homework/13-kubernates-config/13.4/project/templates/NOTES.txt @@ -0,0 +1,6 @@ +--------------------------------------------------------- + +Content of NOTES.txt appears after deploy. +Deployed version {{ .Chart.AppVersion }}. + +--------------------------------------------------------- diff --git a/src/homework/13-kubernates-config/13.4/project/templates/_helpers.tpl b/src/homework/13-kubernates-config/13.4/project/templates/_helpers.tpl new file mode 100644 index 0000000..e69de29 diff --git a/src/homework/13-kubernates-config/13.4/project/templates/backend_deployment.yaml b/src/homework/13-kubernates-config/13.4/project/templates/backend_deployment.yaml new file mode 100644 index 0000000..cac0d80 --- /dev/null +++ b/src/homework/13-kubernates-config/13.4/project/templates/backend_deployment.yaml @@ -0,0 +1,34 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: {{ .Chart.Name }}-{{ .Values.environment }} + service: backend + name: {{ .Chart.Name }}-{{ .Values.environment }}-backend + namespace: {{ .Values.namespace }} +spec: + replicas: {{ .Values.backend.replicasCount }} + selector: + matchLabels: + app: {{ .Chart.Name }}-{{ .Values.environment }} + service: backend + template: + metadata: + labels: + app: {{ .Chart.Name }}-{{ .Values.environment }} + service: backend + spec: + containers: + - image: {{ .Values.image.name }}:backend-latest + imagePullPolicy: Always + name: backend + env: + - name: DATABASE_URL + value: "postgresql://{{ .Values.database.settings.user }}:{{ .Values.database.settings.password }}@postgres:5432/{{ .Values.database.settings.dbName }}" + ports: + - name: web + containerPort: 9000 + resources: + {{- toYaml .Values.backend.resources | nindent 12 }} + terminationGracePeriodSeconds: 30 diff --git a/src/homework/13-kubernates-config/13.4/project/templates/backend_service.yaml b/src/homework/13-kubernates-config/13.4/project/templates/backend_service.yaml new file mode 100644 index 0000000..9da7bb0 --- /dev/null +++ b/src/homework/13-kubernates-config/13.4/project/templates/backend_service.yaml @@ -0,0 +1,13 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Chart.Name }}-{{ .Values.environment }}-backend + namespace: {{ .Values.namespace }} +spec: + ports: + - name: web + port: 9000 + selector: + app: {{ .Chart.Name }}-{{ .Values.environment }} + service: backend diff --git a/src/homework/13-kubernates-config/13.4/project/templates/database_configmap.yaml b/src/homework/13-kubernates-config/13.4/project/templates/database_configmap.yaml new file mode 100644 index 0000000..da3fc02 --- /dev/null +++ b/src/homework/13-kubernates-config/13.4/project/templates/database_configmap.yaml @@ -0,0 +1,14 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Chart.Name }}-{{ .Values.environment }}-postgres-config + labels: + app: {{ .Chart.Name }}-{{ .Values.environment }} + service: database + namespace: {{ .Values.namespace }} +data: + POSTGRES_DB: {{ .Values.database.settings.dbName }} + POSTGRES_USER: {{ .Values.database.settings.user }} + POSTGRES_PASSWORD: {{ .Values.database.settings.password }} + PGDATA: {{ .Values.database.settings.dbPath | quote }} diff --git a/src/homework/13-kubernates-config/13.4/project/templates/database_pv.yaml b/src/homework/13-kubernates-config/13.4/project/templates/database_pv.yaml new file mode 100644 index 0000000..60134ad --- /dev/null +++ b/src/homework/13-kubernates-config/13.4/project/templates/database_pv.yaml @@ -0,0 +1,18 @@ +--- +apiVersion: v1 +kind: PersistentVolume +metadata: + name: {{ .Chart.Name }}-{{ .Values.environment }}-postgres-pv-volume + labels: + type: local + app: {{ .Chart.Name }}-{{ .Values.environment }} + service: database + namespace: {{ .Values.namespace }} +spec: + storageClassName: manual + capacity: + storage: 1Gi + accessModes: + - ReadWriteMany + hostPath: + path: {{ .Values.database.hostVolumePath | quote }} diff --git a/src/homework/13-kubernates-config/13.4/project/templates/database_pvc.yaml b/src/homework/13-kubernates-config/13.4/project/templates/database_pvc.yaml new file mode 100644 index 0000000..233187d --- /dev/null +++ b/src/homework/13-kubernates-config/13.4/project/templates/database_pvc.yaml @@ -0,0 +1,16 @@ +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ .Chart.Name }}-{{ .Values.environment }}-postgres-pv-claim + labels: + app: {{ .Chart.Name }}-{{ .Values.environment }} + service: database + namespace: {{ .Values.namespace }} +spec: + storageClassName: manual + accessModes: + - ReadWriteMany + resources: + requests: + storage: 1Gi diff --git a/src/homework/13-kubernates-config/13.4/project/templates/database_service.yaml b/src/homework/13-kubernates-config/13.4/project/templates/database_service.yaml new file mode 100644 index 0000000..1adcb46 --- /dev/null +++ b/src/homework/13-kubernates-config/13.4/project/templates/database_service.yaml @@ -0,0 +1,18 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Chart.Name }}-{{ .Values.environment }}-database + namespace: {{ .Values.namespace }} +spec: + type: ClusterIP + clusterIP: None + ports: + - name: {{ .Chart.Name }}-{{ .Values.environment }}-postgresql + port: 5432 + targetPort: 5432 + protocol: TCP + selector: + app: {{ .Chart.Name }}-{{ .Values.environment }} + service: database + db-kind: postgresql diff --git a/src/homework/13-kubernates-config/13.4/project/templates/database_statefulset.yaml b/src/homework/13-kubernates-config/13.4/project/templates/database_statefulset.yaml new file mode 100644 index 0000000..2a50931 --- /dev/null +++ b/src/homework/13-kubernates-config/13.4/project/templates/database_statefulset.yaml @@ -0,0 +1,47 @@ +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + app: {{ .Chart.Name }}-{{ .Values.environment }} + service: database + db-kind: postgresql + name: {{ .Chart.Name }}-{{ .Values.environment }}-database + namespace: {{ .Values.namespace }} +spec: + selector: + matchLabels: + app: {{ .Chart.Name }}-{{ .Values.environment }} + service: database + db-kind: postgresql + serviceName: postgres + replicas: 1 + podManagementPolicy: "Parallel" + updateStrategy: + type: "RollingUpdate" + template: + metadata: + labels: + app: {{ .Chart.Name }}-{{ .Values.environment }} + service: database + db-kind: postgresql + spec: + terminationGracePeriodSeconds: 60 + containers: + - name: postgres + image: postgres:13-alpine + imagePullPolicy: "IfNotPresent" + ports: + - name: postgresql + containerPort: 5432 + protocol: TCP + envFrom: + - configMapRef: + name: {{ .Chart.Name }}-{{ .Values.environment }}-postgres-config + volumeMounts: + - mountPath: {{ .Values.database.settings.dbPath | quote }} + name: {{ .Chart.Name }}-{{ .Values.environment }}-postgres-volume + volumes: + - name: {{ .Chart.Name }}-{{ .Values.environment }}-postgres-volume + persistentVolumeClaim: + claimName: {{ .Chart.Name }}-{{ .Values.environment }}-postgres-pv-claim diff --git a/src/homework/13-kubernates-config/13.4/project/templates/frontend_deployment.yaml b/src/homework/13-kubernates-config/13.4/project/templates/frontend_deployment.yaml new file mode 100644 index 0000000..924aea8 --- /dev/null +++ b/src/homework/13-kubernates-config/13.4/project/templates/frontend_deployment.yaml @@ -0,0 +1,34 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: {{ .Chart.Name }}-{{ .Values.environment }} + service: frontend + name: {{ .Chart.Name }}-{{ .Values.environment }}-frontend + namespace: {{ .Values.namespace }} +spec: + replicas: {{ .Values.frontend.replicasCount }} + selector: + matchLabels: + app: {{ .Chart.Name }}-{{ .Values.environment }} + service: frontend + template: + metadata: + labels: + app: {{ .Chart.Name }}-{{ .Values.environment }} + service: frontend + spec: + containers: + - image: {{ .Values.image.name }}:frontend-latest + imagePullPolicy: Always + name: frontend + env: + - name: BASE_URL + value: "http://{{ .Chart.Name }}-{{ .Values.environment }}-backend:9000" + ports: + - name: web + containerPort: 80 + resources: + {{- toYaml .Values.frontend.resources | nindent 12 }} + terminationGracePeriodSeconds: 30 diff --git a/src/homework/13-kubernates-config/13.4/project/values.yaml b/src/homework/13-kubernates-config/13.4/project/values.yaml new file mode 100644 index 0000000..061816c --- /dev/null +++ b/src/homework/13-kubernates-config/13.4/project/values.yaml @@ -0,0 +1,33 @@ +environment: production +namespace: app1 + +image: + name: dannecron/netology-devops-k8s-app + +backend: + replicasCount: 1 + resources: + limits: + cpu: 200m + memory: 256Mi + requests: + cpu: 100m + memory: 128Mi + +frontend: + replicasCount: 1 + resources: + limits: + cpu: 200m + memory: 256Mi + requests: + cpu: 100m + memory: 128Mi + +database: + settings: + user: db_user + password: db_passwd + dbName: news + dbPath: "/var/lib/postgresql/data" + hostVolumePath: "/mnt/pgsql_data" diff --git a/src/homework/13-kubernates-config/13.4/readme.md b/src/homework/13-kubernates-config/13.4/readme.md new file mode 100644 index 0000000..6f7b6fa --- /dev/null +++ b/src/homework/13-kubernates-config/13.4/readme.md @@ -0,0 +1,150 @@ +Выполнение [домашнего задания](https://github.com/netology-code/devkub-homeworks/blob/main/13-kubernetes-config-04-helm.md) +по теме "13.4. инструменты для упрощения написания конфигурационных файлов. Helm и Jsonnet" + +## Q/A + +> В работе часто приходится применять системы автоматической генерации конфигураций. +> Для изучения нюансов использования разных инструментов нужно попробовать упаковать приложение каждым из них. + +### Задание 1 + +> Подготовить helm чарт для приложения. +> +> Необходимо упаковать приложение в чарт для деплоя в разные окружения. Требования: +> * каждый компонент приложения деплоится отдельным deployment’ом/statefulset’ом; +> * в переменных чарта измените образ приложения для изменения версии. + +Helm-чарт находится в директории [project](./project). Каждый компонент приложения выделен в отдельный шаблон. + +Различные переменные вынесены в файл [values.yaml](./project/values.yaml). + +### Задание 2 + +> Запустить 2 версии в разных неймспейсах. +> +> Подготовив чарт, необходимо его проверить. Попробуйте запустить несколько копий приложения: +> * одну версию в namespace=app1; +> * вторую версию в том же неймспейсе; +> * третью версию в namespace=app2. + +Перед выполнением команд `helm`, необходимо создать новый неймспейс `app1` в кластере. Для этого нужно выполнить следующую команду: + +```shell +kubectl create namespace app1 +``` + +И убедиться, что новые неймспесы есть в списке: + +```shell +kubectl get ns +``` + +```text +NAME STATUS AGE +app1 Active 66s +default Active 35m +kube-node-lease Active 35m +kube-public Active 35m +kube-system Active 35m +``` + +По умолчанию задан `namespace=app1`, таким образом для деплоя chart необходимо выполнить команду: + +```shell +helm install netology-project project +``` + +```text +NAME: netology-project +LAST DEPLOYED: Mon Dec 19 10:36:23 2022 +NAMESPACE: default +STATUS: deployed +REVISION: 1 +TEST SUITE: None +NOTES: +--------------------------------------------------------- + +Content of NOTES.txt appears after deploy. +Deployed version 1.0.0. + +--------------------------------------------------------- +``` + +Следующим шагом нужно проверить, что chart появился в списке: + +```shell +helm list +``` + +```text +NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION +netology-project default 1 2022-12-19 10:36:23.9408923 +0700 +07 deployeproject-1.0.0 1.0.0 +``` + +И что все поды запустились: + +```shell +kubectl get po --namespace app1 +``` + +```text +NAME READY STATUS RESTARTS AGE +database-0 1/1 Running 0 113s +project-production-backend-768887dd4b-vn4ct 1/1 Running 0 113s +project-production-frontend-74d8bb648d-w9wlz 1/1 Running 0 113s +``` + +Предполагается, что в том же неймспейсе необходимо развернуть данное приложение, но с другим `environment` и с количеством реплик = 2. +Для этого нужно выполнить следующую команду: + +```shell +helm install --set "environment=testing" --set "backend.replicasCount=2" netology-project-test project +``` + +```text +NAME: netology-project-test +LAST DEPLOYED: Mon Dec 19 10:51:48 2022 +NAMESPACE: default +STATUS: deployed +REVISION: 1 +TEST SUITE: None +NOTES: +--------------------------------------------------------- + +Content of NOTES.txt appears after deploy. +Deployed version 1.0.0. + +--------------------------------------------------------- +``` + +Следующим шагом проверим состояние подов: + +```shell +kubectl get po --namespace app1 +``` + +```text +NAME READY STATUS RESTARTS AGE +database-0 1/1 Running 0 15m +project-production-backend-768887dd4b-vn4ct 1/1 Running 0 15m +project-production-frontend-74d8bb648d-w9wlz 1/1 Running 0 15m +project-testing-backend-688cb58bdc-74k2m 1/1 Running 0 21s +project-testing-backend-688cb58bdc-r97xv 1/1 Running 0 21s +project-testing-database-0 1/1 Running 0 21s +project-testing-frontend-7648dfbcb6-th89l 1/1 Running 0 21s +``` + +Затем необходимо сделать деплой в новый неймспейс. Для этого необходимо выполнить команду: + +```shell +helm install --set "namespace=app2" --namespace=app2 --create-namespace netology-project project +``` + +// todo ошибка +> Error: INSTALLATION FAILED: rendered manifests contain a resource that already exists. +> Unable to continue with install: PersistentVolume "project-production-postgres-pv-volume" in namespace "" exists +> and cannot be imported into the current release: invalid ownership metadata; +> annotation validation error: key "meta.helm.sh/release-name" must equal "netology-project-app2": +> current value is "netology-project"; +> annotation validation error: key "meta.helm.sh/release-namespace" must equal "app2": +> current value is "default"