Killer Shell CKA - Scheduling Pod Affinity

1 개요[ | ]

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

2 사전 확인[ | ]

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

3 요구사항 정리[ | ]

  • hobby 파드는 “가능하다면” level=restricted 파드가 존재하는 노드에 스케줄되도록 한다.
    • 강제가 아닌 우선순위(preferred) 조건: preferredDuringSchedulingIgnoredDuringExecution 사용
    • 토폴로지 키: kubernetes.io/hostname

4 구현[ | ]

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

예시 1: matchExpressions 사용

apiVersion: v1
kind: Pod
metadata:
  labels:
    level: hobby
  name: hobby-project
spec:
  containers:
  - image: nginx:alpine
    name: c
  affinity:
    podAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          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:
    podAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchLabels:
              level: restricted
          topologyKey: kubernetes.io/hostname

적용:

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

5 검증[ | ]

  • hobby-project 파드가 restricted 파드가 있는 노드(node01)에 스케줄되었는지 확인
controlplane:~$ k get pod -o wide --show-labels
NAME            READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES   LABELS
hobby-project   1/1     Running   0          12s   192.168.1.5   node01   <none>           <none>            level=hobby
restricted      1/1     Running   0          21m   192.168.1.4   node01   <none>           <none>            level=restricted

6 참고[ | ]

  • preferredDuringSchedulingIgnoredDuringExecution
    • 조건을 만족하는 노드를 “선호”하지만, 없으면 다른 노드에도 스케줄될 수 있음
  • requiredDuringSchedulingIgnoredDuringExecution
    • 조건을 반드시 만족하는 노드에만 스케줄(엄격 조건). 본 실습 요구는 “선호”이므로 사용하지 않음
  • topologyKey
    • 파드 간 가까움/같음의 기준을 정의. 노드 기준으로 선호하려면 kubernetes.io/hostname 사용

7 같이 보기[ | ]

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