본문 바로가기

리눅스

쿠버네티스 클러스터에서 노드를 새로운 노드로 교체하는 방법

반응형

쿠버네티스 클러스터에서 노드를 새로운 노드로 교체하는 방법

Control Plane 교체

쿠버네티스에서 Control Plane 노드는 클러스터의 핵심 구성 요소로 API 서버, 스케줄러, 컨트롤러 매니저 등이 실행됩니다. Control Plane 노드를 교체할 때는 장애가 발생하지 않도록 주의해야 합니다.

 

노드 상태 확인

$ kubectl get nodes
NAME      STATUS   ROLES           AGE   VERSION
node111   Ready    control-plane   44h   v1.30.3
node112   Ready    control-plane   44h   v1.30.3
node113   Ready    control-plane   44h   v1.30.3
worker1   Ready    <none>          88m   v1.27.16

기존 Control Plane 노드 제거

1. Pod 분산

  • 기존 Control Plane 노드에서 실행 중인 파드를 다른 노드로 이동시킵니다.
kubectl drain <node-name> --ignore-daemonsets --delete-local-data
kubectl drain node113 --ignore-daemonsets --delete-local-data
$ kubectl drain node113 --ignore-daemonsets --delete-local-data
Flag --delete-local-data has been deprecated, This option is deprecated and will be deleted. Use --delete-emptydir-data.
node/node113 cordoned
Warning: ignoring DaemonSet-managed Pods: kube-system/cilium-envoy-sdzks, kube-system/cilium-jkbw5, kube-system/kube-proxy-pct7d
evicting pod kube-system/coredns-7db6d8ff4d-gtk7s
evicting pod kube-system/cilium-operator-7ddc48bb97-mgtlf
pod/cilium-operator-7ddc48bb97-mgtlf evicted
pod/coredns-7db6d8ff4d-gtk7s evicted
node/node113 draine

노드 상태 확인

$ kubectl get nodes
NAME      STATUS                     ROLES           AGE   VERSION
node111   Ready                      control-plane   44h   v1.30.3
node112   Ready                      control-plane   44h   v1.30.3
node113   Ready,SchedulingDisabled   control-plane   44h   v1.30.3
worker1   Ready                      <none>          99m   v1.27.16

2. Control Plane 노드 삭제

  • 노드를 클러스터에서 제거합니다.
kubectl delete node <node-name>
kubectl delete node node113
$ kubectl delete node node113
node "node113" deleted

노드 상태 확인

$ kubectl get nodes
NAME      STATUS   ROLES           AGE    VERSION
node111   Ready    control-plane   44h    v1.30.3
node112   Ready    control-plane   44h    v1.30.3
worker1   Ready    <none>          100m   v1.27.16

새로운 Control Plane 노드 추가

1. etcd 클러스터에서 사용하지 않는 member를 삭제

기존(node111) 클러스터에 연결하기 위해 etcdctl을 사용하여 Control Plane로 설정합니다.

  • etcd 클러스터의 멤버 목록을 확인
ETCDCTL_API=3 etcdctl member list -w table \
--cacert /etc/kubernetes/pki/etcd/ca.crt \
--cert /etc/kubernetes/pki/etcd/server.crt \
--key /etc/kubernetes/pki/etcd/server.key
+------------------+---------+---------+-----------------------------+-----------------------------+
|        ID        | STATUS  |  NAME   |         PEER ADDRS          |        CLIENT ADDRS         |
+------------------+---------+---------+-----------------------------+-----------------------------+
| 44ed0c16b59287e2 | started | node113 | https://192.168.10.113:2380 | https://192.168.10.113:2379 |
| 4a4356482404852a | started | node112 | https://192.168.10.112:2380 | https://192.168.10.112:2379 |
| a36ab5eacdd05d40 | started | node111 | https://192.168.10.111:2380 | https://192.168.10.111:2379 |
+------------------+---------+---------+-----------------------------+-----------------------------+
  • etcd 클러스터에서 node113의 etcd 멤버를 제거
ETCDCTL_API=3 etcdctl member remove 44ed0c16b59287e2 \
--cacert /etc/kubernetes/pki/etcd/ca.crt \
--cert /etc/kubernetes/pki/etcd/server.crt \
--key /etc/kubernetes/pki/etcd/server.key
Member 44ed0c16b59287e2 removed from cluster ed3fb8c38b955784
728x90

2. Kubeadm 설정

