Files
school-dev-k8s/practice/18.templating/README.md
T
2021-09-27 16:59:35 +03:00

10 KiB
Raw Blame History

Знакомимся с Helm

  1. Подключаем 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

  1. Правим values.yaml:
ingress:
  enabled: true
...
hostname: kube-ops.s<свой номер логина>.k8s.slurm.io
...
  1. Устанавливаем kube-ops-view:
helm install ops-view southbridge/kube-ops-view -f values.yaml
  1. Переходим в браузер в Инкогнито режим и заходим на http://kube-ops.s<свой номер логина>.k8s.slurm.io/

  2. Удаляем чарт:

helm delete ops-view

Посмотрим, что внутри чарта:

helm pull southbridge/kube-ops-view

tar -zxvf kube-ops-view-X.Y.Z.tgz

cd kube-ops-view/

Создадим свой чарт

  1. Возьмем за основу нашего чарта готовый Depolyment. Создадим папку будущего чарта и создадим внутри необходимые файлы и папки:
cd ~
mkdir myapp

cd myapp

touch Chart.yaml values.yaml
mkdir templates

cp ~/slurm/practice/13.templating/simple-deployment.yaml ~/myapp/templates/
  1. Добавим в файл Chart.yaml минимально необходимые поля:
name: myapp
version: 1
  1. Проверим что рендеринг чарта работает, в выводе команды должны увидеть наш Deployment
helm template .

Темплейтируем свой чарт

Если отстали, сверяемся с файлом summary_file.yaml

  1. Смотрим на файл templates/simple-deployment.yaml и темплейтируем в нем количество реплик и image
replicas: 1

меняем на

replicas: {{ .Values.replicas }}

...

image: nginx:1.14.2

меняем на

image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" 
  1. Добавляем значения этих переменных в файл values.yaml:
replicas: 3

image:
  repository: nginx
  tag: 1.12
  1. Проверяем что все корректно и что наши values подцепились:
helm template .

САМОСТОЯТЕЛЬНАЯ РАБОТА:

  • Затемплейтировать по аналогии в Deployment значение поля containerPort: 80

Стандартизируем наш чарт

  1. Заменяем все лейблы в 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 }}

  1. Для проверки используем ту же команду, но с доп ключом:
helm template . --name-template foobar
  1. Указываем количество реплик по-умолчанию:
{{ .Values.replicas | default 2 }}
  1. Проверяем изменения, а также пробуем переназначить тэг образа через ключ --set:
helm template . --name-template foobar --set image.tag=1.13

Добавляем в наш Deployment requests/limits

  1. Добавляем в values.yaml реквесты и лимиты, прям в их обычном формате:
resources:
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 80m
    memory: 64Mi
  1. В нашем темплейтированном манифесте говорим, чтобы за ресурсами он сходил в values.yaml и взял оттуда секцию целиком:
        ports:
        - containerPort: {{ .Values.service.internalPort }}
        resources:    <--- вставляем в это место
{{ toYaml .Values.resources }}

  1. Проверяем изменения
helm template . --name-template foobar
  1. Видим что не хватает отступов. Добавляем indent в наш Deployment:
было

{{ toYaml .Values.resources }}

стало

{{ toYaml .Values.resources | indent 10 }}
  1. Проверяем исправилось ли
helm template . --name-template foobar

САМОСТОЯТЕЛЬНАЯ РАБОТА:

  • Добавить таким же образом annotations
  • Поиграйтесь с indent'ом. Сделайте так, чтобы при рендеринге показывались верные отступы
  • В values.yaml укажите значение аннотации abc: xyz
  1. Добавляем условие в аннотации:
было

  annotations:
{{ toYaml .Values.annotations | indent 4 }}

стало

{{ if .Values.annotations }}
  annotations:
{{ toYaml .Values.annotations | indent 4 }}
{{ end }}

  1. Смущают пустые строчки. Уберем их
было

{{ if .Values.annotations }}
  annotations:
{{ toYaml .Values.annotations | indent 4 }}
{{ end }}

стало

{{- if .Values.annotations }}
  annotations:
{{ toYaml .Values.annotations | indent 4 }}
{{- end }}

  1. Проверяем что теперь все ОК
helm template . --name-template foobar

Добавляем указание переменных окружения

  1. Вносим в наш темплейтированный манифест следующее:
        - containerPort: {{ .Values.port }}
{{ if .Values.env }}    <--- Сюда вставляем
        env:
        {{ range $key, $val := .Values.env }}
        - name: {{ $key | quote }}
          value: {{ $val | quote }}
        {{ end }}
{{ end }}

  1. Проверяем что ничего не сломали
helm template . --name-template foobar
  1. Добавляем в values.yaml переменные окружения:
env:
  one: two
  ENV: DEVELOPMENT
  1. Проверяем что переменные подтянулись
helm template . --name-template foobar

ДОМАШНЯЯ РАБОТА:

  • Перейти в папку homework
  • Запустить deployment из файла bad_deployment.yaml
  • Исправить все найденные ошибки и сделать так, чтобы все pod'ы были в состоянии Running 1/1

Ответ-шпаргалка находится в файле bad_deployment.yaml_otvet

Helm Tests

  1. Переходим в каталог ~/slurm/practice/13.templating/wordpress, осматриваем чарт. Смотрим папку tests и манифест там
cd ~/slurm/practice/13.templating/wordpress
ls
cd templates/tests/
ls
cat test-mariadb-connection.yaml
  1. Устанавливаем чарт Wordpress в свой кластер и запускаем тесты:
helm install wordpress ~/slurm/practice/13.templating/wordpress/
helm test wordpress
  1. Видим что все работает и тест прошел успешно. Удаляем чарт из кластера, однако замечаем что pod с тестом остается:
helm delete wordpress
kubectl get po
  1. Удалим этот оставшийся pod. Затем модернизируем наши тесты, добавив туда аннотацию "helm.sh/hook-delete-policy": hook-succeeded
kubectl delete po <имя_пода>

cd ~/slurm/practice/13.templating
vim wordpress/templates/tests/test-mariadb-connection.yaml
...
annotations: 
  "helm.sh/hook-delete-policy": hook-succeeded`  <-- Добавляем аннотацию
  "helm.sh/hook": test-succeded
...
  1. Снова ставим чарт и делаем тест:
helm install wordpress ~/slurm/practice/13.templating/wordpress/
helm test wordpress
  1. Видим, что теперь 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
  1. Выполним тест, указав таймаут, чтобы не ждать ошибки от самого pod'а. Смотрим статус теста и pod'а:
helm test wordpress --timeout 30s
kubectl get po
  1. Удаляем чарт
helm delete wordpress

Helm Library Chart

  1. Смотрим на чарты в каталогах libchart/ и mychart/

  2. Проверяем как подключается библиотечный чарт с шаблоном 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