• kubernetes
  • certification

kubeadm으로 쿠버네티스 클러스터 업그레이드하기

Drain과 Cordon 개념부터 kubeadm, kubelet, kubectl을 Master Node와 Worker Node 순서로 업그레이드하는 절차를 정리한다.

시리즈 · Kubernetes3 / 4
  1. 쿠버네티스 기본 오브젝트: Pod, ReplicaSet, Deployment, Service
  2. 쿠버네티스 Volume: PV, PVC, StorageClass
  3. kubeadm으로 쿠버네티스 클러스터 업그레이드하기
  4. CKA 2025 개정 시험 합격 후기

kubeadm으로 구성한 클러스터의 kubeadm, kubelet, kubectl 버전을 업그레이드하는 방법을 정리한다. 버전별 상세 절차는 공식 문서를 참조하면 된다.

Drain과 Cordon

Node를 업그레이드하는 동안 그 Node에서 애플리케이션이 실행 중이면 서비스 다운타임이 발생한다. 다운타임을 최소화하기 위해 Drain과 Cordon을 사용한다.

Drain

  • Node를 스케줄링 불가 상태로 만들어 새로운 Pod가 할당되지 않게 한다.
  • 실행 중인 Pod를 Node에서 내보낸다. ReplicaSet 등 컨트롤러가 관리하는 Pod는 다른 Node에 다시 생성된다.
  • Node를 비울 때 사용한다.
kubectl drain <node-name>

Cordon

  • Node에 NoSchedule Taint를 적용해 새로운 Pod가 할당되지 않게 한다.
  • 실행 중인 Pod는 그대로 유지된다.
  • Node 점검 시 활용한다.
kubectl cordon <node-name>

Uncordon

  • Node에 적용된 NoSchedule Taint를 제거해 다시 스케줄링이 가능하게 한다.
kubectl uncordon <node-name>

drain 시 Pod가 다른 노드로 옮겨지는 과정을 보여주는 애니메이션

그림 출처: passwd.tistory.com

Master Node 업그레이드

Master Node부터 업그레이드한다. kube-apiserver의 버전은 kubectl을 제외한 control plane의 다른 모든 컴포넌트보다 높거나 같아야 한다는 점에 주의한다.

먼저 설치 가능한 버전을 조회한다.

sudo apt update
sudo apt-cache madison kubeadm

원하는 버전의 kubeadm을 설치한다.

sudo apt-mark unhold kubeadm && \
sudo apt-get update && sudo apt-get install -y kubeadm='1.32.x-*' && \
sudo apt-mark hold kubeadm

버전을 찾을 수 없다는 오류가 날 때

E: Version '1.32.0-*' for 'kubeadm' was not found 오류가 발생한다면, APT 리포지토리 설정이 이전 마이너 버전을 가리키고 있기 때문이다. 패키지 리포지토리 변경 문서를 따라 수정해야 한다.

/etc/apt/sources.list.d/kubernetes.list를 열어 보면 다음과 같이 되어 있다.

deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /

여기서 v1.31을 v1.32로 변경하면 된다.

업그레이드 진행

sudo kubeadm upgrade apply v1.32.x

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

sudo apt-mark unhold kubelet kubectl && \
sudo apt-get update && sudo apt-get install -y kubelet='1.32.x-*' kubectl='1.32.x-*' && \
sudo apt-mark hold kubelet kubectl

sudo systemctl daemon-reload
sudo systemctl restart kubelet

kubectl uncordon <node-to-uncordon>

Worker Node 업그레이드

Master Node가 끝나면 Worker Node를 진행한다. 절차는 동일하고 두 가지만 다르다.

  • kubeadm upgrade apply v1.32.x 대신 kubeadm upgrade node를 실행한다.
  • kubectl drain과 kubectl uncordon은 Worker Node가 아니라 Master Node에서 실행해야 한다.