IT/쿠버네티스 / / 2020. 1. 30.

[kubernetes-실습] 기본 Node 의 maintenance (유지보수)

이번엔 우리의 pod 중 일부가 node 에서 퇴출되고 다른 곳으로 스케줄이 변경되도록 할 것이다.
이것은 기본적인 maintenance 또는 롤링 OS 업데이트 등으로 있을 수 있다.

 

먼저 worker1번 노드를 더이상 스케쥴 되지 않도록 한다. 

이때, worker1번 노드에 있는 pod들을 다른 노드들로 퇴출된다.

 

현재 master node 이미지 수 확인

ps0107@k8smaster1:~$ sudo docker ps | wc -l
22

 

현재 worker node 이미지 수 확인

ps0107@k8sworker1:~$ sudo docker ps | wc -l
28

 

maintenance를 완료하기 위해 노드에서 컨테이너를 이동하고 새 컨테이너가 배치되는 것을 막아야 한다. 

# - drain : 비우다
# - cordon : 저지선을 치다
ps0107@k8smaster1:~$ kubectl get nodes 
NAME         STATUS   ROLES    AGE   VERSION
k8smaster1   Ready    master   44h   v1.15.1
k8sworker1   Ready    <none>   44h   v1.15.1

 

drain 명령을 통해 해당 노드의 object를 비워봅니다.

daemonSet Pod 가 있으면 error가 있고 taint만 설정됩니다. 

ps0107@k8smaster1:~$ kubectl drain k8sworker1                                                                                             
node/k8sworker1 cordoned
error: unable to drain node "k8sworker1", aborting command...

There are pending nodes to be drained:
 k8sworker1
cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-system/calico-node-zxkxk, kube-system/kube-proxy-tnmtr
cannot delete Pods with local storage (use --delete-local-data to override): sock-shop/carts-56c6fb966b-44xdb, sock-shop/carts-db-5678cc578f-nh5l4, sock-shop/orders-749cdc8c9-7rntw, sock-shop/orders-db-5cfc68c4cf-6v2hb, sock-shop/shipping-78794fdb4f-dl6wk, sock-shop/user-db-99685d75b-6dvzs

 

 

taint 설정 되면 해당 노드에 스케쥴링하지 않음.

ps0107@k8smaster1:~$ kubectl describe node | grep -i taint
Taints:             <none>
Taints:             node.kubernetes.io/unschedulable:NoSchedule

 

이번엔 daemonSet 무시하고 drain 해봅니다.

그런데 몽고 디비가 로컬 스토리지를 사용중이라 또 에러 발생

ps0107@k8smaster1:~$ kubectl drain k8sworker1 --ignore-daemonsets                                                                         
node/k8sworker1 already cordoned
error: unable to drain node "k8sworker1", aborting command...

There are pending nodes to be drained:
 k8sworker1
error: cannot delete Pods with local storage (use --delete-local-data to override): sock-shop/carts-56c6fb966b-44xdb, sock-shop/carts-db-5678cc578f-nh5l4, sock-shop/orders-749cdc8c9-7rntw, sock-shop/orders-db-5cfc68c4cf-6v2hb, sock-shop/shipping-78794fdb4f-dl6wk, sock-shop/user-db-99685d75b-6dvzs

 

이번엔 기존 연결된 몽고 디비 데이터 까지 삭제후 진행 하도록 옵션을 주고 drain 실행합니다.

 

오... 정상적으로 처리 되었습니다.

ps0107@k8smaster1:~$ kubectl drain k8sworker1 --ignore-daemonsets --delete-local-data
node/k8sworker1 already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-zxkxk, kube-system/kube-proxy-tnmtr
evicting pod "user-db-99685d75b-6dvzs"
evicting pod "catalogue-db-6ddc796b66-8fws2"
evicting pod "carts-56c6fb966b-44xdb"
evicting pod "carts-db-5678cc578f-nh5l4"
evicting pod "catalogue-644549d46f-g8d4n"
evicting pod "orders-db-5cfc68c4cf-6v2hb"
evicting pod "front-end-5594987df6-252k8"
evicting pod "payment-54f55b96b9-hcc77"
evicting pod "orders-749cdc8c9-7rntw"
evicting pod "rabbitmq-bdfd84d55-87nrj"
evicting pod "shipping-78794fdb4f-dl6wk"
pod/catalogue-644549d46f-g8d4n evicted
pod/payment-54f55b96b9-hcc77 evicted
pod/user-db-99685d75b-6dvzs evicted
pod/orders-db-5cfc68c4cf-6v2hb evicted
pod/catalogue-db-6ddc796b66-8fws2 evicted
pod/rabbitmq-bdfd84d55-87nrj evicted
pod/carts-db-5678cc578f-nh5l4 evicted
pod/carts-56c6fb966b-44xdb evicted
pod/shipping-78794fdb4f-dl6wk evicted
pod/front-end-5594987df6-252k8 evicted
pod/orders-749cdc8c9-7rntw evicted
node/k8sworker1 evicted

 

