imagePullPolicy: Always 는 검증 시점 수동 조치다 — 카탈로그 values 가 아니다

#31 코멘트에 "자체 빌드 이미지를 쓰는 차트 7곳을 Always 로 바꿔야 한다" 고 적었는데
잘못됐다. Always 를 카탈로그 기본값으로 넣으면 파드 시작마다 kubelet 이 레지스트리에서
digest 를 해석하고, 레지스트리 장애·Docker Hub rate limit 이 파드 기동을 막는 경로가
생긴다. 태그 겹침은 같은 날 재빌드한 검증 시점에만 생기는 문제인데 그 대가를 운영 내내
지불하는 셈이다.

절차는 deploy-test-procedure.md 로 옮긴다 — 검증 대상 워크로드에만 patch 로 걸고
digest(imageID)로 확인한다. 태그가 같으므로 태그를 보는 것은 아무것도 증명하지 않는다.

self-build-image SKILL 의 함정 항목은 이 문서를 가리키게 하고 "프레임워크 차원의 미결" 을
지운다 — 미결이 아니라 결정됐다. MEMORY.md 의 "values 반영 안 됨" 항목은 반영할 것이
없으므로 지운다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
wbsong111
2026-08-21 09:30:41 +09:00
parent de3f91f979
commit c3283bf7a9
3 changed files with 30 additions and 5 deletions
+27
View File
@@ -90,3 +90,30 @@ APP_POD_SELECTOR="<DB에 실제로 연결하는 파드의 label selector>" \
dip-catalog 에 아직 없다). 통과 항목만 쓰지 말고 발견된 문제와 미검증 항목을 반드시
남긴다.
6. 정리한다. 정리 명령은 문서에 함께 기록한다.
## 같은 날 재빌드했다면 — `imagePullPolicy` 를 수동으로 건다
자체 빌드 태그에는 빌드일이 들어간다(`1.30.0-security-hardened-20260820`). **같은 날 두 번
빌드하면 태그가 겹치고**, 노드가 캐시한 옛 digest 가 그대로 쓰여(`IfNotPresent`) 고친 것이
반영되지 않은 채 "안 고쳐졌다" 로 보인다. 검증에서 이것을 실제로 밟았다.
검증 대상 워크로드에만 걸고, digest 로 실제 이미지를 확인한다.
``` sh
kubectl set image ... # 태그가 같으므로 이미지 교체로는 아무 일도 일어나지 않는다
kubectl patch deployment <name> -n <ns> --type=strategic -p \
'{"spec":{"template":{"spec":{"containers":[{"name":"<c>","imagePullPolicy":"Always"}]}}}}'
kubectl rollout restart deployment/<name> -n <ns>
# 태그가 아니라 digest 를 본다 — 태그는 같으므로 아무것도 증명하지 못한다
kubectl get pod -n <ns> -o jsonpath='{range .items[*]}{.status.containerStatuses[*].imageID}{"\n"}{end}'
```
**카탈로그 values 에는 넣지 않는다.** `Always` 면 파드 시작마다 kubelet 이 레지스트리에서
digest 를 해석하므로, 레지스트리 장애·Docker Hub rate limit 이 파드 기동을 막는 경로가
생긴다(rate limit 은 이 레포에서 실측된 문제다 — `DOCKERHUB_USER`/`TOKEN` 을 쓰는 이유).
태그 겹침은 **검증 시점에만** 생기는 문제이므로 그 대가를 운영 내내 지불할 이유가 없다.
이것이 [#31](https://github.com/paasup/dip-catalog/issues/31) 의 결정이다 — 태그에 해시를
붙이거나 digest 로 참조하는 방안은 채택하지 않았다. 태그가 "무엇을 검증했는지의 기록" 이라는
성격을 유지한다.
+3 -2
View File
@@ -97,8 +97,9 @@ python3 scripts/build/check-rebuild-needed.py --reports <trivy-reports> [--apply
`python3 scripts/build/check-rebuild-needed.py --reports <trivy-reports> [--image <name>] [--apply]`
- **단, 같은 날 다시 빌드하면 그 태그가 겹친다.** 노드가 캐시한 옛 digest 가 그대로 쓰여
(`imagePullPolicy: IfNotPresent`) 고친 것이 반영되지 않은 채 "안 고쳐졌다" 로 보인다.
배포 검증 중이라면 `imagePullPolicy: Always` 로 우회하고, digest 로 확인한다 —
`kubectl get pod -o jsonpath='{..imageID}'`. 프레임워크 차원의 미결 사항이다.
**검증 대상 워크로드에 `imagePullPolicy: Always` 를 수동으로 걸고 digest 로 확인한다**
절차는 [deploy-test-procedure.md](../../deploy-test-procedure.md) "같은 날 재빌드했다면"
이 단일 출처다. **카탈로그 values 에는 넣지 않는다**(같은 문서에 이유).
## 마무리