Engineering/Kubernetes (K8S)

[Kubernetes] 쿠버네티스 클러스터 업그레이드 (v1.21 → v1.22)

[앙금빵] 2022. 2. 8.

Prerequisite. 업그레이드 버전 결정

# OS 업데이트 후 1.22 버전 중 최신 버전을 찾자.
apt update
apt-cache madison kubeadm

1.22.6 버전이 쿠버네티스 1.22 버전 중 최신 버전임을 알 수 있다.

 

Step 1. Control-Plane(Master Node) 업그레이드

 

1-1. kubeadm 업그레이드

# 1-1-1. kubeadm 업그레이드

apt-mark unhold kubeadm && apt-get update && apt-get install -y \\
kubeadm=1.22.6-00 && apt-mark hold kubeadm

# 1-1-2. kubeadm version 확인

root@k8s-m:~# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.6", GitCommit:"f59f5c2fda36e4036b49ec027e556a15456108f0", GitTreeState:"clean", BuildDate:"2022-01-19T17:31:49Z", GoVersion:"go1.16.12", Compiler:"gc", Platform:"linux/amd64"}

# 1-1-3. upgrade plan 확인
root@k8s-m:~# kubeadm upgrade plan

# 1-1-3. upgrade 적용
root@k8s-m:~# kubeadm upgrade apply v1.22.6

 

1-1-3. upgrade plan 확인

 

1-1-4. upgrade 적용

 

업그레이드가 이후 kubeadm upgrade plan 명령어를 통해 한번 더 확인해 보자.

정상적으로 업그레이드가 진행되었다면 아래 그림과 같이 별도의 권장을 하지 않는다.

 

 

1-2. KUBECTL & KUBELET 업그레이드

# 노드 확인
root@k8s-m:~# kubectl get node
NAME     STATUS   ROLES                  AGE    VERSION
k8s-m    Ready    control-plane,master   110d   v1.21.4
k8s-w1   Ready    <none>                 110d   v1.21.4
k8s-w2   Ready    <none>                 110d   v1.21.4
k8s-w3   Ready    <none>                 110d   v1.21.4

kubectl get nodes 명령어를 통해 보았을 때 아직 v1.21.4 버전으로 보인다.

이는 kubelet 이 아직 업그레이드가 되지 않아서 그렇다.

 

그렇다면 이제 kubelet 과 kubectl 을 업그레이드 해보자.

 

1-3. Drain Control Plane node

업그레이드 전 node 들을 drain을 해준다. drain 상태에서는 Pod가 더는 할당되지 않게 taint 시킬 뿐 아니라 노드 내 존재하는 Pod들을 Evict(퇴거)시킨다.

 

root@k8s-m:~# kubectl drain k8s-m --ignore-daemonsets

 

1-4. Kubelet & Kubectl 업그레이드

# kubelet, kubectl 버전에 최신 버전 기입

apt-mark unhold kubelet kubectl && \\
apt-get update && apt-get install -y kubelet=1.22.6-00 kubectl=1.22.6-00 && \\
apt-mark hold kubelet kubectl

 

1-5. kubelet 재시작 및 버전 확인

root@k8s-m:~# systemctl daemon-reload
root@k8s-m:~# systemctl restart kubelet
root@k8s-m:~# systemctl enable kubelet

root@k8s-m:~# kubectl get nodes
NAME     STATUS                     ROLES                  AGE    VERSION
k8s-m    Ready,SchedulingDisabled   control-plane,master   111d   v1.22.6
k8s-w1   Ready                      <none>                 110d   v1.21.4
k8s-w2   Ready                      <none>                 110d   v1.21.4
k8s-w3   Ready                      <none>                 110d   v1.21.4

 

정상적으로 마스터노드가 업그레이드 됬는지 확인해 보자.

controlplane이 정상적으로 v1.22.6 버전으로 업그레이드가 된 것을 확인할 수 있다.

 

1-6. uncordon node

 

그러나 앞서 업그레이드 전 drain 명령으로 Scheduling이 Disabled 상태이다.

drain 상태

 

이를 uncordon 명령을 통해 Pod가 다시 스케줄링 될 수 있게 설정한다.

root@k8s-m:~# kubectl uncordon k8s-m
node/k8s-m uncordoned

uncordon 을 통한 원복

 


 

Step 2. Worker Node 업그레이드

 

Worker Node 업그레이드 진행 시 workload를 충족할 수 있을 만큼의 여분의 노드를 남긴 상황에서 업그레이드를 진행해야 한다.

 

2-1. kubeadm 업그레이드

# 2-1-1. kubeadm 업그레이드

apt-mark unhold kubeadm && \\
apt-get update && apt-get install -y kubeadm=1.22.6-00 && \\
apt-mark hold kubeadm

 

2-2. kubelet configuration 업그레이드

root@k8s-w1:~# kubeadm upgrade node

 

2-3. Drain Worker Node

root@k8s-m:~# kubectl drain k8s-w1 --ignore-daemonsets

 

kubectl 명령이기에 Worker node가 아닌 Master Node에서 Drain 작업을 진행해야 한다.

 

2-4. Kubelet & Kubectl 업그레이드

apt-mark unhold kubelet kubectl && \\
apt-get update && apt-get install -y kubelet=1.22.6-00 kubectl=1.22.6-00 && \\
apt-mark hold kubelet kubectl

 

2-5. kubelet 재시작

root@k8s-w1:~# systemctl daemon-reload
root@k8s-w1:~# systemctl restart kubelet
root@k8s-w1:~# systemctl enable kubelet

 

2-6. Uncordon Worker Node

root@k8s-m:~# kubectl uncordon k8s-w1
node/k8s-w1 uncordoned

 

2-7. Worker Node 업그레이드 확인


참조. 쿠버네티스 공식문서

https://kubernetes.io/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

 

댓글