CKA SimA 12 모든 노드에 Deployment 배포

(CKA 1.32A - Q12 모든 노드에 Deployment 배포에서 넘어옴)

1 개요[ | ]

여러 노드에 하나씩만 Pod을 배치하는 Deployment 예제
  • 일반적인 Deployment는 스케줄링 제한이 없어 한 노드에 여러 Pod이 배치될 수 있음
  • PodAntiAffinity 또는 TopologySpreadConstraints를 사용하면 노드마다 하나의 Pod만 배치하도록 제한 가능
  • DaemonSet과 비슷한 효과를 Deployment로 구현할 수 있으며, 특정 수의 복제본만 실행되도록 제어 가능
  • 관련문서: "affinity" → https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/

2 매니페스트 작성[ | ]

  • Pod이 동일한 노드에 함께 배치되지 않도록 PodAntiAffinity 설정
  • topologyKeykubernetes.io/hostname을 사용하여 노드 단위로 제약
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-important
  namespace: project-tiger
  labels:
    id: very-important
spec:
  replicas: 3
  selector:
    matchLabels:
      id: very-important
  template:
    metadata:
      labels:
        id: very-important
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: id
                operator: In
                values:
                - very-important
            topologyKey: kubernetes.io/hostname
      containers:
      - name: container1
        image: nginx:1-alpine
      - name: container2
        image: google/pause

3 네임스페이스 생성[ | ]

  • Deployment를 생성할 네임스페이스가 없는 경우 먼저 생성
# k create ns project-tiger
namespace/project-tiger created

4 매니페스트 적용[ | ]

  • 작성한 매니페스트를 클러스터에 적용
# k apply -f /tmp/deploy-important.yaml
deployment.apps/deploy-important created

5 배포 상태 확인[ | ]

  • 레플리카가 3개이지만 스케줄링 제약으로 2개만 실행 중인 상태 확인
# k -n project-tiger get deploy -l id=very-important
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
deploy-important  2/3     3            2           20s

6 Pod 배치 현황 확인[ | ]

  • 노드마다 1개씩만 배치되며, 나머지 1개는 Pending 상태로 남아 있음
# k -n project-tiger get po -o wide -l id=very-important
NAME                                READY   STATUS    IP           NODE
deploy-important-xxxxxx-yyyyy       2/2     Running   10.36.0.20   cka2556-node1
deploy-important-xxxxxx-zzzzz       2/2     Running   10.44.0.33   cka2556-node2
deploy-important-xxxxxx-wwwww       0/2     Pending   <none>       <none>

7 스케줄 실패 원인 확인[ | ]

  • Pending 상태의 Pod에 대해 k describe 명령어로 스케줄 실패 이벤트 확인
  • 제약 조건(topologyKey)에 의해 모든 노드에 이미 Pod가 존재하므로 추가 스케줄링이 불가
# k -n project-tiger describe po deploy-important-xxxxxx-wwwww | grep -A4 "Events"
Events:
  Type     Reason             Age   From               Message
  ----     ------             ----  ----               -------
  Warning  FailedScheduling   10s   default-scheduler  0/3 nodes are available:
    1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: },
    2 node(s) didn't match pod anti-affinity rules.

8 같이 보기[ | ]

9 참고[ | ]

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