pull secret을 디코딩하는 방법
- 다음 중 하나를 입력란에 붙여넣으세요.
kubectl get secret regcred -o yaml출력.dockerconfigjson의 Base64 값만- JSON 자체, 예를 들어
~/.docker/config.json
- 레지스트리 자격 증명이 맨 먼저 나옵니다. 레지스트리, 사용자 이름, 비밀번호, 그리고 사용자 이름과 비밀번호로 나눈
auth값입니다. - 반대로 Secret을 만들려면 pull secret 생성을 열고 레지스트리, 사용자 이름, 비밀번호, 필요하면 이메일 (선택 사항) 칸도 채우세요. 결과는
kubectl create secret docker-registry가 만드는 Secret과 같습니다.
pull secret 속 이중 Base64
pull secret은 Base64 안에 Base64를 감싸고 있어서 손으로 디코딩하려면 두 단계가 필요합니다.
apiVersion: v1
kind: Secret
metadata:
name: regcred
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: eyJhdXRocyI6eyJyZWdpc3RyeS5leGFtcGxlLmNvbSI6eyJ1c2VybmFtZSI6ImNpLWJvdCIsInBhc3N3b3JkIjoicHVsbC1vbmx5LXRva2VuIiwiYXV0aCI6Ilkya3RZbTkwT25CMWJHd3RiMjVzZVMxMGIydGxiZz09In19fQ==
첫 번째 층인 Secret 값은 Docker 설정 JSON으로 디코딩됩니다.
{"auths":{"registry.example.com":{"username":"ci-bot","password":"pull-only-token","auth":"Y2ktYm90OnB1bGwtb25seS10b2tlbg=="}}}
두 번째 층인 auth는 ci-bot:pull-only-token으로 디코딩됩니다. kubectl create secret docker-registry로 만든 .dockerconfigjson 값은 {"auths":의 Base64인 eyJhdXRocyI6로 시작하므로 로그와 매니페스트에서 쉽게 알아볼 수 있습니다.
만날 수 있는 형식
| 형태 | 출처 |
|---|---|
{"auths": {"host": {...}}} | .dockerconfigjson, 현재의 ~/.docker/config.json |
{"host": {"auth": "...", "email": "..."}} | 레거시 .dockercfg Secret(kubernetes.io/dockercfg) |
호스트가 "https://index.docker.io/v1/" | Docker Hub |
비밀번호 대신 identitytoken | docker login 후 OAuth 리프레시 토큰을 발급하는 레지스트리 |
두 Secret 유형 모두 여기서 디코딩됩니다. 레거시 .dockercfg에는 auths 래퍼가 없으므로, 한 형식에 맞춰 작성한 스크립트는 다른 형식에서 조용히 아무것도 찾지 못합니다.
셸에서 디코딩하기
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는 Pod와 같은 네임스페이스의 Secret만 찾습니다. - 만료된 토큰. 일부 레지스트리는 수명이 짧은 비밀번호를 발급합니다. 예를 들어 Amazon ECR 토큰은 12시간 동안 유효합니다. 그러면 어제 작동하던 Secret이 오늘은
ImagePullBackOff를 냅니다. - 손으로 만든 JSON. 끝에 줄 바꿈이나 공백이 딸려 복사된 비밀번호, 잘못된 문자열로 인코딩한
auth값은 조용히 실패합니다. 디코딩한auth를 사용자 이름, 비밀번호 필드와 비교하거나kubectl create secret docker-registry로 Secret을 다시 만드세요.
Base64는 아무것도 숨기지 않으므로 Secret을 읽을 수 있는 사람은 누구나 그 계정을 쓸 수 있습니다. pull secret에는 읽기 전용 레지스트리 토큰을 쓰세요.
자주 묻는 질문
imagePullSecret은 어떻게 디코딩하나요?
위에 kubectl get secret regcred -o yaml의 출력을 붙여넣으세요. 셸에서는 kubectl get secret regcred -o jsonpath='{.data.\.dockerconfigjson}' | base64 --decode가 JSON을 출력하며, 그 안의 auth 필드가 한 번 더 Base64로 되어 있습니다.
config.json의 auth 필드는 무엇인가요?
username:password를 Base64로 나타낸 것으로, HTTP Basic Authorization 헤더와 같은 형식입니다. Y2ktYm90OnB1bGwtb25seS10b2tlbg==는 ci-bot:pull-only-token으로 디코딩됩니다.
~/.docker/config.json의 auths 항목이 비어 있는 이유는 무엇인가요?
credsStore나 credHelpers가 설정되어 있으면 Docker는 시스템 키체인 같은 자격 증명 도우미에 비밀번호를 저장합니다. 그러면 파일에는 레지스트리마다 {}만 남아 디코딩할 것이 없습니다.