Kubernetes 노드 장애 시 제외 처리 및 리클러스터링 시나리오#
Kubernetes 노드 제외 프로세스 시나리오#
Kubernetes 노드 제외 프로세스 시나리오
Kubernetes Node 장애 발생시, 관련 노드를 Kubernetes 클러스터에서 제외하고, 해당 노드에 물려 있던 파드들이 정상적으로 이동 시키고 정상 동작하는 리클러스터링 프로세스를 목표로 한다.
Kubernetes 각 구성별 진행 사항#
Kubernetes 각 노드 상태 파악
Kubernetes 각 노드의 상태를 파악하여, 문제 노드 정보를 획득한다. Kubernetes 각 노드 상태는 다음의 정보를 포함한다
- 주소
- 컨디션
- 용량과 할당가능
- 정보
kubectl로 노드 상태와 기타 세부 정보를 확인한다
kubectl describe node < 확인 대상 노드>
Kubernetes Master Node#
Kubernetes Master Node 진행 프로세스
Kubernetes Master Node에서는 문제가 발생한 노드를 클러스터에서 먼저 제외 처리를 한다. kubelet 플래그를 --register-node=false 통해 노드 오브젝트를 수정하거나, 스케줄 불가 처리(unschedulable)를 통해 새 파드 배치를 막는다. 즉 노드에 스케줄할 수 없도록 표시하면서 해당 노드 상의 모든 파드들을 종료시킨다
스케줄 불가 처리#
장애 노드 스케줄 불가 처리
장애 노드에 대해 해당 노드를 스케줄 불가 상태로 변경한다.
# 스케줄 불가 처리
# kubectl cordon < 장애 노드 호스트 >
$ kubectl cordon < 장애 노드 호스트 >
제외 노드 내 파드 종료#
제외 노드 파드 종료
스케줄 불가 처리한 노드 내의 파드들이 정상 종료되는 동안 신규 파드들이 해당 노드에 스케줄되는 것을 방지하기 위한 작업이다. 아래 처리를 통해 처리한다.
# 제외 노드 파드 종료
# kubectl drain < 제외 노드 호스트 > --ignore-daemonsets
$ kubectl drain < 제외 노드 호스트 > --ignore-daemonsets
제외 노드 삭제#
제외 노드 삭제
이제 제외 노드 내의 파드들이 종료 되었다면, 해당 노드를 삭제한다
// kubectl delete node < 제외 노드 호스트 >
$ kubectl delete node < 제외 노드 호스트 >
Kubernetes App Node 유지 보수#
Kubernetes App Node 작업#
Kubernetes App Node 작업 준비
제외된 노드에 접근 후, docker, kubelet, kube-proxy, nginx 서비스를 종료하고 제외한다
# docker, kubelet, kube-proxy, nginx 서비스 종료 및 제외
$ systemctl stop docker kubelet kube-proxy nginx
$ systemctl disable docker kubelet kube-proxy nginx
Kubernetes App Node 작업 진행#
Kubernetes App Node 작업 진행
해당 프로세스에서 작업대상 노드의 커널 업데이트 혹은 서버작업을 진행한다.
# Kubernetes App Node 작업 진행
# 커널 업데이트 혹은 서버작업 진행
# 바로 서버 종료 후, 재시작
$ shutdown -r now
# kubelet, dockerFS, cilium 삭제 처리
$ rm -rf /home/kubelet
$ rm -rf /home/dockerFS
$ rm -rf /var/run/cilium
Kubernetes Master Node 라벨링#
Kubernetes App Node 라벨링
유지보수 작업이 끝났다면, 이제 Kubernetes Master Node에서 작업 노드에 파드가 할당될 수 있도록 라벨을 달아준다
# Kubernetes App Node 라벨링
# kubectl label node <추가 대상 노드> role=worker --overwrite=true
$ kubectl label node <추가 대상 노드> role=worker --overwrite=true
Salt를 통한 노드 배포#
Salt를 통한 노드 배포
Salt를 통해 해당 노드를 클러스터에 추가 작업을 한다
# salt '<작업 노드>' state.sls open saltenv='<클러스터명>'
$ pillarenv='<클러스터명>'
# salt '<작업 노드>' state.sls k8s-worker saltenv='<클러스터명>' $ pillarenv='<클러스터명>'
# 아래의 경우는 전체 노드로 샘플링한 예로 작업 노드의 경우는 특정 노드를 지정하면 된다
$ salt 'k8s-phi-service-01-node*' state.sls open saltenv='k8s-phi-service-01' pillarenv='k8s-phi-service-01'
$ salt 'k8s-phi-service-01-node*' state.sls k8s-worker saltenv='k8s-phi-service-01' pillarenv='k8s-phi-service-01'