image 수 확인 한 결과 master 노드로 다 옮겨져 갔습니다.

ps0107@k8smaster1:~$ sudo docker ps | wc -l
42

ps0107@k8sworker1:~$ sudo docker ps | wc -l
6

 

node 상태를 확인 해보면 SchedulingDisabled 상태로 변경이 되었습니다.

ps0107@k8smaster1:~$ kubectl get nodes
NAME         STATUS                     ROLES    AGE   VERSION
k8smaster1   Ready                      master   44h   v1.15.1
k8sworker1   Ready,SchedulingDisabled   <none>   44h   v1.15.1

 

 

worker1번 노드가 drain 처리 되었고, pod들이 다른 노드로 옮겨져 갔으므로 worker 1번 노드의 작업을 해줍니다.
(OS 업데이트, maintenance 등 처리)

 

 

 


다시 uncordon 처리하여 worker1번 노드를 사용하게 끔 설정

다시 worker 노드로 스케쥴 될수 있도록 uncordon 명령으로 처리 해줍니다.

ps0107@k8smaster1:~$ kubectl uncordon k8sworker1 
node/k8sworker1 uncordoned

ps0107@k8smaster1:~$ kubectl describe nodes | grep -i taint
Taints:             <none> 
Taints:             <none>

 

현재 worker node의 컨테이너 갯수를 봅니다.

역시나 아직 6개 입니다.

ps0107@k8sworker1:~$ sudo docker ps | wc -l
6

 

node 정보를 보면 Ready 상태로 변경되었습니다.

ps0107@k8smaster1:~$ kubectl get nodes 
NAME         STATUS   ROLES    AGE   VERSION
k8smaster1   Ready    master   44h   v1.15.1
k8sworker1   Ready    <none>   44h   v1.15.1

 

현재 pod들도 전부 다른 노드에 running 중입니다.

ps0107@k8smaster1:~$ kubectl -n sock-shop get pod -o wide
NAME                            READY   STATUS    RESTARTS   AGE     IP             NODE         NOMINATED NODE   READINESS GATES
carts-56c6fb966b-tghrs          1/1     Running   0          4m39s   192.168.0.18   k8smaster1   <none>           <none>
carts-db-5678cc578f-ngvxj       1/1     Running   0          4m39s   192.168.0.20   k8smaster1   <none>           <none>
catalogue-644549d46f-p6crp      1/1     Running   0          4m39s   192.168.0.21   k8smaster1   <none>           <none>
catalogue-db-6ddc796b66-pqwzf   1/1     Running   0          4m39s   192.168.0.24   k8smaster1   <none>           <none>
front-end-5594987df6-64rlt      1/1     Running   0          4m39s   192.168.0.16   k8smaster1   <none>           <none>
orders-749cdc8c9-js5v8          1/1     Running   0          4m39s   192.168.0.19   k8smaster1   <none>           <none>
orders-db-5cfc68c4cf-bnqmg      1/1     Running   0          4m39s   192.168.0.17   k8smaster1   <none>           <none>
payment-54f55b96b9-98jcw        1/1     Running   0          4m39s   192.168.0.25   k8smaster1   <none>           <none>
queue-master-6fff667867-qffqg   1/1     Running   0          8m50s   192.168.0.14   k8smaster1   <none>           <none>
rabbitmq-bdfd84d55-fhltf        1/1     Running   0          4m39s   192.168.0.22   k8smaster1   <none>           <none>
shipping-78794fdb4f-g2wgm       1/1     Running   0          4m39s   192.168.0.23   k8smaster1   <none>           <none>
user-77cff48476-vcwqt           1/1     Running   0          8m50s   192.168.0.15   k8smaster1   <none>           <none>
user-db-99685d75b-6k5wp         1/1     Running   0          4m39s   192.168.0.26   k8smaster1   <none>           <none>

 

