Killer Shell CKA - Application Misconfigured 2

(Killercoda CKA - Application Misconfigured 2에서 넘어옴)

1 개요[ | ]

Killer Shell CKA - Application Misconfigured 2

2 문제 진단[ | ]

Deployment와 파드 상태를 확인한다.

controlplane:~$ k get deploy
NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
management-frontend  0/3     3            0           8m

controlplane:~$ k get pod
NAME                                  READY   STATUS    RESTARTS   AGE
management-frontend-7c7b9b7b6b-8p2sx  0/1     Pending   0          8m
management-frontend-7c7b9b7b6b-bw4m8  0/1     Pending   0          8m
management-frontend-7c7b9b7b6b-m9jwp  0/1     Pending   0          8m

이벤트를 보면 스케줄링이 되지 않는 원인을 알 수 있다.

controlplane:~$ k describe pod management-frontend-7c7b9b7b6b-8p2sx
...
Events:
  Type     Reason            Age                 From               Message
  ----     ------            ----                ----               -------
  Warning  FailedScheduling  2m (x10 over 8m)    default-scheduler  pod has node name set to "staging-node1", but node does not exist
  Warning  FailedScheduling  2m (x10 over 8m)    default-scheduler  waiting for pod to be scheduled

배포 매니페스트에 특정 노드가 하드코딩되어 있는지 확인한다.

controlplane:~$ k get deploy management-frontend -o yaml | grep -nE 'nodeName|nodeSelector|affinity'

3 문제 원인[ | ]

원본 클러스터의 특정 노드에 고정하기 위해 Deployment 템플릿 spec.template.spec.nodeName 이 설정되어 있다. 현재 클러스터에는 해당 노드가 없으므로 스케줄러가 파드를 어디에도 올리지 못하고 Pending 이 된다.

4 문제 해결[ | ]

nodeName 고정을 제거한다. (다른 노드 고정 수단(nodeSelector, affinity)이 불필요하게 들어있다면 함께 제거/조정한다.)

controlplane:~$ k edit deploy management-frontend

수정 예시:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: management-frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: management-frontend
  template:
    metadata:
      labels:
        app: management-frontend
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        imagePullPolicy: IfNotPresent
      dnsPolicy: ClusterFirst
      # nodeName: staging-node1   # REMOVE (클러스터 이식성을 위해 제거)

편집을 저장하면 스케줄러가 가용 노드에 파드를 배치한다. 만약 곧바로 반영되지 않으면 컨트롤 플레인에서 파드가 재생성될 시간을 잠시 기다린다.

5 최종 확인[ | ]

controlplane:~$ k get pods -w
NAME                                  READY   STATUS    RESTARTS   AGE
management-frontend-6d9c9f8b67-2c7xh  1/1     Running   0          16s
management-frontend-6d9c9f8b67-84c6t  1/1     Running   0          19s
management-frontend-6d9c9f8b67-r8bqp  1/1     Running   0          21s

controlplane:~$ k get deploy management-frontend
NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
management-frontend  3/3     3            3           10m

6 참고: 이식성 체크리스트[ | ]

  • 특정 노드 고정 제거: spec.template.spec.nodeName
  • 필요 이상으로 좁은 제약 확인: nodeSelector / nodeAffinity / topologySpreadConstraints
  • 테인트/톨러레이션 확인: 불필요한 tolerations 제거 또는 필요한 경우 정확히 추가
  • 스토리지/네트워크 종속성: 존재하지 않는 StorageClass, hostNetwork 사용 여부 점검
  • 이미지 레지스트리 접근성: 비공개 레지스트리라면 imagePullSecrets 설정 확인

7 같이 보기[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}