sas-cas-operator 와 sas-cas-control 은 떠 있는데 sas-cas-server-default-controller 파드가 아예 만들어지지 않는다. kubectl get pods | grep cas 에 컨트롤러가 보이지 않고, CAS 에 붙는 모든 기능이 멈춘다.
CAS 서버 파드는 배포가 직접 만드는 것이 아니라 cas-operator 가 CASDeployment 커스텀 리소스를 reconcile 하면서 생성한다. 따라서 파드가 없다는 것은 셋 중 하나다.
kubectl -n <ns> get pods | grep cas
kubectl -n <ns> get casdeployment
kubectl -n <ns> get events --sort-by=.lastTimestamp | tail -40
kubectl -n <ns> describe pod -l app=sas-cas-operator | grep -iE 'Last State|Reason|Exit Code|OOM'
kubectl -n <ns> logs deploy/sas-cas-operator --tail=200
Reason: OOMKilled 가 보이면 그것이 직접 원인이다. operator 가 계속 죽으면 reconcile 이 중단되어 컨트롤러가 만들어지지 않는다.
당장은 메모리 한도를 올려 살린다.
kubectl -n <ns> patch deployment sas-cas-operator -p '{
"spec":{"template":{"spec":{"containers":[{
"name":"sas-cas-operator",
"resources":{"requests":{"cpu":"200m","memory":"512Mi"},
"limits":{"cpu":"1","memory":"2Gi"}}}]}}}}'
kubectl -n <ns> rollout status deploy/sas-cas-operator
kustomize 로 운영한다면 이 패치는 응급 조치로만 쓰고 site-config 오버레이에 같은 내용을 넣어 영구 반영한다.
한도를 올리는 것으로 끝내지 않는다. operator 는 스펙 오류나 볼륨 바인딩 실패가 있으면 reconcile 을 끝없이 되풀이하며 메모리를 밀어 올린다. OOM 은 결과이지 원인이 아닌 경우가 많다. 아래 항목을 함께 확인한다.
kubectl -n <ns> describe casdeployment default
Invalid value: "" not a valid selector operator 처럼 유효성 메시지가 보이면 오버레이가 넣은 어피니티나 노드 선택자에 빈 키 · 빈 연산자가 들어간 것이다. 문제가 되는 항목을 오버레이에서 고쳐 다시 적용하거나, 응급으로는 해당 경로를 제거한다.
kubectl -n <ns> patch casdeployment default --type=json \
-p='[{"op":"remove","path":"/spec/controller/podTemplate/spec/affinity"}]'
컨트롤러 파드가 Pending 이나 ContainerCreating 에서 멈춰 있다면 대개 PVC 다.
kubectl -n <ns> get pvc | grep -E 'cas|nfs|efs'
kubectl -n <ns> describe pvc <cas 관련 pvc>
Pending 이면 StorageClass 이름이 틀렸거나 요청한 접근 모드를 제공자가 지원하지 않는 경우다. cas-default-data · cas-default-permstore 가 묶이지 않으면 컨트롤러는 기동 자체를 못 한다.
kubectl -n <ns> describe pod sas-cas-server-default-controller
kubectl -n <ns> logs sas-cas-server-default-controller
kubectl -n <ns> logs deploy/sas-cas-control --tail=200
라이선스, 볼륨 마운트, 포트 바인딩, 준비성 검사 실패가 여기서 드러난다.
원인을 고친 뒤에도 operator 가 즉시 움직이지 않으면 애노테이션을 바꿔 강제로 재조정한다.
kubectl -n <ns> annotate casdeployment default reconcilestamp="$(date +%s)" --overwrite
실패한 흔적이 남아 있으면 지우고 다시 만들게 한다.
kubectl -n <ns> delete pod -l app.kubernetes.io/name=sas-cas-server-default-controller --ignore-not-found
원본 기록은 여기서 끝나며, 이 환경에서 컨트롤러가 정상적으로 올라온 것을 확인하지 못했다. 다음이 남아 있다.
kubectl get events -A 에서 같은 시각의 거부 사유(쿼터, 어드미션 웹훅, PodSecurity)를 확인해야 한다.