Как декодировать pull secret
- Вставьте в поле ввода одно из трёх:
- вывод
kubectl get secret regcred -o yaml - только значение
.dockerconfigjsonв Base64 - сам JSON, например ваш
~/.docker/config.json
- вывод
- Первыми идут учётные данные реестров: реестр, имя пользователя, пароль и значение
auth, разобранное на пользователя и пароль. - Чтобы, наоборот, создать Secret, откройте Собрать pull secret и заполните Реестр, Имя пользователя, Пароль и при желании Email. Получится тот же Secret, что и у
kubectl create secret docker-registry.
Двойной Base64 внутри pull secret
Pull secret заворачивает Base64 внутрь Base64, поэтому вручную его декодируют в два шага.
apiVersion: v1
kind: Secret
metadata:
name: regcred
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: eyJhdXRocyI6eyJyZWdpc3RyeS5leGFtcGxlLmNvbSI6eyJ1c2VybmFtZSI6ImNpLWJvdCIsInBhc3N3b3JkIjoicHVsbC1vbmx5LXRva2VuIiwiYXV0aCI6Ilkya3RZbTkwT25CMWJHd3RiMjVzZVMxMGIydGxiZz09In19fQ==
Первый слой, значение Secret, декодируется в JSON конфига Docker:
{"auths":{"registry.example.com":{"username":"ci-bot","password":"pull-only-token","auth":"Y2ktYm90OnB1bGwtb25seS10b2tlbg=="}}}
Второй слой, auth, декодируется в ci-bot:pull-only-token. Значение .dockerconfigjson, созданное командой kubectl create secret docker-registry, начинается с eyJhdXRocyI6 (Base64 от {"auths":), поэтому такие строки легко заметить в логах и манифестах.
Форматы, которые могут встретиться
| Вид | Откуда |
|---|---|
{"auths": {"host": {...}}} | .dockerconfigjson, современный ~/.docker/config.json |
{"host": {"auth": "...", "email": "..."}} | устаревшие Secret типа .dockercfg (kubernetes.io/dockercfg) |
"https://index.docker.io/v1/" в качестве хоста | Docker Hub |
identitytoken вместо пароля | реестры, которые после docker login выдают OAuth refresh-токены |
Здесь декодируются оба типа Secret. В устаревшем .dockercfg нет обёртки auths, так что скрипт, написанный под один формат, в другом молча ничего не найдёт.
Декодирование в shell
kubectl get secret regcred -o jsonpath='{.data.\.dockerconfigjson}' | base64 --decode | jq .
kubectl get secret regcred -o jsonpath='{.data.\.dockerconfigjson}' | base64 --decode \
| jq -r '.auths | to_entries[] | "\(.key) \(.value.auth | @base64d)"'
Вторая команда выводит по строке registry user:password на каждый реестр. Значение auth имеет тот же формат, что и заголовок Basic Auth, так что его прочитает и декодер Basic Auth.
Почему pull secret не работает
- Не тот ключ реестра. Хост в
authsдолжен совпадать со ссылкой на образ: дляghcr.io/org/appнуженghcr.io, а образам с Docker Hub нужен ключhttps://index.docker.io/v1/. - Secret в другом пространстве имён.
imagePullSecretsнаходит Secret только в пространстве имён самого пода. - Истёкший токен. Некоторые реестры выдают короткоживущие пароли; токены Amazon ECR, например, действуют 12 часов. Secret, который работал вчера, сегодня даёт
ImagePullBackOff. - JSON, собранный вручную. Пароль, скопированный с переводом строки или пробелом в конце, или значение
auth, закодированное не из той строки, ломаются молча. Сравните декодированныйauthс полями имени пользователя и пароля или пересоздайте Secret черезkubectl create secret docker-registry.
Любой, кто может прочитать Secret, может воспользоваться учётной записью: Base64 ничего не скрывает. Давайте pull secret только токены реестра с правами на чтение.
Вопросы и ответы
Как декодировать imagePullSecret?
Вставьте в поле выше вывод kubectl get secret regcred -o yaml. В shell kubectl get secret regcred -o jsonpath='{.data.\.dockerconfigjson}' | base64 --decode выводит JSON, а в его поле auth лежит ещё один слой Base64.
Что за поле auth в config.json?
В нём лежит username:password в Base64, в том же формате, что у HTTP-заголовка Basic Authorization. Y2ktYm90OnB1bGwtb25seS10b2tlbg== декодируется в ci-bot:pull-only-token.
Почему запись в auths моего ~/.docker/config.json пустая?
Если задан credsStore или credHelpers, Docker хранит пароль в хранилище учётных данных, например в системной связке ключей. Тогда в файле для каждого реестра только {}, и декодировать нечего.