쿠버네티스 업그레이드는 쿠버네티스를 구성하는 3가지 패키지의 버전을 한 단계 업그레이드 시키는 것을 말한다.
쿠버네티스를 구성하는 3가지 패키지의 종류와 역할은 다음과 같다.
쿠버네티스 업그레이드는 Master node(Control Plane)을 업그레이드 하는 경우와, worker node를 업그레이드 하는 경우로 나뉜다.
ssh <master>
apt update
# 아래 두 가지 명령어 중 하나를 골라 실행하면 된다.
# 쿠버네티스 공식 문서에서는 전자의 경우로 안내하고 있다.
# 1.
apt-cache madison kubeadm
# 2.
sudo apt list kubeadm --installed --all-versions
sudo -i
명령어를 실행해서 root 계정으로 로그인해주자.apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=[version] && \
apt-mark hold kubeadm
이 명령어를 1.26.1-00 버전 기준으로 작성한 예시는 다음과 같다.apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=1.26.1-00 && \
apt-mark hold kubeadm
kubeadm version
# 일반적인 실행 형태
kubeadm upgrade plan
# 버전 명시 실행 형태
kubeadm upgrade plan v1.26.1
kubeadm upgrade apply v1.26.1
kubectl drain [node name] --ignore-daemonsets
노드 이름은 업그레이드를 실행할 컨트롤 플레인 노드의 이름을 기입해주면 되는데, 이름은 아래와 같이 확인이 가능하다.--ignore-daemonsets
옵션을 같이 사용해준다.kubectl drain k8s-master --ignore-daemonsets
kubernetes에는 Cordon과 Drain이라는 개념이 존재한다.
둘 다 특정한 Node를 Schedular에서 제외시켜 파드가 할당되지 않도록 하는 동작은 동일하지만, Cordon의 경우는 기존에 배포된 파드는 그대로 유지하는 반면에 Drain은 기존에 배포된 파드도 다른 노드로 이동시키는 차이가 있다.
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet='1.26.x-*' kubectl='1.26.x-*' && \
apt-mark hold kubelet kubectl
마찬가지로 sudo 권한이 필요하기 때문에 각 명령어의 앞에 일일이 sudo를 붙여주거나 sudo -i
명령어를 통해 루트 계정으로 전환한 뒤 실행해야한다.sudo systemctl daemon-reload
sudo systemctl restart kubelet
여기까지 정상적으로 진행했다면, 아래와 같이 컨트롤 플레인의 버전이 바뀌어 있어야 한다.kubectl uncordon [node name]
# kubectl uncordon k8s-master
여기까지의 과정이 컨트롤 플레인에 대한 업그레이드였다면, 이후에 워커 노드에 대한 업그레이드는 별도로 진행해주어야 한다.전반적인 진행 과정은 control plane의 업그레이드 과정과 비슷하지만, 약간의 차이가 있다는 점을 유의해서 진행한다.
ssh k8s-worker1
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm='1.26.x-*' && \
apt-mark hold kubeadm
sudo kubeadm upgrade node
위 명령어가 정상적으로 실행되었다면, 아래와 같이 정상적으로 업그레이드가 진행되었다는 메시지를 확인할 수 있다.kubectl drain [node name] --ignore-daemonsets
# kubectl drain k8s-worker1 --ignore-daemonsets
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet='1.26.x-*' kubectl='1.26.x-*' && \
apt-mark hold kubelet kubectl
위 명령어를 실행한 이후에 kubelet을 재실행 해준다.sudo systemctl daemon-reload
sudo systemctl restart kubelet
다음 이미지와 같이 워커 노드의 kubectl 버전 또한 정상적으로 upgrade 되어 있음을 확인할 수 있다.kubectl uncordon [node name]
# kubectl uncordon k8s-worker1
https://v1-26.docs.kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
Upgrading kubeadm clusters 쿠버네티스 공식 문서