하위 태스크 1

노드 레이블 확인

kubectl get nodes —show-labels로 현재 레이블 확인

kubectl get nodes --show-labels

결과:

NAME     STATUS   ROLES           AGE   VERSION   LABELS
cp-k8s   Ready    control-plane   44h   v1.30.0   beta.kubernetes.io/arch=arm64,beta.kubernetes.io/os=linux,kubernetes.io/arch=arm64,kubernetes.io/hostname=cp-k8s,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
w1-k8s   Ready    <none>          44h   v1.30.0   beta.kubernetes.io/arch=arm64,beta.kubernetes.io/os=linux,kubernetes.io/arch=arm64,kubernetes.io/hostname=w1-k8s,kubernetes.io/os=linux
w2-k8s   Ready    <none>          44h   v1.30.0   beta.kubernetes.io/arch=arm64,beta.kubernetes.io/os=linux,kubernetes.io/arch=arm64,kubernetes.io/hostname=w2-k8s,kubernetes.io/os=linux
w3-k8s   Ready    <none>          44h   v1.30.0   beta.kubernetes.io/arch=arm64,beta.kubernetes.io/os=linux,kubernetes.io/arch=arm64,kubernetes.io/hostname=w3-k8s,kubernetes.io/os=linux

하위 태스크 2

노드 레이블 추가

kubectl label으로 노드에 레이블 추가

두 개의 워커 노드에 서로 다른 특성을 부여한다.

w1-k8s 노드에 레이블을 추가한다.

kubectl label nodes w1-k8s disk=ssd zone=seoul

결과:

node/w1-k8s labeled

w2-k8s 노드에 레이블을 추가한다.

kubectl label nodes w2-k8s disk=hdd zone=busan

결과:

node/w2-k8s labeled

하위 태스크 3

노드 레이블 수정/삭제

레이블 수정(—overwrite)과 삭제(-) 실습

노드 레이블을 수정한다. 다음은 w1-k8s 노드의 disk 타입을 nvme로 변경한다.

kubectl label nodes w1-k8s disk=nvme --overwrite

수정된 레이블을 확인한다.

kubectl describe node w1-k8s

결과:

Labels:             beta.kubernetes.io/arch=arm64
                    beta.kubernetes.io/os=linux
                    disk=ssd
					...

노드 레이블을 삭제한다. w1-k8s 노드의 disk 레이블을 삭제한다.

kubectl label nodes w1-k8s disk-

수정된 레이블을 확인한다. disk 레이블이 사라진 것을 확인할 수 있다.

kubectl describe node w1-k8s

결과:

Labels:             beta.kubernetes.io/arch=arm64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=arm64
                    kubernetes.io/hostname=w1-k8s
                    kubernetes.io/os=linux
                    zone=seoul

하위 태스크 4

nodeSelector Pod 작성

nodeSelector를 사용하는 Pod YAML 작성

이전 하위 태스크에서 삭제했던 disk 레이블을 추가한다.

kubectl label nodes w1-k8s disk=ssd

nodeselector-pod.yaml을 작성한다.

apiVersion: v1
kind: Pod
metadata:
  name: nodeselector-pod
spec:
  containers:
  - name: nginx
    image: nginx
  nodeSelector:
    disk: ssd

하위 태스크 5

nodeSelector 동작 확인

Pod가 지정한 노드에 배치되는지 확인

nodeselector-pod.yaml을 적용한다.

kubectl apply -f nodeselector-pod.yaml

어느 노드에 배치되었는지 확인한다. NODE 열의 값이 w1-k8s임을 볼 수 있다.

kubectl get pods -o wide

결과:

NAME                                      READY   STATUS              RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
...
nodeselector-pod                          0/1     ContainerCreating   0          3s    <none>           w1-k8s   <none>           <none>

하위 태스크 6

노드 어피니티 Pod 작성

required/preferred 조건을 사용하는 Pod 작성

node-affinity-required.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: node-affinity-required
spec:
  containers:
  - name: nginx
    image: nginx
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: zone
            operator: In
            values:
            - seoul

하위 태스크 7

필수 조건 테스트

required 조건이 만족되지 않으면 배치 안 되는지 확인

node-affinity.yaml 파일을 적용한다.

kubectl apply -f node-affinity-required.yaml

node-affinity-required Pod가 w1-k8s 노드에 배치되었는지 확인한다.

kubectl get pods -o wide

결과:

NAME                                      READY   STATUS              RESTARTS   AGE     IP               NODE     NOMINATED NODE   READINESS GATES
...
node-affinity-required                    0/1     ContainerCreating   0          43s     <none>           w1-k8s   <none>           <none>

하위 태스크 8

선호 조건 테스트

preferred 조건이 우선 선택되지만 없어도 배치되는지 확인

disk=nvme를 가진 노드를 선호하도록 작성한다.

node-affinity-preferred.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: node-affinity-preferred
spec:
  containers:
  - name: nginx
    image: nginx
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 10
        preference:
          matchExpressions:
          - key: disk
            operator: In
            values:
            - nvme

Pod를 생성한다.

kubectl apply -f node-affinity-preferred.yaml

배치된 노드를 확인한다. w3-k8s에 배치된 것을 확인할 수 있다.

kubectl get pods -o wide

결과:

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
...
node-affinity-preferred 0/1 ContainerCreating 0 3s <none> w3-k8s <none> <none>

하위 태스크 9

Cordon 실습

노드 스케줄링 비활성화 및 복구

w1-k8s 노드를 대상으로 노드 스케줄링을 비활성화 한다.

kubectl cordon w1-k8s

노드 상태를 확인한다. w1-k8sSchedulingDisabled가 있는 것을 볼 수 있다.

kubectl get nodes

결과:

NAME     STATUS                     ROLES           AGE   VERSION
cp-k8s   Ready                      control-plane   45h   v1.30.0
w1-k8s   Ready,SchedulingDisabled   <none>          45h   v1.30.0
w2-k8s   Ready                      <none>          45h   v1.30.0
w3-k8s   Ready                      <none>          45h   v1.30.0

하위 태스크 10

Drain 실습

노드의 Pod를 다른 노드로 이동

w1-k8s 노드에 있는 Pod들을 다른 노드로 내보낸다.

kubectl drain w1-k8s --ignore-daemonsets --delete-emptydir-data --force

결과를 확인하면 아무것도 출력되지 않음을 볼 수 있다.

kubectl get pods -o wide | grep w1-k8s

하위 태스크 11

Taint 추가

kubectl taint로 노드에 Taint 추가

노드에 NoSchedule를 추가하여 일반 Pod의 접근을 차단합니다.

kubectl taint nodes w1-k8s role=db:NoSchedule

하위 태스크 12

Toleration Pod 작성

Taint를 허용하는 Pod 작성

toleration-pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: toleration-pod
spec:
  containers:
  - name: nginx
    image: nginx
  tolerations:
  - key: "role"
    operator: "Equal"
    value: "db"
    effect: "NoSchedule"

하위 태스크 13

Taint/Toleration 동작 확인

Toleration이 있는 Pod만 배치되는지 확인

Pod를 생성한다.

kubectl apply -f toleration-pod.yaml

배치된 노드를 확인한다.

kubectl get pods -o wide

결과:

NAME                                      READY   STATUS              RESTARTS   AGE     IP               NODE     NOMINATED NODE   READINESS GATES
...
toleration-pod                            0/1     ContainerCreating   0          5s      <none>           w3-k8s   <none>           <none>