mirror of
https://github.com/slurm-personal/school-dev-k8s.git
synced 2026-06-27 05:40:24 +00:00
024fb82a2a
fix_2
Знакомимся с Helm
- Подключаем repo и смотрим kube-ops-view
helm repo add southbridge https://charts.southbridge.ru
helm repo update
helm search hub kube-ops
helm show values southbridge/kube-ops-view > values.yaml
- Правим
values.yaml:
ingress:
enabled: true
...
hostname: kube-ops.s<свой номер логина>.mcs.slurm.io
...
- Устанавливаем
kube-ops-view:
helm install ops-view southbridge/kube-ops-view -f values.yaml
-
Переходим в браузер в Инкогнито режим и заходим на
http://kube-ops.s<свой номер логина>.mcs.slurm.io/ -
Удаляем чарт:
helm delete ops-view
Посмотрим, что внутри чарта:
helm pull southbridge/kube-ops-view
tar -zxvf kube-ops-view-<TAB>
cd kube-ops-view/
Создадим свой чарт
- Возьмем за основу нашего чарта готовый Deployment. Создадим папку будущего чарта и создадим внутри необходимые файлы и папки:
cd ~
mkdir myapp
cd myapp
touch Chart.yaml values.yaml
mkdir templates
cp ~/school-dev-k8s/practice/18.templating/simple-deployment.yaml ~/myapp/templates/
- Добавим в файл
Chart.yamlминимально необходимые поля:
name: myapp
version: 1
- Проверим что рендеринг чарта работает, в выводе команды должны увидеть наш Deployment
helm template .
Темплейтируем свой чарт
Если отстали, сверяемся с файлом
summary_file.yaml
- Смотрим на файл
templates/simple-deployment.yamlи темплейтируем в нем количество реплик и image
replicas: 1
меняем на
replicas: {{ .Values.replicas }}
...
image: nginx:1.14.2
меняем на
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
- Добавляем значения этих переменных в файл
values.yaml:
replicas: 3
image:
repository: nginx
tag: 1.12
- Проверяем что все корректно и что наши values подцепились:
helm template .
САМОСТОЯТЕЛЬНАЯ РАБОТА:
- Затемплейтировать по аналогии в Deployment значение поля
containerPort: 80
Стандартизируем наш чарт
- Заменяем все лейблы в Deployment, а также имя деплоймента и контейнера
labels:
app: nginx
меняем на
labels:
app: {{ .Chart.Name }}-{{ .Release.Name }}
---
name: nginx-deployment
меняем на
name: {{ .Chart.Name }}-{{ .Release.Name }}
---
containers:
- name: nginx
меняем на
containers:
- name: {{ .Chart.Name }}
- Для проверки используем ту же команду, но с доп ключом:
helm template . --name-template foobar
- Указываем количество реплик по-умолчанию:
{{ .Values.replicas | default 2 }}
- Проверяем изменения, а также пробуем переназначить тэг образа через ключ
--set:
helm template . --name-template foobar --set image.tag=1.13
Добавляем в наш Deployment requests/limits
- Добавляем в
values.yamlреквесты и лимиты, прям в их обычном формате:
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 80m
memory: 64Mi
- В нашем темплейтированном манифесте говорим, чтобы за ресурсами он сходил в
values.yamlи взял оттуда секцию целиком:
ports:
- containerPort: {{ .Values.service.internalPort }}
resources: <--- вставляем в это место
{{ toYaml .Values.resources }}
- Проверяем изменения
helm template . --name-template foobar
- Видим что не хватает отступов. Добавляем
indentв наш Deployment:
было
{{ toYaml .Values.resources }}
стало
{{ toYaml .Values.resources | indent 10 }}
- Проверяем исправилось ли
helm template . --name-template foobar
САМОСТОЯТЕЛЬНАЯ РАБОТА:
- Добавить таким же образом
annotations - Поиграйтесь с indent'ом. Сделайте так, чтобы при рендеринге показывались верные отступы
- В
values.yamlукажите значение аннотацииabc: xyz
- Добавляем условие в аннотации:
было
annotations:
{{ toYaml .Values.annotations | indent 4 }}
стало
{{ if .Values.annotations }}
annotations:
{{ toYaml .Values.annotations | indent 4 }}
{{ end }}
- Смущают пустые строчки. Уберем их
было
{{ if .Values.annotations }}
annotations:
{{ toYaml .Values.annotations | indent 4 }}
{{ end }}
стало
{{- if .Values.annotations }}
annotations:
{{ toYaml .Values.annotations | indent 4 }}
{{- end }}
- Проверяем что теперь все ОК
helm template . --name-template foobar
Добавляем указание переменных окружения
- Вносим в наш темплейтированный манифест следующее:
- containerPort: {{ .Values.port }}
{{ if .Values.env }} <--- Сюда вставляем
env:
{{ range $key, $val := .Values.env }}
- name: {{ $key | quote }}
value: {{ $val | quote }}
{{ end }}
{{ end }}
- Проверяем что ничего не сломали
helm template . --name-template foobar
- Добавляем в
values.yamlпеременные окружения:
env:
one: two
ENV: DEVELOPMENT
- Проверяем что переменные подтянулись
helm template . --name-template foobar
ДОМАШНЯЯ РАБОТА:
- Перейти в папку
homework - Запустить deployment из файла
bad_deployment.yaml - Исправить все найденные ошибки и сделать так, чтобы все pod'ы были в состоянии
Running 1/1
Ответ-шпаргалка находится в файле bad_deployment.yaml_otvet
Helm Tests
- Переходим в каталог
~/school-dev-k8s/practice/18.templating/wordpress, осматриваем чарт. Смотрим папкуtestsи манифест там
cd ~/school-dev-k8s/practice/18.templating/wordpress
ls
cd templates/tests/
ls
cat test-mariadb-connection.yaml
- Устанавливаем чарт Wordpress в свой кластер и запускаем тесты:
helm install wordpress ~/school-dev-k8s/practice/18.templating/wordpress
helm test wordpress
- Видим что все работает и тест прошел успешно. Удаляем чарт из кластера, однако замечаем что pod с тестом остается:
helm delete wordpress
kubectl get po
- Удалим этот оставшийся pod. Затем модернизируем наши тесты, добавив туда аннотацию
"helm.sh/hook-delete-policy": hook-succeeded
kubectl delete po <имя_пода>
cd ~/school-dev-k8s/practice/18.templating/
vim wordpress/templates/tests/test-mariadb-connection.yaml
...
annotations:
"helm.sh/hook-delete-policy": hook-succeeded <-- Добавляем аннотацию
"helm.sh/hook": test-succeded
...
- Снова ставим чарт и делаем тест:
helm install wordpress ~/school-dev-k8s/practice/18.templating/wordpress/
helm test wordpress
- Видим, что теперь pod удаляется. Намеренно испортим тест, чтобы проверить что произойдет. Изменим в манифесте
test-mariadb-connection.yamlномер порта с3306на3333. Затем обновим чарт, добавив необходимые переменные:
vim wordpress/templates/tests/test-mariadb-connection.yaml
export MARIADB_PASSWORD=$(kubectl get secret wordpress-mariadb -o jsonpath="{.data.mariadb-password}" | base64 --decode)
export WORDPRESS_PASSWORD=$(kubectl get secret wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)
helm upgrade --install wordpress ./wordpress/ --set mariadb.auth.password=$MARIADB_PASSWORD --set wordpressPassword=$WORDPRESS_PASSWORD
- Выполним тест, указав таймаут, чтобы не ждать ошибки от самого pod'а. Смотрим статус теста и pod'а:
helm test wordpress --timeout 30s
kubectl get po
- Удаляем чарт
helm delete wordpress
Helm Library Chart
-
Смотрим на чарты в каталогах
libchart/иmychart/ -
Проверяем как подключается библиотечный чарт с шаблоном configmap'а:
helm install libtest mychart/ --debug --dry-run
Helm Cheatsheet
Поиск чартов
helm search hub
Получение дефолтных values
helm show values repo/chart > values.yaml
Установка чарта в кластер
helm install release-name repo/chart [--atomic] [--namespace namespace]
Локально отрендерить чарт
helm template /path/to/chart