mirror of
https://github.com/Dannecron/netology-devops.git
synced 2025-12-25 15:22:37 +03:00
homework 13.4: complete first task, partially complete 2 task
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
23
src/homework/13-kubernates-config/13.4/project/.helmignore
Normal file
23
src/homework/13-kubernates-config/13.4/project/.helmignore
Normal 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/
|
||||||
24
src/homework/13-kubernates-config/13.4/project/Chart.yaml
Normal file
24
src/homework/13-kubernates-config/13.4/project/Chart.yaml
Normal 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"
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
Content of NOTES.txt appears after deploy.
|
||||||
|
Deployed version {{ .Chart.AppVersion }}.
|
||||||
|
|
||||||
|
---------------------------------------------------------
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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 }}
|
||||||
@@ -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 }}
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
33
src/homework/13-kubernates-config/13.4/project/values.yaml
Normal file
33
src/homework/13-kubernates-config/13.4/project/values.yaml
Normal 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"
|
||||||
150
src/homework/13-kubernates-config/13.4/readme.md
Normal file
150
src/homework/13-kubernates-config/13.4/readme.md
Normal 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"
|
||||||
Reference in New Issue
Block a user