기존(node111) 클러스터에 연결하기 위해 kubeadm을 사용하여 Control Plane로 설정합니다.

  • 실행하면 클러스터의 인증서를 공유할 수 있는 토큰이 생성됩니다.
kubeadm init phase upload-certs --upload-certs
$ sudo kubeadm init phase upload-certs --upload-certs
I0816 21:19:10.573722    4400 version.go:256] remote version is much newer: v1.31.0; falling back to: stable-1.30
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
3275bd3bb12d2be2e109b72f48e168607aed11f31d402ba3f8cfc73a24c9d859

새로운 노드를 클러스터에 조인시키기 위한 토큰과 명령어 생성

kubeadm token create --print-join-command
$ kubeadm token create --print-join-command
kubeadm join 192.168.10.110:6443 --token jiihc1.983kpu09hy1lhwh2 --discovery-token-ca-cert-hash sha256:d0283d0436c3737c581badda1f57550a683813ff50d0d6bb6f9f9ae600c8d630

사용 가능한 조인 토큰 목록을 확인

kubeadm token list

3. 새 노드 준비

  • 새로운 Control Plane 노드를 준비하고 쿠버네티스와 동일한 버전 및 구성으로 설정합니다.

4. 새 노드에 조인

  • 기존 Control Plane에서 얻은 명령어와 토큰을 사용해 새 Control Plane 노드를 클러스터에 추가합니다.
kubeadm join <master-node-ip>:6443 \
  --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash> \
  --control-plane \
  --certificate-key <certificate-key>
kubeadm join 192.168.10.110:6443 \
  --control-plane \
  --token jiihc1.983kpu09hy1lhwh2 \
  --discovery-token-ca-cert-hash sha256:d0283d0436c3737c581badda1f57550a683813ff50d0d6bb6f9f9ae600c8d630 \
  --certificate-key 49368144b5123f849180f27e065f659fc21848b7e7eb33213102ca7c3cbb5247
...
This node has joined the cluster and a new control plane instance was created:

* Certificate signing request was sent to apiserver and approval was received.
* The Kubelet was informed of the new secure connection details.
* Control plane label and taint were applied to the new node.
* The Kubernetes control plane instances scaled up.
* A new etcd member was added to the local/stacked etcd cluster.

To start administering your cluster from this node, you need to run the following as a regular user:

	mkdir -p $HOME/.kube
	sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
	sudo chown $(id -u):$(id -g) $HOME/.kube/config

Run 'kubectl get nodes' to see this node join the cluster.

노드 상태 확인

  • Control Plane 노드가 성공적으로 클러스터에 추가되었는지 확인합니다.
kubectl get nodes
NAME      STATUS   ROLES           AGE    VERSION
node111   Ready    control-plane   45h    v1.30.3
node112   Ready    control-plane   45h    v1.30.3
node213   Ready    control-plane   10m    v1.30.4
worker1   Ready    <none>          146m   v1.27.16

Worker Node 교체

Worker Node는 실제 애플리케이션 컨테이너가 배포되고 실행되는 노드입니다.

 

노드 상태 확인

$ kubectl get nodes
NAME      STATUS   ROLES           AGE   VERSION
node111   Ready    control-plane   44h   v1.30.3
node112   Ready    control-plane   44h   v1.30.3
node113   Ready    control-plane   44h   v1.30.3
worker1   Ready    <none>          88m   v1.27.16

기존 Worker Node 제거

1. Pod 분산

  • 기존 Worker Node에서 실행 중인 파드를 다른 노드로 이동시킵니다.
kubectl drain <node-name> --ignore-daemonsets --delete-local-data
kubectl drain worker1 --ignore-daemonsets --delete-local-data

2. Worker Node 삭제

  • 노드를 클러스터에서 제거합니다.
kubectl delete node <node-name>
kubectl delete node worker1

새로운 Worker Node 추가

1. 새 노드 준비

  • 새로운 Worker Node를 준비하고 쿠버네티스와 동일한 버전 및 구성으로 설정합니다.

새로운 노드를 클러스터에 조인시키기 위한 토큰과 명령어 생성

kubeadm token create --print-join-command
kubeadm token list

2. 노드에 조인

  • 클러스터에 새 Worker Node를 추가합니다.
kubeadm join <master-node-ip>:6443 --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash>

3. 노드 상태 확인

  • 새 Worker Node가 클러스터에 성공적으로 추가되었는지 확인합니다.
kubectl get nodes

 

728x90
반응형