[CKA] kubeadm 클러스터 업그레이드

control plane부터 worker node까지 kubeadm 클러스터를 순서대로 업그레이드하는 절차를 정리합니다.

kubeadm 클러스터는 control plane을 먼저 업그레이드하고 worker node를 한 대씩 이어서 처리합니다. 각 노드는 작업 전에 drain하고 kubelet 재시작 후 uncordon합니다.

아래 예시는 v1.30에서 v1.31 계열로 이동하는 흐름입니다. 실제 설치 버전 문자열은 apt-cache madison 결과와 Kubernetes의 version skew policy를 확인해 정합니다.

패키지 저장소 전환

pkgs.k8s.io 저장소는 minor 버전별 경로를 사용합니다. v1.31 패키지를 조회하기 전에 업그레이드할 모든 노드에서 저장소를 v1.31 채널로 바꿉니다.

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key \
  | sudo gpg --dearmor --yes -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' \
  | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update

이후 apt-cache madison kubeadm에 표시되는 정확한 v1.31 patch 패키지 문자열을 아래 <1.31.x-package-version> 자리에 사용합니다. 예를 들어 출력에 epoch나 배포판 suffix가 있다면 그것까지 포함합니다.

control plane

kubectl drain <control-plane-node> --ignore-daemonsets

sudo apt-mark unhold kubeadm
sudo apt-get update
sudo apt-cache madison kubeadm
sudo apt-get install -y kubeadm='<1.31.x-package-version>'
sudo apt-mark hold kubeadm

sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.31.x

클러스터 구성을 올린 뒤 kubelet과 kubectl을 같은 minor 버전으로 맞춥니다.

sudo apt-mark unhold kubelet kubectl
sudo apt-get install -y kubelet='<1.31.x-package-version>' kubectl='<1.31.x-package-version>'
sudo apt-mark hold kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet

kubectl uncordon <control-plane-node>

worker node

control plane에서 worker node를 drain한 뒤 해당 노드에서 kubeadm upgrade node를 실행합니다.

kubectl drain <worker-node> --ignore-daemonsets
sudo apt-mark unhold kubeadm
sudo apt-get update
sudo apt-get install -y kubeadm='<1.31.x-package-version>'
sudo apt-mark hold kubeadm
sudo kubeadm upgrade node

sudo apt-mark unhold kubelet kubectl
sudo apt-get install -y kubelet='<1.31.x-package-version>' kubectl='<1.31.x-package-version>'
sudo apt-mark hold kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet

다시 control plane에서 노드를 스케줄 가능 상태로 바꾸고 버전과 Pod 상태를 확인합니다.

kubectl uncordon <worker-node>
kubectl get nodes
kubectl get pods -A -o wide

세부 버전과 저장소 전환 단계는 실행 시점의 kubeadm 클러스터 업그레이드 공식 문서를 기준으로 확인합니다. minor 버전을 건너뛰는 업그레이드는 지원되지 않습니다.