명령어 사용 이유
클러스터를 사용하다보면 특정 노드에 있는 pod 를 다른 곳으로 옮기거나 특정 node 에는 pod 가 스케쥴링 되지 않게 제한을 둘 필요가 있다.
이 명령어들은 worker노드의 OS나 kubelet 버전 업데이트에 사용한다.
cordon
: 지정된 node에서 더이상 pod들이 scheduling되서 실행되지 않도록 한다.
현재 노드에 배포된 Pod는 그대로 유지하면서 추가적인 Pod의 배포를 제한하는 명령어이다.
kubectl cordon <node-name>
uncordon
: pod가 node에 정상적으로 scheduling 시키는 명령어이다.
kubectl drain, kubectl cordon 명령어를 적용한 노드의 Pod는 스케쥴링이 되지 않는데, uncordon은 노드에 Pod가 정상적으르 scheduling될 수 있도록 복구하는 명령어이다.
uncordon 이 정상적으로 되면 node 상태는Ready만 남고 Pending으로 남아있던 pod 가 정상적으로 scheduling되어 실행되는 것을 확인할 수 있다.
kubectl uncordon <node-name>
drain
: node 관리를 위해서 지정된 노드에 있는 pod 를 다른곳으로 이동시키는 명령어이다.
노드에 존재하는 모든 Pod를 제거해 노드를 비우고 Pod를 다른 노드에 새롭게 스케쥴링 하는 명령어이다.
kubectl drain <node-name>
사용 방법
1. 새로운 pod 가 node에 스케쥴링되어 실행되지 않도록 설정
2. 기존에 해당 노드에서 실행중인 pod 를 삭제한다
3. 이 때 node에 데몬셋으로 실행된 pod 가 있으면 drain 이 실패한다. (데몬셋으로 실행된 pod는 삭제해도 데몬셋이 다시 실행시키기 때문에)
--ignore-daemonsets 옵션
DaemonSet은 모든 node에 하나씩만 존재하는 Pod로 다른 Pod 에는 추가적으로 스케쥴링되지 않는다.
따라서 drain 과정에서 DaemonSet을 무시하기 위해서는 --ignore-daemonsets 옵션을 사용한다.
참고
drain 명령어는 1개의 노드 이상이 있어야 한다. 그래서 minikube환경에서는 테스트가 어려울 수 있다.
해당 명령어에는 cordon이 포함되어 있다.
taint
특정 키와 값이 일치하는 Pod 만 해당 노드에서 예약되도록 함
taint 는 노드가 파드 셋을 제외시킬 수 있다.
노드에 테인트 추가하기
kubectl taint nodes node1 key1=value1:NoSchedule
-----------------
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
추가했던 테인트 제거하기 (명령어 끝에 '-' 붙이기)
kubectl taint nodes node1 key1=value1:NoSchedule-
toleration
toleration을 통해 스케줄러는 그와 일치하는 테인트가 있는 파드 스케줄 가능하다.
toleration은 스케줄을 허용하지만 보장하지는 않는다.
'클라우드 및 인프라 > Kubernetes' 카테고리의 다른 글
[k8s] CKA 준비 - Network Policy (0) | 2023.06.19 |
---|---|
[DKT CKA Study] 8Day - 2023.05.30 (0) | 2023.05.30 |
[kubernetes] kube-proxy란 (0) | 2023.05.14 |
[DKT CKA Study] 5Day - 2023.05.10 (0) | 2023.05.10 |
Kubernetes Service 포트 - NodePort, port, targetPort (0) | 2023.05.03 |