Kubernetes 1.28 에서 worker 노드 제거 및 추가하기
1. 노드 제거하기
시스템 장애 또는 OS 재설치 등의 이유로 worker 노드 하나를 제거해야 할 수 있습니다.
제거하기 전의 Cluster 상태는 아래와 같습니다.
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 2d22h v1.28.1
worker1 Ready <none> 2d22h v1.28.1
worker2 Ready <none> 2d22h v1.28.1
worker2 노드를 Kubernetes 클러스터에서 제거하고 다시 연결하는 프로세스는 다음과 같이 진행할 수 있습니다.
주의할 점이 하나 있는데, 노드를 클러스터에서 제거하면 해당 노드에서 실행 중인 모든 컨테이너와 Pod가 중지됩니다.
먼저 worker2 노드에서 실행 중인 Pod 를 다른 노드로 옮기거나 제거해야 합니다.
이 명령어는 worker2 노드에서 실행 중인 Pod 를 다른 노드로 옮기고, DaemonSet Pod 는 무시합니다.
# kubectl drain worker2 --ignore-daemonsets
node/worker2 cordoned
Warning: ignoring DaemonSet-managed Pods: kube-system/kube-proxy-8tqss
node/worker2 drained
이 상태로 node 리스트를 확인해보면, 해당 노드에 스케쥴링이 비활성화 된 것이 보입니다.
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 2d22h v1.28.1
worker1 Ready <none> 2d22h v1.28.1
worker2 Ready,SchedulingDisabled <none> 2d22h v1.28.1
worker2 노드를 클러스터 목록에서 제거합니다.
# kubectl delete node worker2
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 2d22h v1.28.1
worker1 Ready <none> 2d22h v1.28.1
2. 노드 추가하기
worker2 노드를 다시 클러스터에 추가하려면 해당 노드를 다시 등록해야 합니다.
OS 를 재설치 한 경우 worker 노드의 환경 구성은 아래 URL 을 참고합니다.
https://sysdocu.tistory.com/1851
worker 노드 준비가 되었으면 master 서버에서 토큰 생성과 함께 join 명령을 출력합니다.
생성된 토큰의 유효 시간은 1일 (24시간) 이며, --ttl 1h 이런 옵션을 줄 경우 토큰 유효 시간을 지정할 수 있습니다.
(master 노드에서)
# kubeadm token create --print-join-command
kubeadm join 115.68.142.104:6443 --token pa3e56.88nw5c48vmbyr522 --discovery-token-ca-cert-hash sha256:82020f205bd07cd7b964a40227f33db5109adc523f042e742d7c6ec8443efbdc
(worker2 노드에서)
master 노드에서 출력된 명령줄을 실행합니다.
# kubeadm join 115.68.142.104:6443 --token pa3e56.88nw5c48vmbyr522 --discovery-token-ca-cert-hash sha256:82020f205bd07cd7b964a40227f33db5109adc523f042e742d7c6ec8443efbdc
추가된 worker2 노드를 확인합니다.
(master 노드에서)
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 2d23h v1.28.1
worker1 Ready <none> 2d23h v1.28.1
worker2 Ready <none> 3m44s v1.28.1
* 에러 조치
master 서버에서 Pod 생성시 에러가 발생한다면 추가한 worker 노드에서 다음과 같이 조치 가능합니다.
[ 에러 ]
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 37m default-scheduler Successfully assigned ceph-csi-rbd/ceph-csi-rbd-nodeplugin-n9b2v to worker3
Warning FailedCreatePodSandBox 31m (x26 over 37m) kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = cri-o configured with cgroupfs cgroup manager, but received systemd slice as parent: /kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podd3fc3e78_f49c_4239_b271_55e406fd0b76.slice
[ 해결 ]
아래 kubelet 설정 파일에서 cgroup driver 를 바꿔줍니다.
(추가된 worker 노드에서)
# vi /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
... Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml --cgroup-driver=cgroupfs" ... |
# systemctl daemon-reload
# systemctl restart kubelet
'리눅스 > Containers & Kubernetes' 카테고리의 다른 글
개인 도커 레지스트리 (Docker Registry) 구축하기 (0) | 2023.09.05 |
---|---|
Kubernetes 1.28 에서 MetalLB 설치하기 (0) | 2023.09.04 |
Ubuntu 22.04 에서 CRI-O, Kubernetes 1.28 Cluster, Calico 설치 및 애플리케이션 배포 (0) | 2023.08.28 |
Docker 컨테이너 생성하지 않고 이미지 쉘에 접근하기 (0) | 2023.04.05 |
4. Kubernetes 대시보드 설치 (0) | 2023.01.03 |