본문 바로가기

kubernetes, helm, rancher

kubernetes cluster upgrade

kubernetes의 버전이 빠르게 update 되고 있는 시점에서 update를 어떻게 하면 좋을지 작성해보려고 한다.

 

kubernetes 공식 문서에 cluster upgrade라고 검색하면 나오는데 그 과정을 정리해보겠다.

 

cluster의 version을 upgrade하기 위해서 바로 최신버전으로 upgrade하는 것이 아니고 한단계를 upgrade를 해야한다.

 

master node upgrade -> worker node upgrade at once(한번에) or 한개씩 한개씩. or add new version node.

1. Control plane upgrade

master node를 먼저 upgrade를 하고 worker node를 차근차근 upgrade 하는 방식이다. 만약 node만 upgrade하고 싶다면 이 과정은 생략가능하다.

1-1. find latest kubeadm version

apt update
apt-cache madison kubeadm

1-2. Install kubeadm latest version

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

현재 제가 가지고 있는 version이 v1.22.4이다.

 

 

1-3. Check version

kubeadm version
kubeadm upgrade plan

upgrade이후에 version을 살펴보니 v1.23.1-00으로 바뀌었고,

현재 kubelet을 포함한 여러 component들이 v1.22.4버전을 가지고 있고, 최신버전으로 upgrade 가능하다는 뜻이다.

kubectl get nodes

위 명령어를 통해 보면 여전히 v1.22.4이다.

1-4. kubeadm upgrade

kubeadm upgrade apply v1.23.1

위 명령어를 실행시키면 enjoy를 볼 수 있으며, 다시 "kubeadm upgrade plan"을 통해 kubeadm upgrade는 완료됬음을 알 수 있다.

하지만 kubectl get nodes를 해보시면 다음과 같이 node버전이 안바꼈음을 알 수 있는데, 이는 kubectl version해보시면 똑같이 version이 안바뀌었으며, node 버전은 kubelet 버전을 가리키므로 kubelet, kubectl을 upgrade해주어야한다.

 

1-5. kubectl, kubelet install and upgrade

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

 

sudo systemctl daemon-reload
sudo systemctl restart kubelet

다음과 같이 node version과 kubectl version이 바뀜을 알 수 있다.

 

2. Worker node upgrade

 

2-1. Install kubeadm latest version

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

2-2. Kubeadm upgrade

sudo kubeadm upgrade node

2-3. Drain the node

kubeadm은 upgrade했고, kubelet version을 upgrade하기 위해서 node에 있는 pods을 evict해줘야한다.

kubectl drain <node-to-drain> --ignore-daemonsets

단 위 작업은 kubectl이므로, controlplane에서 해주어야한다.

drain하기 전에는 pod들이 살아있지만, drain하고 나서는 전부 pending으로 바뀌었다. 왜냐하면 control plane에는 pod가 taint때문에 pod가 생성이 안되기 때문이다.

2-4. kubectl, kubelet install and upgrade

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

 

sudo systemctl daemon-reload
sudo systemctl restart kubelet

다음과 같이 제대로 node도 version이 최신으로 upgrade된 것을 확인할 수 있다.

 

2-5. uncordon node

kubectl uncordon <node-to-drain>

drain한 node를 다시 scheduling node에 포함시키기 위해서 uncordon을 한다.