테스트를 위해 몇개의 pod를 다시 띄워보기 위해 삭제를 해봅니다.

ps0107@k8smaster1:~$ kubectl -n sock-shop delete pod carts-56c6fb966b-tghrs orders-749cdc8c9-js5v8 front-end-5594987df6-64rlt user-77cff48476-vcwqt
pod "carts-56c6fb966b-tghrs" deleted
pod "orders-749cdc8c9-js5v8" deleted
pod "front-end-5594987df6-64rlt" deleted
pod "user-77cff48476-vcwqt" deleted

 

pod 상태를 보니 이제 worker1번 노드에서 pod가 생성됨을 볼수 있습니다.

ps0107@k8smaster1:~$ kubectl -n sock-shop get pod -o wide                                                                                 
NAME                            READY   STATUS    RESTARTS   AGE    IP             NODE         NOMINATED NODE   READINESS GATES          
carts-56c6fb966b-rlwwg          1/1     Running   0          54s    192.168.1.37   k8sworker1   <none>           <none>
carts-db-5678cc578f-ngvxj       1/1     Running   0          8m2s   192.168.0.20   k8smaster1   <none>           <none>
catalogue-644549d46f-p6crp      1/1     Running   0          8m2s   192.168.0.21   k8smaster1   <none>           <none>
catalogue-db-6ddc796b66-pqwzf   1/1     Running   0          8m2s   192.168.0.24   k8smaster1   <none>           <none>
front-end-5594987df6-v2xvq      1/1     Running   0          54s    192.168.1.38   k8sworker1   <none>           <none>
orders-749cdc8c9-7gdht          1/1     Running   0          54s    192.168.1.36   k8sworker1   <none>           <none>
orders-db-5cfc68c4cf-bnqmg      1/1     Running   0          8m2s   192.168.0.17   k8smaster1   <none>           <none>
payment-54f55b96b9-98jcw        1/1     Running   0          8m2s   192.168.0.25   k8smaster1   <none>           <none>
queue-master-6fff667867-qffqg   1/1     Running   0          12m    192.168.0.14   k8smaster1   <none>           <none>
rabbitmq-bdfd84d55-fhltf        1/1     Running   0          8m2s   192.168.0.22   k8smaster1   <none>           <none>
shipping-78794fdb4f-g2wgm       1/1     Running   0          8m2s   192.168.0.23   k8smaster1   <none>           <none>
user-77cff48476-pnkzq           1/1     Running   0          54s    192.168.1.39   k8sworker1   <none>           <none>
user-db-99685d75b-6k5wp         1/1     Running   0          8m2s   192.168.0.26   k8smaster1   <none>           <none>

 

 

 

 

테스트가 끝났으니, 리소스 정리하자

ps0107@k8smaster1:~$ kubectl delete -f complete-demo.yaml

 


참조) CKA 대비 간단 실습

01. kubeadm 을 이용한 설치 및 세팅
02. kubernetes 클러스터 노드 확장 및 셋팅
03. 간단한 application 배포, yaml템플릿, 서비스 expose 해보기
04. deployment 의 CPU, Memory 제약
05. namespace 를 위한 resource limit 설정
06. 좀더 복잡한 deployment 배포해보기
07. 기본 Node 의 maintenance (유지보수)
08. API AND ACCESS
09. API 객체
10. Managing State with Deployments
11. Service Resource
12. Volumes and Data : ConfigMap 간단 테스트
13. PV 와 PVC 생성
14. ResourceQuota 사용 (PVC Count 와 Usage를 제한)
15. ingress 간단 실습
16. Scheduling - label 사용한 pod 할당
17. Scheduling - Taint를 이용한 pod 배포 관리
18. 로깅과 트러블슈팅 : 로그위치와 로그 출력 보기
19. 로깅과 트러블슈팅 : Metrics와 DashBoard
20. CRD (Custom Resource Definition)
21. helm
22. Security - TLS
23. Security - Authentication, Authorization, Admission
24. HA(High Availability) 구성 - master node


  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유