diff --git a/.claude/deploy-test-procedure.md b/.claude/deploy-test-procedure.md index 373d5de..6e68573 100644 --- a/.claude/deploy-test-procedure.md +++ b/.claude/deploy-test-procedure.md @@ -90,3 +90,30 @@ APP_POD_SELECTOR="" \ dip-catalog 에 아직 없다). 통과 항목만 쓰지 말고 발견된 문제와 미검증 항목을 반드시 남긴다. 6. 정리한다. 정리 명령은 문서에 함께 기록한다. + +## 같은 날 재빌드했다면 — `imagePullPolicy` 를 수동으로 건다 + +자체 빌드 태그에는 빌드일이 들어간다(`1.30.0-security-hardened-20260820`). **같은 날 두 번 +빌드하면 태그가 겹치고**, 노드가 캐시한 옛 digest 가 그대로 쓰여(`IfNotPresent`) 고친 것이 +반영되지 않은 채 "안 고쳐졌다" 로 보인다. 검증에서 이것을 실제로 밟았다. + +검증 대상 워크로드에만 걸고, digest 로 실제 이미지를 확인한다. + +``` sh +kubectl set image ... # 태그가 같으므로 이미지 교체로는 아무 일도 일어나지 않는다 +kubectl patch deployment -n --type=strategic -p \ + '{"spec":{"template":{"spec":{"containers":[{"name":"","imagePullPolicy":"Always"}]}}}}' +kubectl rollout restart deployment/ -n + +# 태그가 아니라 digest 를 본다 — 태그는 같으므로 아무것도 증명하지 못한다 +kubectl get pod -n -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 로 참조하는 방안은 채택하지 않았다. 태그가 "무엇을 검증했는지의 기록" 이라는 +성격을 유지한다. diff --git a/.claude/skills/self-build-image/SKILL.md b/.claude/skills/self-build-image/SKILL.md index 5efea32..ea73731 100644 --- a/.claude/skills/self-build-image/SKILL.md +++ b/.claude/skills/self-build-image/SKILL.md @@ -97,8 +97,9 @@ python3 scripts/build/check-rebuild-needed.py --reports [--apply `python3 scripts/build/check-rebuild-needed.py --reports [--image ] [--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 에는 넣지 않는다**(같은 문서에 이유). ## 마무리 diff --git a/MEMORY.md b/MEMORY.md index 8b21278..7d2ab49 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -46,9 +46,6 @@ ## 아직 이슈로 만들지 않은 것 -- **`imagePullPolicy: Always` 를 values 에 적용하지 않았다** — 결정은 - [#31](https://github.com/paasup/dip-catalog/issues/31) 에 남기고 닫았지만 반영은 안 됐다. - 대상 7곳, `apisix/2.16.0` 은 명시적 `IfNotPresent` 라 뒤집어야 한다. - **`argo-cd/7.8.11` 삭제 여부** — 카탈로그 차단 CVE 239건이 전부 이 동결 버전 몫이고, 지우면 게이트가 PASS 로 떨어진다. 직전 버전을 없애는 결정이라 PR #28 에서 보류했다. - **자체 빌드 이미지의 정식 반영 경로** — argocd 는 로컬에서 빌드·push 했다. CI