개요
kubeadm으로 구성한 쿠버네티스 클러스터에서 특정 노드를 제외하려고 한다.
방법을 정리해둔다.
kubectl로 작업
1. Node 상태 확인
kubectl get nodes
2. Node 스케쥴링 비활성화
Node에 Pod가 스케쥴링되지 않도록 상태를 변경한다.
kubectl drain <node>
# --ignore-daemonsets : drain 시 daemonset에 의한 pod 제외
Daemonset에 의해 생성된 Pod가 동작 중인 경우에는 --ignore-daemonsets 옵션을 사용하여 실행한다.
3. 노드 삭제
kubectl delete nodes <node>
제거한 노드에서 작업
1. kubeadm reset
kubeadm reset은 kubeadm init 또는 join 명령에 의해 발생한 변경 사항을 최대한 되돌린다.
kubeadm reset
reset 명령은 다음과 같은 단계를 거쳐 실행된다.
- preflight : reset 전 사전 점검
- remove-etcd-member : 로컬 ETCD 멤버 제거
- cleanup-node : 노드 정리
2. 남은 설정 정리
reset 과정에서 네트워크 관련 설정 등 남아 있는 부분이 있을 수 있다. 이 부분은 로그 메시지를 참고하여 정리한다.
- /etc/cni/net.d 삭제
rm -r /etc/cni/net.d
- iptable 정리
정리하지 않으면 다른 Pod Networking CIDR 범위를 사용하거나 다른 네트워크 설정을 사용하여 클러스터를 부트스트랩하려고 할 때 문제가 발생할 수 있다고 한다.
sudo iptables -F && sudo iptables -t nat -F && sudo iptables -t mangle -F && sudo iptables -X
참고 : Properly Resetting Your kubeadm-bootstrapped Cluster Nodes — #HeptioProTip
- IPVS tables 정리 : IPVS를 설정했다면 정리할 필요성이 있다.
ipvsadm --clear
- kubeconfig 파일 정리
ll $HOME/.kube/
rm -r $HOME/.kube/
💡 이후 다시 node로 join하는 경우에도 kubeadm reset 과정이 필요하다.
reset 과정 없이 join 하는 경우에는 남아있는 설정으로 인해 오류가 발생하면서 join에 실패한다.
참고 문서
https://stackoverflow.com/questions/35757620/how-to-gracefully-remove-a-node-from-kubernetes
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-reset/
https://sandeepnkulkarni.wordpress.com/2020/07/11/reset-kubernetes-cluster-using-kubeadm/