애플리케이션이 파드로 실행인 클러스터에서 master node / woker node를 제거 하기 위함
해당 문서에서 사용된 컨테이너 런타임은 cri-o입니다.
패키지 | 버전 |
---|---|
cri-o | 1.17.4 |
kubernetes | v1.17.6 |
$ kubectl get nodes
$ kubectl cordon [Node]
노드를 스케줄 불가로 표시하면 스케줄러가 해당 노드에 새 파드를 배치할 수 없지만, 노드에 있는 기존 파드에는 영향을 미치지 않습니다.
SchedulingDisabled
상태인지 확인합니다.$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready master 159m v1.17.6
node2 Ready,SchedulingDisabled master 159m v1.17.6
node3 Ready master 125m v1.17.6
node4 Ready,SchedulingDisabled <none> 96m v1.17.6
node5 Ready <none> 125m v1.17.6
kubectl get pdb -A
kubectl get pdb [pdb-name] -o yaml > pdb-backup.yaml
kubectl delete pod [pdb=pod=name]
$ kubectl drain node-name --ignore-daemonsets 🌞
node/node-name already cordoned ⭐
evicting pod "pod-name"
...
node/node-name evicted
--ignore-daemonsets
옵션을 추가합니다.force
옵션으로 강제로 진행시킬 수 있습니다. (pod 중요성 확인)$ kubectl get pods -A -o wide
multi master에선 etcd에 정보가 동기화 되어 있기 때문에 node제거 후, etcd member에서 제거해야 합니다. 제거된 node의 etcd가 메인이 되면 apiserver가 존재하지 않아 통신이 불가능하고 데이터 일관성이 깨질 수 있게 됩니다. 자세한 내용은 RAFT 알고리즘을 참조해주세요.
0. 제거할 노드들의 keepalived service를 중지합니다.
$ systemctl stop keepalived
$ kubectl get nodes
$ kubectl delete node [node-name you want to remove from cluster]
$ kubectl get nodes
keepalived를 가지고 있는 main master 노드에 접속합니다.
main master의 etcd pod를 조회합니다.
$ kubectl get pods -n kube-system | grep etcd
$ kubctl exec -it -n kube-system etcd-pod -- bash # bash 안되면 sh
❗7번부터 9번까지 명령어는 접속한 pod에서 진행됩니다.❗
$ etcdctl -w table member list --cacert /etc/kubernetes/pki/etcd/ca.crt \
--cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key
$ etcdctl member remove [etcd ID] --cacert /etc/kubernetes/pki/etcd/ca.crt \
--cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key
$ etcdctl -w table member list --cacert /etc/kubernetes/pki/etcd/ca.crt \
--cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key
9-1. exit
로 pod에서 나옵니다.
노드에 저장된 클러스터 정보를 초기화 하기 위해 클러스터에 제거한 노드로 접속합니다.
❗지금부터 실행되는 명령어는 접속한 노드에서 진행 되는 내용입니다.❗
클러스터 정보를 초기화 합니다.
$ kubeadm reset --cri-socket=/var/run/crio/crio.sock⭐
...
The reset process does not clean CNI configuration. To do so, you must remove /etc/cni/net.d
The reset process does not reset or clean up iptables rules or IPVS tables.
If you wish to reset iptables, you must do so manually by using the "iptables" command.
If your cluster was setup to utilize IPVS, run ipvsadm --clear (or similar)
to reset your system's IPVS tables.
The reset process does not clean your kubeconfig files and you must remove them manually.
Please, check the contents of the $HOME/.kube/config file.
--cri-socket=/var/run/crio/crio.sock
옵션으로 컨테이너 런타임으로 지정하여 정상적으로 초기화 되도록 합니다.kubeadm reset
만 입력해도 진행되는 경우가 있지만, 완전히 리셋이 되지 않을 수 있습니다.--cri-socket=/var/run/crio/crio.sock
를 사용해줍니다.$ rm -rf /var/lib/kubelet
$ rm -rf /etc/kubernetes
$ rm -rf /etc/cni/net.d
$ yum(dnf) autoremove kubeadm kubelet kubectl
autoremove
란? 삭제하는 패키지와 의존성이 있는 패키지도 같이 삭제합니다. 추후 재설치 시, 버전이 변경되는 경우 의존성 패키지가 남아 있으면 충돌이 발생할 수 있기 때문에autoremove
를 통해 의존성 패키지도 모두 삭제합니다.
$ kubectl get nodes
$ kubectl delete node [node-name you want to remove from cluster]
$ kubectl get nodes
노드에 저장된 클러스터 정보를 초기화 하기 위해 클러스터에 제거한 노드로 접속합니다.
❗지금부터 실행되는 명령어는 접속한 노드에서 진행 되는 내용입니다.❗
클러스터 정보를 초기화 합니다.
$ kubeadm reset --cri-socket=/var/run/crio/crio.sock⭐
...
The reset process does not clean CNI configuration. To do so, you must remove /etc/cni/net.d
The reset process does not reset or clean up iptables rules or IPVS tables.
If you wish to reset iptables, you must do so manually by using the "iptables" command.
If your cluster was setup to utilize IPVS, run ipvsadm --clear (or similar)
to reset your system's IPVS tables.
The reset process does not clean your kubeconfig files and you must remove them manually.
Please, check the contents of the $HOME/.kube/config file.
--cri-socket=/var/run/crio/crio.sock
옵션으로 컨테이너 런타임으로 지정하여 정상적으로 초기화 되도록 합니다.kubeadm reset
만 입력해도 진행되는 경우가 있지만, 완전히 리셋이 되지 않을 수 있습니다.--cri-socket=/var/run/crio/crio.sock
를 사용해줍니다.$ rm -rf /var/lib/kubelet
$ rm -rf /etc/kubernetes
$ rm -rf /etc/cni/net.d
$ yum(dnf) autoremove kubeadm kubelet kubectl
autoremove
란? 삭제하는 패키지와 의존성이 있는 패키지도 같이 삭제합니다. 추후 재설치 시, 버전이 변경되는 경우 의존성 패키지가 남아 있으면 충돌이 발생할 수 있기 때문에autoremove
를 통해 의존성 패키지도 모두 삭제합니다.