Имеется токен аутентификации для 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
andsecrets.prod.yaml
.
Т.е. скрипт (а весь плагин это по сути набор bash-скриптов, см. Helm: helm-secrets — шифрование sensitive данных с AWS KMS и деплой из Jenkins) учитывает файл исключительно с точкой после слова secrets.
Переименовываем файл в secrets.dev.yaml
— и всё работает.