본문 바로가기

리눅스

[draft] 쿠버네티스 클러스터에서 Control Plane을 새로운 노드로 교체하는 방법

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