쿠버네티스(kubernetes)/CKA 준비

[ITExam-CKA] 2. Kubernetes Cluster Management - Cordon과 Drain 실습

토끼C 2025. 2. 5. 20:00
반응형

 


https://www.itexams.com/exam/CKA

 

CKA Exam - Free Questions and Answers - ITExams.com

 

www.itexams.com

ITExams에서 CKA 자격증 취득을 위한 무료 문제를 제공하는데,

 

CKA 2번 문항에 대한 풀이 방법을 공유하고자 한다.

 


1번 문항과 마찬가지로 가장 먼저 아래처럼 context를 설정하라는 내용을 볼 수 있는데,


SIMULATION -

Set configuration context: 

$ | kubectl config use-context ek8s

 


 

쿠버네티스에서 클러스터를 관리할 때, 하나의 kubeconfig 파일에서 여러 개의 클러스터, 사용자, 네임스페이스를 설정할 수 있는데, 이러한 클러스터와 사용자 조합 컨텍스트(Context)라고 부른다. 쉽게 말하면 사용할 환경을 설정하는거다.

 

그래서 위의 내용은 결국 'ek8s라는 이름의 context를 사용하겠다'는 것이다.

 

 

아래부터가 진짜 문제 내용이다.

 


[문제]

Task -
Set the node named ek8s-node-0 as unavailable and reschedule all the pods running on it.

 

 


[해설]

ek8s-node-0이라는 노드를 사용할 수 없게하고,

해당 노드에서 실행 중인 모든 파드를 다시 예약해라.


[작업 목록]

1. 노드 unavailable 및 파드 reschedule 방법 찾기

2. 노드 상태 조회

3. drain 명령어 실행

4. 노드 상태 조회

- 문제 내용을 보고, 어떤 작업을 수행해야 하는지 작업 목록을 정리했다.

 

 

시작에 앞서 kubectl 자동완성 명령어 설정방법이다.

https://tokkicine.tistory.com/33

 

쿠버네티스 kubectl 명령어 자동완성 설정하기

centOS 기준 bash-completion 라이브러리 설치하고, .bashrc 에 alias 및 설정 추가해주면 된다. 1. bash-completion 라이브러리 설치[user@LYJ ~]$ sudo yum install -y bash-completion  2. .bashrc 파일에 설정 추가source /usr/sh

tokkicine.tistory.com

 

 

1. 노드 unavailable 및 파드 reschedule 방법 찾기

우선 나는 애플리케이션 관리 명령어는 좀 알지만 클러스터 관리 명령어는 잘 모른다.

클러스터 명령어를 모르면 못 푸는 거 아니야? 싶지만 클러스터 명령어를 모르더라도 풀 수 있는 방법을 공유하고자 한다.

 

우선 CKA 시험 응시할 때는 아래 세개의 쿠버네티스 공식 문서를 사용할 수 있다.

https://kubernetes.io/docs/
https://kubernetes.io/blog/
https://kubernetes.io/zh/docs/

 

이 중 명령어 목록들을 아래 링크에서 볼 수 있다.

https://kubernetes.io/docs/ >  Reference > Command line Tool (kubectl) > kubectl Commands 로 접속한다.

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

 

Kubectl Reference Docs

 

kubernetes.io

 

 

여기서 문제를 보고 문제의 단어나 카테고리를 보고 검색하면 내가 모르는 명령어라도 쉽게 찾아서 사용할 수 있다.

우선 해당 문제를 노드를 제어하는 클러스터 관리 카테고리라는 것을 예측할 수 있을 것이다.

 

그렇다면 해당 목차 중 모르는 명령어들의 내용을 찾아보면, 이거다 싶은 명령어가 두개 있다.

 

 

바로 'Cordon''Drain'이다.

Cordon : Mark node as unschedulable.

Drain :

Drain node in preparation for maintenance.

