GitLab Registry 인증에 쓰던 PAT 문제로 Kubernetes Pod가 이미지를 받지 못하는 상황이 생김.
증상은 ImagePullBackOff.
처음에는 Registry나 네트워크 문제처럼 보일 수 있지만, 실제로는 registry pull Secret에 들어 있던 인증 정보가 더 이상 유효하지 않은 상태였음.
Pod 상태 확인.
# Pod 상태를 확인한다.
kubectl get pods -A
문제 namespace에서 이벤트 확인.
# 이미지 pull 실패 이벤트를 확인한다.
kubectl -n <namespace> describe pod <pod-name>
확인할 것.
ImagePullBackOff
ErrImagePull
403 Forbidden
authentication required
denied
unauthorized
Registry Secret 확인.
# registry pull Secret이 존재하는지 확인한다.
kubectl -n <namespace> get secret gitlab-registry-secret
Secret이 존재해도 인증 정보가 만료되었거나 해지되었으면 image pull은 실패함.
이 경우 Secret 존재 여부만 보면 안 되고, 실제 인증 정보가 유효한지 봐야 함.
새 GitLab PAT 발급 후 registry Secret을 다시 생성.
# 새 GitLab PAT 기준으로 registry pull Secret을 다시 만든다.
kubectl -n <namespace> create secret docker-registry gitlab-registry-secret \
--docker-server=registry.yeonghoon.kim \
--docker-username=<gitlab-username> \
--docker-password=<new-pat> \
--docker-email=<email> \
--dry-run=client -o yaml | kubectl replace -f -
SOPS로 관리하는 경우에는 평문 Secret을 그대로 남기지 않고 encrypted manifest로 갱신.
# SOPS로 암호화된 registry pull Secret을 복호화해서 반영한다.
SOPS_AGE_KEY_FILE=/home/ioniere/.config/sops/age/dgx-sops-poc-daily.agekey \
sops -d secrets/<namespace>/gitlab-registry-secret.enc.yaml | \
kubectl replace -f -
반영 후 Pod 재시작.
# 이미지 pull을 다시 시도하도록 Deployment를 재시작한다.
kubectl -n <namespace> rollout restart deployment/<deployment-name>
상태 확인.
# Pod가 정상적으로 이미지를 받는지 확인한다.
kubectl -n <namespace> get pods -o wide
ArgoCD 상태 확인.
# ArgoCD Application 상태를 확인한다.
kubectl -n argocd get app
정리.
ImagePullBackOff가 보인다고 바로 Registry 장애로 보면 안 됨.
이번 경우는 Registry endpoint 문제가 아니라 GitLab Registry 인증에 쓰던 PAT가 만료/해지되어 pull Secret이 더 이상 유효하지 않은 문제였음.
이후 registry pull Secret은 SOPS 관리 대상으로 두고, PAT 교체 시 Secret 갱신과 Pod 재시작까지 같이 확인하는 기준으로 정리.