[Kubernetes] 쿠버네티스 클러스터 업그레이드 (v1.21 → v1.22)
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
업그레이드가 이후 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 상태이다.
이를 uncordon 명령을 통해 Pod가 다시 스케줄링 될 수 있게 설정한다.
root@k8s-m:~# kubectl uncordon k8s-m
node/k8s-m uncordoned
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/
'Engineering > Kubernetes (K8S)' 카테고리의 다른 글
[Kubernetes] 쿠버네티스 서비스(Service) Deep Dive - (3) Cluster DNS (0) | 2022.05.18 |
---|---|
[Kubernetes] 쿠버네티스 서비스(Service) Deep Dive - (2) ClusterIP (0) | 2022.05.17 |
[Kubernetes] 쿠버네티스 서비스(Service) - Deep Dive -(1) (0) | 2021.12.26 |
[Kubernetes] 쿠버네티스 레이블 & 어노테이션 (Label, Annotation) - Deep Dive (0) | 2021.12.13 |
[Kubernetes] Volume - Deep Dive (EmptyDir, HostPath, Network Volume) (0) | 2021.11.23 |
댓글