728x90
쿠버네티스(Kubernetes) 클러스터에서 Control Plane을 새로운 노드로 교체하는 방법
1. 새로운 마스터 노드 준비
새로운 Control Plane 역할을 할 마스터 노드를 준비합니다.
쿠버네티스 설치
- 새 서버에 쿠버네티스 Control Plane 구성 요소를 설치합니다.
- Containerd, kubeadm, kubelet, kubectl 등의 쿠버네티스 패키지를 설치합니다.
- 기존 클러스터와 동일한 Kubernetes 버전을 설치해야 합니다.
노드 상태 확인
kubectl get nodes
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready control-plane 2d18h v1.30.4
k8s-master2 Ready control-plane 2d18h v1.30.4
k8s-master3 Ready control-plane 2d18h v1.30.4
k8s-worker1 Ready <none> 2d17h v1.30.4
2. 기존 Control Plane 노드 드레인 및 제거
노드 드레인(drain)
- 기존 Control Plane 노드를 드레인하여 모든 파드가 다른 노드로 이동하도록 합니다.
- --force 플래그는 노드가 NoSchedule 또는 NoExecute taint가 있는 파드에 대해 강제로 드레인합니다.
kubectl drain <old-control-plane-node> --ignore-daemonsets --force
kubectl drain k8s-master3 --ignore-daemonsets --force
$ kubectl drain k8s-master3 --ignore-daemonsets --force
node/k8s-master3 cordoned
Warning: ignoring DaemonSet-managed Pods: kube-system/cilium-8zjhp, kube-system/cilium-envoy-dzddl, kube-system/kube-proxy-rll67
evicting pod kube-system/cilium-operator-7ddc48bb97-ttz4m
pod/cilium-operator-7ddc48bb97-ttz4m evicted
node/k8s-master3 drained
노드 상태 확인
- 드레인된 노드가 SchedulingDisabled 상태인지 확인합니다.
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready control-plane 2d18h v1.30.4
k8s-master2 Ready control-plane 2d18h v1.30.4
k8s-master3 Ready,SchedulingDisabled control-plane 2d18h v1.30.4
k8s-worker1 Ready <none> 2d18h v1.30.4
노드 제거(delete)
기존 Control Plane 노드가 드레인되고 더 이상 필요하지 않다면 클러스터에서 제거합니다.
클러스터에서 노드 삭제
- 클러스터에서 기존 노드를 제거합니다.
kubectl delete node <old-control-plane-node>
kubectl delete node k8s-master3
$ kubectl delete node k8s-master3
node "k8s-master3" deleted
노드 상태 확인
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready control-plane 2d18h v1.30.4
k8s-master2 Ready control-plane 2d18h v1.30.4
k8s-worker1 Ready <none> 2d18h v1.30.4
3. etcd 클러스터에서 사용하지 않는 멤버 삭제(선택 사항)
기존 노드가 etcd 멤버로 포함되어 있을 경우 kubeadm reset이 실행되면서 자동으로 해당 멤버를 etcd 클러스터에서 제거합니다. 따라서 etcd 클러스터에서 사용하지 않는 멤버를 수동으로 삭제할 필요는 없습니다.
Control Plane 노드를 제거한 후 etcd 클러스터에서 사용하지 않는 멤버를 삭제합니다.
etcdctl을 사용하여 멤버 목록 확인
etcdctl member list
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
사용하지 않는 멤버 삭제
etcdctl member remove <MEMBER_ID>
ETCDCTL_API=3 etcdctl member remove 1c4f53474b88d283 \
--cacert /etc/kubernetes/pki/etcd/ca.crt \
--cert /etc/kubernetes/pki/etcd/server.crt \
--key /etc/kubernetes/pki/etcd/server.key
728x90
4. 클러스터에 연결하기 위해 kubeadm을 사용하여 연결 정보 확인
인증서 업로드
- 새로운 노드에 필요한 인증서를 업로드합니다.
- 클러스터 인증서를 업로드하고 인증서 키를 출력합니다. 이 키는 새로운 Control Plane 노드를 추가할 때 필요합니다.
kubeadm init phase upload-certs --upload-certs
$ kubeadm init phase upload-certs --upload-certs
I0819 11:22:43.055582 4438 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:
a58f4dd0d5e11c7c91c624cf202c7c49a21ea311ada6d0ddd2de7eb999169080
조인 명령어 생성
- 새로운 Control Plane 노드를 클러스터에 조인하기 위해 kubeadm join 명령어를 생성합니다.
- 출력된 명령어는 새로운 노드를 Control Plane으로 조인하는 데 사용됩니다.
kubeadm token create --print-join-command
$ kubeadm token create --print-join-command
kubeadm join 192.168.0.130:6443 --token in5qqr.v2z4eh16wm8hlt6s --discovery-token-ca-cert-hash sha256:5683017bbc98a886a3128cd02757a65ff515433fab24861abed4b0f60d2f64c5
5. 새로운 마스터 노드를 클러스터에 조인
생성된 kubeadm join 명령어를 사용하여 새로운 마스터 노드를 클러스터에 조인합니다.
새 노드를 Control Plane에 추가
kubeadm join 192.168.0.130:6443 \
--token in5qqr.v2z4eh16wm8hlt6s \
--discovery-token-ca-cert-hash sha256:5683017bbc98a886a3128cd02757a65ff515433fab24861abed4b0f60d2f64c5 \
--control-plane \
--certificate-key a58f4dd0d5e11c7c91c624cf202c7c49a21ea311ada6d0ddd2de7eb999169080
...
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.
6. 클러스터 상태 확인
새 마스터 노드 상태 확인
- 새 노드가 클러스터에 정상적으로 추가되었는지 확인합니다.
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready control-plane 2d19h v1.30.4
k8s-master2 Ready control-plane 2d19h v1.30.4
k8s-master3 Ready control-plane 38m v1.30.4
k8s-worker1 Ready <none> 2d19h v1.30.4
파드 상태 확인
- 파드와 서비스가 정상적으로 동작하는지 확인합니다.
kubectl get pods -n kube-system
Control Plane 구성 제거
kubeadm reset 실행
- 기존(k8s-master3) 노드에서 쿠버네티스를 제거합니다.
sudo kubeadm reset -f
Kubelet 및 Containerd 정리
- kubelet과 containerd를 정리합니다.
sudo systemctl --now disable kubelet
sudo systemctl --now disable containerd
sudo apt-get purge -y --allow-change-held-packages \
kubeadm kubelet kubectl kubernetes-cni \
containerd.io
기존 Control Plane 노드를 안전하게 교체하고 새로운 노드를 클러스터에 추가할 수 있습니다.
728x90
'리눅스' 카테고리의 다른 글
[draft] 쿠버네티스 클러스터에서 Worker Node를 재기동하는 방법 (0) | 2024.08.19 |
---|---|
[draft] 쿠버네티스에 Ingress Controller를 설치하고 이를 통해 외부에서 NGINX 웹 서비스에 접근할 수 있도록 설정하는 방법 (0) | 2024.08.19 |
[draft] 쿠버네티스 워커 노드를 설치하고 클러스터에 참여시키기 (0) | 2024.08.14 |
[draft] Cilium CLI를 사용해 Cilium을 설치하는 방법 (0) | 2024.08.14 |
[draft] 쿠버네티스 클러스터에서 Calico 네트워크 플러그인을 설치 (0) | 2024.08.14 |