kustomize build 는 실패해도 조용한 편이다. 오류 없이 끝났는데 결과가 비어 있거나, 경고만 잔뜩 찍히고 그 경고가 출력 파일 안으로 섞여 들어가기도 한다. 원인은 대개 kustomization.yaml 의 구조이지 클러스터가 아니다. 벤더가 배포하는 오버레이(SAS Viya, 각종 오퍼레이터 번들)를 쓸 때 특히 자주 만난다.
kustomize build -o site.yaml 을 돌렸는데 파일이 비었다면 다음을 순서대로 본다.
kustomize build . | wc -l
0 이면 리소스를 하나도 찾지 못한 것이다. 몇 줄뿐이면 대부분을 놓친 것이다.
kustomize 가 인식하는 이름은 kustomization.yaml, kustomization.yml, Kustomization 셋뿐이다. kustomize.yaml 이나 site-kustomization.yaml 은 읽지 않는다.
ls -l | grep -i kustom
resources 경로가 살아 있는지cat kustomization.yaml
ls -ld ../../bases
상대 경로는 kustomization.yaml 이 있는 디렉터리 기준이다. 다른 곳에서 kustomize build <dir> 로 부르면 기준이 헷갈리기 쉽다.
patches 나 patchesStrategicMerge 만 있고 resources 가 비면 적용 대상이 없어 결과가 0 줄이 된다. 패치는 리소스를 만들어 내지 않는다.
구식 필드를 쓰면 kustomize 가 사용 중단 경고를 찍는다.
# Warning: 'vars' is deprecated. Please use 'replacements' instead.
# Warning: 'bases' is deprecated. Please use 'resources' instead.
# Warning: 'commonLabels' is deprecated. Please use 'labels' instead.
# Warning: 'patchesJson6902' is deprecated. Please use 'patches' instead.
경고는 표준 오류로 나가지만, 터미널에서 한데 섞여 보이면 출력 파일이 오염된 것처럼 보인다. 확실히 가르려면 표준 출력만 파일로 받는다.
kustomize build . > site.yaml 2> build.log
현행 이름으로 바꾸는 편이 낫다. 대응은 다음과 같다.
| 구식 | 현행 |
|---|---|
bases |
resources |
commonLabels |
labels |
patchesStrategicMerge, patchesJson6902 |
patches |
vars |
replacements |
kustomize 가 일부를 자동으로 고쳐 준다. 벤더가 배포한 파일에 돌리기 전에는 원본을 백업한다.
kustomize edit fix
bases 는 오래된 API 버전에서만 동작한다. 최신 kustomize 로 넘어오면서 결과가 통째로 비는 가장 흔한 원인이다.
빌드 결과가 정상이어도 클러스터가 받지 않는 경우가 있다. kustomize build 는 클러스터를 보지 않으므로 여기서 걸러지지 않는다.
kubectl apply --dry-run=server -f site.yaml
자주 나오는 거부 사유는 다음과 같다.
baseline 이상으로 강제된 네임스페이스에 hostPath 볼륨이 들어가면 막힌다.storageClassName 이나 Deployment 의 selector 는 바꿀 수 없다. 이런 경우는 지우고 다시 만들어야 한다."처음 적용할 때는 됐는데 볼륨 설정을 바꾼 뒤부터 실패한다" 는 형태면 불변 필드나 웹훅을 의심한다. 빌드 산출물만 붙들고 봐서는 알 수 없고, --dry-run=server 의 메시지를 읽어야 한다.
kustomize version
kustomize build . --enable-alpha-plugins 2>&1 | head -n 40
kubectl kustomize . | head -n 40
kubectl kustomize 는 kubectl 에 내장된 kustomize 를 쓴다. 독립 실행 바이너리와 버전이 다를 수 있어, 한쪽에서만 실패한다면 버전 차이를 먼저 의심한다.
site.yaml 을 손으로 고치면 다음 빌드에서 사라진다. 고칠 것은 언제나 오버레이다.resources(git URL) 를 쓸 수 없다. 필요한 베이스를 미리 내려받아 로컬 경로로 바꾼다.