homework 13.4: complete first task, partially complete 2 task

This commit is contained in:
2022-12-19 11:03:01 +07:00
parent 6fab2cab4d
commit 5dbfc8a290
15 changed files with 432 additions and 1 deletions

View File

@@ -44,7 +44,7 @@
* [08.6. Создание собственных modules](/src/homework/08-ansible/8.6) * [08.6. Создание собственных modules](/src/homework/08-ansible/8.6)
* [09.1. Жизненный цикл ПО](/src/homework/09-ci/9.1) * [09.1. Жизненный цикл ПО](/src/homework/09-ci/9.1)
* [09.3. CI\CD](/src/homework/09-ci/9.3) * [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.5. Teamcity](/src/homework/09-ci/9.5)
* [09.6. Gitlab](/src/homework/09-ci/9.6) * [09.6. Gitlab](/src/homework/09-ci/9.6)
* [10.1. Зачем и что нужно мониторить](/src/homework/10-monitoring/10.1) * [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.1. контейнеры, поды, deployment, statefulset, services, endpoints](/src/homework/13-kubernates-config/13.1)
* [13.2. разделы и монтирование](/src/homework/13-kubernates-config/13.2) * [13.2. разделы и монтирование](/src/homework/13-kubernates-config/13.2)
* [13.3. работа с kubectl](/src/homework/13-kubernates-config/13.3) * [13.3. работа с kubectl](/src/homework/13-kubernates-config/13.3)
* [13.4. инструменты для упрощения написания конфигурационных файлов. Helm и Jsonnet](/src/homework/13-kubernates-config/13.4)

View File

@@ -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/

View File

@@ -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"

View File

@@ -0,0 +1,6 @@
---------------------------------------------------------
Content of NOTES.txt appears after deploy.
Deployed version {{ .Chart.AppVersion }}.
---------------------------------------------------------

View File

@@ -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

View File

@@ -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

View File

@@ -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 }}

View File

@@ -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 }}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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"