Killer Shell CKA - Scheduling Pod Anti Affinity

Jmnote (토론 | 기여)님의 2025년 10월 28일 (화) 18:46 판 (새 문서: ----- FILE: 16-out.txt ----- ==개요== ;Killer Shell CKA - Scheduling Pod Anti Affinity * https://killercoda.com/killer-shell-cka/scenario/scheduling-pod-anti-affinity * /root/ho...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

FILE: 16-out.txt -----

1 개요

Killer Shell CKA - Scheduling Pod Anti Affinity
  • https://killercoda.com/killer-shell-cka/scenario/scheduling-pod-anti-affinity
  • /root/hobby.yaml 로 주어진 Pod에 Inter-Pod Anti-Affinity를 추가하여, 레이블 level=restricted 파드가 존재하는 노드에는 스케줄되지 않도록 “필수” 제약을 거는 실습
  • 토폴로지 키는 kubernetes.io/hostname 사용
  • 노드 테인트가 없으므로 톨러레이션은 불필요

2 사전 확인

  • 클러스터에 level=restricted 레이블의 파드가 node01 에 존재한다.
controlplane:~$ kubectl get pod -A -o wide --show-labels | grep level=restricted
default              restricted                                1/1     Running   0             3m34s   192.168.1.4   node01         <none>           <none>            level=restricted

3 요구사항 정리

  • hobby 파드는 “반드시(required)” level=restricted 파드가 없는 노드에만 스케줄되어야 한다.
    • 강제 조건: requiredDuringSchedulingIgnoredDuringExecution
    • 토폴로지 키: kubernetes.io/hostname

4 구현

/root/hobby.yaml 파일에 Pod Anti-Affinity를 추가한다.

예시 1: matchExpressions 사용

apiVersion: v1
kind: Pod
metadata:
  labels:
    level: hobby
  name: hobby-project
spec:
  containers:
  - image: nginx:alpine
    name: c
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: level
            operator: In
            values:
            - restricted
        topologyKey: kubernetes.io/hostname

예시 2: matchLabels 사용(동일 의미)

apiVersion: v1
kind: Pod
metadata:
  labels:
    level: hobby
  name: hobby-project
spec:
  containers:
  - image: nginx:alpine
    name: c
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            level: restricted
        topologyKey: kubernetes.io/hostname

적용:

controlplane:~$ kubectl apply -f /root/hobby.yaml
pod/hobby-project created

5 검증

  • restricted 파드가 있는 node01을 피하고, 다른 노드(예: controlplane)에 스케줄되었는지 확인
controlplane:~$ kubectl get pod -o wide --show-labels
NAME            READY   STATUS    RESTARTS   AGE     IP            NODE           NOMINATED NODE   READINESS GATES   LABELS
hobby-project   1/1     Running   0          15s     192.168.0.4   controlplane   <none>           <none>            level=hobby
restricted      1/1     Running   0          4m45s   192.168.1.4   node01         <none>           <none>            level=restricted

6 참고

  • requiredDuringSchedulingIgnoredDuringExecution
    • 조건을 “반드시” 만족하는 노드에만 스케줄된다(조건 미충족 시 Pending).
  • preferredDuringSchedulingIgnoredDuringExecution
    • 조건을 만족하는 노드를 “선호”하지만, 없으면 다른 노드에도 스케줄될 수 있다(본 실습에는 해당하지 않음).
  • topologyKey
    • 파드 간 배치 기준을 정의한다. 노드 단위로 구분하려면 kubernetes.io/hostname 사용.

7 같이 보기

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