Имеется 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
, который сейчас пустой.
Учитывайте, что:
- сабчарты являются независимыми от родительского чарта, и не могут зависеть от него
- по этой причине сабчарт не может получить доступ к родительским values
- но родитель может переопределить значения values для сабчарта
- однако, у 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
, что бы не пушнуть их обратно в репозиторий.