하위 태스크 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=ssdnodeselector-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.yamlnode-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:
- nvmePod를 생성한다.
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-k8s에 SchedulingDisabled가 있는 것을 볼 수 있다.
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>