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

Автор: | 18/08/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:

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

Тут через -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 – и всё работает.