Helm: dependencies aka subcharts – обзор и пример

Автор: | 14/08/2020

Имеется Helm chart, который запускает API-бекенд нашего приложения, для работы которого требуется memcached.

Что бы не создавать отдельный деплоймент и не добавлять в Jenkins вторую джобу с helm install – добавим memcached как dependency для нашего чарта: тогда при установке самого приложения, Helm загрузит архив с чартом memcached, и установит его вместе с чартом нашего приложения.

Сейчас структура каталогов нашего чарта выглядит так:

[simterm]

$ tree .
.
├── charts
├── Chart.yaml
├── secrets.yaml
├── templates
│   ├── eat-backend-deployment.yaml
...
│   ├── eat-backend-ingress.yaml
│   └── _helpers.tpl
└── values.yaml

[/simterm]

При установке зависимостей – они попадут в каталог charts, который сейчас пустой.

Учитывайте, что:

  1. сабчарты являются независимыми от родительского чарта, и не могут зависеть от него
  2. по этой причине сабчарт не может получить доступ к родительским values
  3. но родитель может переопределить значения values для сабчарта
  4. однако, у Helm имеются global values, к которым есть доступ у всех чартов

Документация – Charts, Subcharts and Global Values, Subcharts and Global Values.

Helm repo

Документация – Helm Repo.

Сначала найдём в Helm-репозитория чарт с memcached, который можно использовать.

По-умолчанию после установки Helm никаких репозиториев не добавляет:

[simterm]

$ helm repo list
Error: no repositories to show

[/simterm]

Доабвляем с именем Google-репозиторий, сохраняем с именем stable:

[simterm]

$ helm repo add stable https://kubernetes-charts.storage.googleapis.com
"stable" has been added to your repositories

[/simterm]

Проверям:

[simterm]

$ helm repo list
NAME            URL                                              
stable          https://kubernetes-charts.storage.googleapis.com/

[/simterm]

Ищем memcached:

[simterm]

$ helm search repo memcached
NAME                    CHART VERSION   APP VERSION     DESCRIPTION                                       
stable/memcached        3.2.3           1.5.20          Free & open source, high-performance, distribut...
stable/mcrouter         1.0.3           0.36.0          Mcrouter is a memcached protocol router for sca...

[/simterm]

Есть memcached версии 3.2.3 в репозитории stable – используем его.

Helm dependency

Документация – Dependencies.

Для описания зависимостей используем dependencies в корневом Chart.yaml:

dependencies:
- name: memcached
  version: ~3.2.3
  repository: "@stable"

Тут:

  • name: имя пакета
  • version: версия для установки, рекомендуется использовать ~ (range), в данном случае 3.2.3 значит установку версии выше 3.2.3 и ниже 3.3.0.
  • repository: полный адрес в виде URL (https://kubernetes-charts.storage.googleapis.com), файла (file://../dependency_chart/nginx), или алиас (@stable)

Ошибка “found in Chart.yaml, but missing in charts/ directory”

Зависимость мы описали, но если запустить установку приложения сейчас – то получим ошибку:

[simterm]

$ helm secrets upgrade --install --namespace eks-dev-1-eat-backend-ns --atomic eat-backend . -f secrets.yaml --debug --dry-run
history.go:52: [debug] getting history for release eat-backend
Error: found in Chart.yaml, but missing in charts/ directory: memcached
helm.go:84: [debug] found in Chart.yaml, but missing in charts/ directory: memcached

[/simterm]

Обновляем списки пакетов в репозиториях, и устанавливаем архив сабчарта в каталог charts/:

[simterm]

$ helm dependency update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈
Saving 1 charts
Downloading memcached from repo https://kubernetes-charts.storage.googleapis.com/
Deleting outdated charts

[/simterm]

Проверяем:

[simterm]

$ tree .
.
├── Chart.lock
├── charts
│   └── memcached-3.2.3.tgz
├── Chart.yaml
├── secrets.yaml
├── templates
│   ├── eat-backend-deployment.yaml
..

[/simterm]

В каталоге charts появился архив memcached-3.2.3.tgz .

Запускаем установку своего чарта повторно:

[simterm]

$ helm secrets upgrade --install --namespace eks-dev-1-eat-backend-ns --atomic eat-backend . -f secrets.yaml --debug --dry-run
history.go:52: [debug] getting history for release eat-backend
upgrade.go:121: [debug] preparing upgrade for eat-backend
upgrade.go:129: [debug] performing update for eat-backend
upgrade.go:299: [debug] dry run for eat-backend
Release "eat-backend" has been upgraded. Happy Helming!
...

[/simterm]

Проверяем поды:

[simterm]

$ kubectl -n eks-dev-1-eat-backend-ns get pod
NAME                                   READY   STATUS    RESTARTS   AGE
eat-backend-596d77bdc5-cz5g2   1/1     Running   0          28s
eat-backend-596d77bdc5-j7nmv   1/1     Running   0          88m
eat-backend-memcached-0        1/1     Running   0          43s
eat-backend-memcached-1        1/1     Running   0          29s
eat-backend-memcached-2        1/1     Running   0          16s

[/simterm]

Поды с memcached появились, отлично.

Subcharts values

Но мне не надо 3 пода – пока хватит и одного.

Смотрим файл values.yaml нашего сабчарта, находим параметры replicaCount и pdbMinAvailable – их нам и надо переопределить, что бы вместо дефолтного значения в 3 пода задать 1.

В родительском values.yam добавляем параметры для сабчарта:

...
memcached:
  replicaCount: 1
  pdbMinAvailable: 1

Передеплоиваем, проверяем:

[simterm]

$ kubectl -n eks-dev-1-eat-backend-ns get pod
NAME                                   READY   STATUS        RESTARTS   AGE
eat-backend-596d77bdc5-646kz   1/1     Running       0          14s
eat-backend-596d77bdc5-j7nmv   1/1     Running       0          96m
eat-backend-memcached-0        1/1     Running       0          8m34s
eat-backend-memcached-1        0/1     Terminating   0          8m20s

[/simterm]

Остаётся один под.

Проверим коннект и вообще работу memcached – находим его Service:

[simterm]

$ kubectl -n eks-dev-1-eat-backend-ns get svc
NAME                            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
eat-backend-memcached   ClusterIP   None            <none>        11211/TCP      9m28s
eat-backend-svc         NodePort    172.20.49.118   <none>        80:30442/TCP   7d1h

[/simterm]

(см. Headless services)

И выполняем запрос из пода с нашим приложением к мемкешу:

[simterm]

$ kubectl -n eks-dev-1-eat-backend-ns exec -ti eat-backend-596d77bdc5-646kz bash
bash-4.4# echo stats | nc eat-backend-memcached.eks-dev-1-eat-backend-ns.svc.cluster.local 11211
STAT pid 1
STAT uptime 1025
STAT time 1597331688
STAT version 1.5.20
...

[/simterm]

Также, имеет смысл в .gitignore добавить charts/ и Chart.lock, что бы не пушнуть их обратно в репозиторий.