복구 테스트 중 3008-bingbingsubway 앱이 정상 기동하지 않음.
ArgoCD Application은 만들어졌고 sync도 진행됐는데 Pod 쪽에서 이미지 pull 문제가 발생함.
상태 확인.
# 3008-bingbingsubway namespace의 Pod 상태를 확인한다.
kubectl -n 3008-bingbingsubway get pods -o wide
Pod 이벤트 확인.
# 이미지 pull 실패 원인을 확인한다.
kubectl -n 3008-bingbingsubway describe pod <pod-name>
증상은 private registry에서 이미지를 받지 못하는 쪽.
처음에는 Registry 자체 문제처럼 보일 수 있지만, 원인을 나눠서 봐야 함.
ImagePullBackOff
├─ DNS 문제
│ registry.yeonghoon.kim이 잘못된 IP로 해석
│
├─ Registry endpoint 문제
│ Registry가 응답하지 않음
│
├─ 인증 문제
│ gitlab-registry-secret 누락 또는 참조 누락
│
└─ 이미지 문제
image name/tag 오타 또는 이미지 없음
이 경우에는 chart의 imagePullSecrets 기본값이 비어 있었음.
그래서 Pod가 private registry에 인증 없이 anonymous pull을 시도했고, 403 Forbidden이 발생함.
Registry Secret이 namespace에 있어도 Deployment나 ServiceAccount가 그 Secret을 참조하지 않으면 소용없음.
Secret 존재 확인.
# registry pull Secret이 namespace에 있는지 확인한다.
kubectl -n 3008-bingbingsubway get secret gitlab-registry-secret
Deployment에서 imagePullSecrets 참조 확인.
# Deployment가 imagePullSecrets를 참조하는지 확인한다.
kubectl -n 3008-bingbingsubway get deployment <deployment-name> \
-o yaml | grep -nA5 "imagePullSecrets"
Helm values에 registry pull secret 참조 추가.
imagePullSecrets:
- name: gitlab-registry-secret
임시로는 patch로 살릴 수 있음.
# Deployment에 imagePullSecrets를 임시로 추가한다.
kubectl -n 3008-bingbingsubway patch deployment <deployment-name> \
--type='merge' \
-p '{"spec":{"template":{"spec":{"imagePullSecrets":[{"name":"gitlab-registry-secret"}]}}}}'
하지만 임시 patch만 하면 Git 기준 상태에는 남지 않음.
ArgoCD 환경에서는 Git에 반영해야 함.
그래서 서비스 repo의 Helm values에 gitlab-registry-secret 참조를 영구 반영함.
커밋.
558a474 Configure registry pull secret for Kubernetes deploy
반영 후 확인.
# Pod가 정상적으로 이미지를 받는지 확인한다.
kubectl -n 3008-bingbingsubway get pods -o wide
# Application 상태를 확인한다.
kubectl -n argocd get application 3008-bingbingsubway \
-o custom-columns=NAME:.metadata.name,SYNC:.status.sync.status,HEALTH:.status.health.status
정리.
ImagePullBackOff가 보이면 바로 Registry 장애로 단정하지 않음.
DNS, Registry endpoint, Secret 존재, workload의 imagePullSecrets 참조, 이미지 이름/tag를 나눠서 확인해야 함.
이번 문제는 Registry가 아니라 Helm chart에서 imagePullSecrets 참조가 빠진 문제였음.