The given node will be marked unschedulable to prevent new pods from arriving. 'drain' evicts the pods if the API server supports https://kubernetes.io/docs/concepts/workloads/pods/disruptions/ . Otherwise, it will use normal DELETE to delete the pods. The 'drain' evicts or deletes all pods except mirror pods (which cannot be deleted through the API server). If there are daemon set-managed pods, drain will not proceed without --ignore-daemonsets, and regardless it will not delete any daemon set-managed pods, because those pods would be immediately replaced by the daemon set controller, which ignores unschedulable markings. If there are any pods that are neither mirror pods nor managed by a replication controller, replica set, daemon set, stateful set, or job, then drain will not delete any pods unless you use --force. --force will also allow deletion to proceed if the managing resource of one or more pods is missing.

'drain' waits for graceful termination. You should not operate on the machine until the command completes.

When you are ready to put the node back into service, use kubectl uncordon, which will make the node schedulable again.

 

위 내용을 보면 cordon은 단순하게 노드에 스케쥴링 되지 않게 하고,

 drain은 노드에 스케쥴링 되지 않게 하고 POD까지 삭제한다.

 

cordon은 해당 노드에서 실행 중인 모든 파드를 다시 예약하지는 못하고,

drain은 자신의 노드에서 러닝 중인 파드를 삭제하기 때문에 컨트롤러, 레플리카셋 등으로 배포된 파드라면 다른 노드에 스케쥴링 된다.

 

그래서 drain 명령어를 사용하면 된다는 것을 알 수 있다.

 

 

2. 노드 상태 조회

drain 명령어 사용 전 노드 상태를 조회해볼 수 있다.

필수는 아니고 명령어가 잘 동작했는지 확인할 때 사용할 수 있다.

kubectl get nodes

해당 명령어를 사용하면 노드 목록을 조회하고, node가 Ready 상태인지, Schedule가능한 상태인지 등을 확인할 수 있다.

NAME            STATUS   ROLES      AGE    VERSION
ek8s-node-0     Ready    <none>     636d    v1.26.0

위의 내용처럼 결과를 확인할 수 있다.

 

 

 

 

3. drain 명령어 실행

help 를 이용하여 옵션 등을 이용할 수 있다.

 k drain --help

 

이번 문제에는 조건이 딱히 없기 때문에 그냥 심플하게 수행하면 된다.

 

 kubectl drain ek8s-node-0

이렇게 수행 하면 한 번에 될 수도 있지만, 만약 문제가 있다면  error 하면서 사용해야 되는 옵션을 그냥 알려준다.

그렇다면 그 옵션 복붙해서 수행하면 된다.

 

ex)

 kubectl drain ek8s-node-0 --ignore-daemonsets

- 노드에 데몬셋으로 관리되는 pod가 있을경우 drain 명령어가 중단됨.

 kubectl drain ek8s-node-0 --delete-emptydir-data

- 노드에 emptyDir 볼륨을 사용할 경우 drain 명령어가 중단됨.

 

 

실제 문제의 정답은 아래 명령어다.

 kubectl drain ek8s-node-0 --ignore-daemonsets --delete-emptydir-data

 

 

 

 

 

4. 노드 상태 조회

drain 명령어가 성공적으로 동작했다면 노드 상태에 Schedulingdisabled로 표시된다.

kubectl get nodes

- 노드 상태 조회 명령어

 

NAME            STATUS                        ROLES      AGE    VERSION
ek8s-node-0     Ready, Schedulingdisabled    <none>     636d    v1.26.0

- 기댓값

 

 

 


여기까지 문제 풀이 끝이다. 

 

 

요약하면 이렇다.

 

1. 노드 unavailable 및 파드 reschedule 방법 찾기

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

링크에서 Ctrl+f로 문제 관련 단어(schedul) 검색

 

2. 노드 상태 조회

kubectl get nodes

 

 

 

3. drain 명령어 실행

 kubectl drain ek8s-node-0 --ignore-daemonsets --delete-emptydir-data

 

 

4. 노드 상태 조회

kubectl get nodes

- Schedulingdisabled 상태가 되었는지 확인

반응형