[CKS] 23. Kubernetes Version Upgrade Demo

Kubeadm을 활용한 쿠버네티스 클러스터 업그레이드 가이드입니다. Control Plane부터 Worker Node까지 단계별로 안전하게 최신 버전을 적용하세요.

[CKS] 23. Kubernetes Version Upgrade Demo
Photo by Clint Patterson / Unsplash

개요

Kubeadm을 통해 클러스터 업그레이드를 진행하는 방법을 확인합니다.

공식 문서는 다음과 같습니다.

Package Repository 업데이트(참고)

쿠버네티스 패키지가 app.kubernetes.ioyum.kubernetes.io에서 호스팅되었지만, v1.28부터 해당 리포지토리들은 더 이상 사용되지 않습니다. 이제 kubectlkubeadm과 같은 도구의 최신 버전을 다운로드하려면 packages.k8s.io를 사용해야 합니다.

OS 확인

# 각 노드의 OS를 확인합니다.
kubectl get nodes

# 다음 명령어도 확인할 수 있습니다.
cat /etc/*release

# OS에 따라 각 저장소의 맞는 코드를 실행합니다.
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
curl -fsSL https://pkgs.k8s.io/core/stable/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# 패키지 목록 업데이트
sudo apt-get update

버전 확인

설치가능한 버전과 버전의 저장소를 확인합니다.

sudo apt-cache madison kubeadm
----------------------------------
kubeadm | 1.29.3-1 | https://pkgs.k8s.io/core/stable/v1.29/deb Packages
kubeadm | 1.29.2-1 | https://pkgs.k8s.io/core/stable/v1.29/deb Packages
kubeadm | 1.29.1-1 | https://pkgs.k8s.io/core/stable/v1.29/deb Packages
kubeadm | 1.29.0-1 | https://pkgs.k8s.io/core/stable/v1.29/deb Packages

Controlplane 업그레이드

1. kubeadm 업그레이드

버전 문자열을 최신 버전(예: 1.29.3-1.1)으로 변경합니다.

sudo apt-mark unhold kubeadm && \
sudo apt-get update && \
sudo apt-get install -y kubeadm='1.29.3-1.1' && \
sudo apt-mark hold kubeadm
kubeadm version: &version.Info{Major:"1", Minor:"29", GitVersion:"v1.29.3", GitCommit:"6813625b7cd706db5c7388921be03071e14a294", GitTreeState:"clean", BuildDate:"2024-03-15T00:06:16Z", GoVersion:"go1.21.8", Compiler:"gc", Platform:"linux/amd64"}

2. upgrade plan

업그레이드를 위해 모의 실행을 수행 가능합니다.

자동으로 업그레이드되는 구성 요소와 수동 업데이트가 필요한 구성 요소(예: kubelet)를 간략하게 출력합니다.

sudo kubeadm upgrade plan

kubelet은 반드시 별도로 업그레이드 해야합니다.

3. upgrade apply

Controlplane에 대한 업그레이드 프로세스를 수행합니다.

인증서 갱신, Static Pod의 Manifest 업데이트 등 진행상황을 확인할 수 있습니다.

sudo kubeadm upgrade apply v1.29.3

노드 버전을 확인할 때 kubectl get nodes표시되는 버전은 kubelet에 해당하기 때문에 업그레이드가 완전 완료될 때까지 v1.28.0이 계속 표시됩니다.

다른 Controlplane 노드가 존재한다면 위 과정은 같지만 upgrade apply 명령어가 달라집니다.

sudo kubeadm upgrade node
# or
sudo kubeadm upgrade apply

3.5 CNI Provider plugin(참고)

다른 CNI 플러그인을 사용하는 경우 해당 플러그인을 업그레이드해야합니다.

해당 자료에서는 Cluster Upgrade 과정만 확인하므로 각 CNI 플러그인 별 자료를 확인해야합니다.

4. kubelet, kubectl upgrade

kubelet을 업그레이드 하기 전 Controlplane을 비워 중단 시간을 최소화합니다.

sudo apt-mark unhold kubelet kubectl && \
sudo apt-get update && \
sudo apt-get install -y kubelet='1.29.3-1.1' kubectl='1.29.3-1.1' && \
sudo apt-mark hold kubelet kubectl

kubelet은 재시작되어야합니다.

sudo systemctl daemon-reload
sudo systemctl restart kubelet

업그레이드가 완료되었다면 버전을 확인하고 스케줄링을 다시 허용해야합니다.

kubectl get nodes
kubectl uncordon controlplane

Worker Node 업그레이드

작업은 유사합니다. kubeadm → kubelet, kubectl 업그레이드

1. kubeadm upgrade & apply

sudo apt-mark unhold kubeadm && \
sudo apt-get update && \
sudo apt-get install -y kubeadm='1.29.3-1.1' && \
sudo apt-mark hold kubeadm
sudo kubeadm upgrade node

2. Worker node upgrade

중단 시간 최소화를 위해 동일하게 워커 노드를 비워 다른 노드로 스케줄합니다.

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

kubelet & kubectl 업데이트

sudo apt-mark unhold kubelet kubectl && \
sudo apt-get update && \
sudo apt-get install -y kubelet='1.29.3-1.1' kubectl='1.29.3-1.1' && \
sudo apt-mark hold kubelet kubectl

kubelet 서비스를 다시 시작합니다.

sudo systemctl daemon-reloadsudo systemctl restart kubelet
kubectl uncordon <node-name>

마지막으로 모든 노드가 업그레이드되었는지 확인해야합니다.

kubectl get nodes