Cloudera AI Workbench 에서 사용자가 모델이나 워크플로를 배포하면 사용자 네임스페이스(<workbench>-user-<n>)에 파드가 생기는데, 이 파드가 참조하는 pull 시크릿에 CAI 내장 레지스트리 인증 정보가 빠져 있어 이미지 pull 이 실패하는 경우가 있다. Vault 에 저장된 liftie 클러스터 정보의 dockerConfigs 에 외부 Docker Registry 항목만 등록돼 있고 내장 레지스트리 항목이 없는 것이 원인이다. 배포마다 시크릿이 새로 만들어지므로 한 번 손으로 고쳐도 다음 배포에서 다시 실패한다.
Vault 에 기록된 liftie 클러스터의 dockerConfigs 를 확인한다.
vault kv get -tls-skip-verify kv-cdp-127-0-0-1/cdp/liftie/clusters/liftie-<id>
dockerConfigs 에 외부 레지스트리 항목만 있고 내장 레지스트리가 없으면 그 값이 그대로 시크릿으로 만들어진다. 시크릿 이름에 배포 워크로드명이 포함되어 있으면 배포 건마다 새로 생성되는 구조다.
실제 파드가 참조하는 시크릿에 어떤 레지스트리가 들어 있는지는 다음으로 본다. 비밀번호는 출력하지 않고 키 목록만 확인한다.
kubectl get secret <secret> -n <ns> \
-o jsonpath='{.data.\.dockerconfigjson}' | base64 -d | jq '.auths | keys'
정상 시크릿을 사용자 네임스페이스로 복사한다. 클러스터가 관리하는 메타데이터는 제거해야 적용된다.
SEC=<secret-name>
SRC=<source-ns>
for i in $(seq 1 5); do
DST=<workbench>-user-$i
kubectl get secret $SEC -n $SRC -o json \
| jq 'del(.metadata.namespace, .metadata.uid, .metadata.resourceVersion,
.metadata.creationTimestamp, .metadata.ownerReferences,
.metadata.managedFields, .metadata.generation, .status)' \
| kubectl apply -n $DST -f -
done
복사만으로는 새 파드가 이 시크릿을 쓰지 않는다. ServiceAccount 에 추가해야 하며, 기존 값을 지우지 않도록 병합 방식으로 넣는다.
kubectl get sa default -n $DST -o json \
| jq '.imagePullSecrets = ((.imagePullSecrets // []) + [{"name":"'"$SEC"'"}] | unique)' \
| kubectl apply -f -
확인과 되돌리기는 다음과 같다.
kubectl get secret $SEC -n $DST
kubectl get secret $SEC -n $DST \
-o jsonpath='{.data.\.dockerconfigjson}' | base64 -d | jq '.auths | keys'
kubectl delete secret $SEC -n $DST
기존 liftie 시크릿의 auths 값에 내장 레지스트리 인증 정보를 직접 반영하고 파드를 재기동하면 배포가 정상 완료되는 것까지는 확인됐다.
imagePullSecrets 에 이름만 적어서는 동작하지 않으며 복사가 선행돼야 한다.dockerConfigs 자체가 채워지도록 하는 것이 정식 경로다.uid · resourceVersion · creationTimestamp · ownerReferences · managedFields 를 손으로 지워야 하고 네임스페이스 수만큼 반복해야 해 실수 여지가 크다.dockerConfigs 에 내장 레지스트리 항목이 채워지지 않는 근본 원인과, Cloudera Manager 의 어떤 설정이 이 값의 소스인지는 대화에서 확정하지 못했다. 신규 배포에서도 정상 시크릿이 생성되도록 하는 정식 절차는 벤더 확인이 필요하다.