Helm: secrets плагин не дешифрует данные

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

Имеется токен аутентификации для Gitlab, используя который Kubernetes должен вытянуть образы из приватного Docker registry в Gitlab.

Однако, поды остаются в статусе ErrImagePull, а в events записывается событие об ошибке логина в Gitab:

Warning Failed 7m37s (x4 over 8m57s) kubelet, ip-10-3-47-58.us-east-2.compute.internal Failed to pull image «registry.gitlab.com/[…]:178662158»: rpc error: code = Unknown desc = Error response from daemon: Get https://registry.gitlab.com[…]/manifests/178662158: unauthorized: HTTP Basic: Access denied

Проверим что именно у нас сохранено в Kubernetes Secrets:

kubectl get secret gitlab-secret -o yaml
apiVersion: v1
data:
.dockerconfigjson: eyJ...X19
kind: Secret
...

Тут в gitlab-secret хранится .dockerconfigjson, который используется в деплойменте:

kubectl get deploy -o yaml
apiVersion: v1
items:
- apiVersion: extensions/v1beta1
kind: Deployment
...
imagePullSecrets:
- name: gitlab-secret
...

Строка для .dockerconfigjson хранится в base64 — «eyJ…X19″, прочитаем содержимое:

echo eyJ...X19 | base64 -d
{"auths": {"registry.gitlab.com": {"auth": "aGV...cl0="}}}

Внутри ещё одна строка в base64«aGV…cl0=», читаем её:

echo aGV...cl0= | base64 -d
helm-eat:ENC[AES256_GCM,data:xO/ctJ...DxI=,tag:4Nn...kiA==,type:str]

Тут helm-eat — логин в Gitlab, а вместо ENC[AES256_GCM,data:[…],type:str] должен быть токен/пароль, но вместо этого мы видим сырые данные из файла с секретами:

cat secrets_dev.yaml
image:
password: ENC[AES256_GCM,data:[...],type:str]
...

Проверяем как выполняется установка чарта:

helm secrets upgrade --install --atomic eat-backend . -f secrets_dev.yaml --debug

Тут через -f secrets_dev.yaml указывается файл с секретами, но есть подводный камень от разработчиков плагина — читаем документацию:

 By convention, files containing secrets are named secrets.yaml, or anything beginning with «secrets.» and ending with «.yaml». E.g. secrets.test.yaml and secrets.prod.yaml.

Т.е. скрипт (а весь плагин это по сути набор bash-скриптов, см. Helm: helm-secrets — шифрование sensitive данных с AWS KMS и деплой из Jenkins) учитывает файл исключительно с точкой после слова secrets.

Переименовываем файл в secrets.dev.yaml — и всё работает.