[CKS] 22. Kubernetes Version Upgrade

쿠버네티스 업그레이드로 클러스터 안정성을 확보하고 서비스 중단을 최소화하세요. 제어 영역과 워커 노드의 단계별 업그레이드 방법을 안내합니다.

[CKS] 22. Kubernetes Version Upgrade
Photo by JESHOOTS.COM / Unsplash

개요

Kubernetes 버전 업그레이드 과정을 확인합니다.

etcd와 CoreDNS는 제외한 핵심 Controlplane 구성 요소를 업그레이드 하는 과정을 정리하였으며 이전에 배운 내용들을 기반으로 합니다.

Kubernetes 모든 구성 요소가 같은 버전으로 실행될 필요는 없지만, kube-apiserver만은 다른 구성 요소보다 버전이 같거나 높아야합니다. Controller-manager, Scheduler, kubelet과 kube-proxy 등은 apiserver 대비 한 두 버전 낮더라도 문제가 발생하진 않지만 절대 kube-apiserver 버전 이상의 구성 요소를 실행시킬 수 없습니다.

이러한 허용 가능한 버전 차이 덕분에 한 번에 하나의 구성 요소만 업그레이드할 수 있어 라이브 업그레이드가 용이하며 일반적으로 한 번에 하나씩 마이너 버전을 업그레이드하는 것이 전환 과정에 있어 권장되는 사항입니다.

업그레이드 시기

쿠버네티스는 항상 최신의 세 가지 마이너 버전만 지원합니다. 따라서 최신 버전이 v1.32라면 정식 지원되는 버전은 v1.32를 포함한 v1.31, v1.30입니다. 사용하는 버전이 세 가지 마이너 버전으로 밀려있다면 지원목록에서 변경되기 전 빠른 업그레이드를 권장합니다.

다만 주의할 점은 v1.30에서 v1.32로 점프 업그레이드를 권장하지 않습니다. 하나의 마이너 버전씩 업그레이드를 권장하며 EKS, AKS, GKE같이 관리형 클러스터의 경우 훨씬 간소화된 업그레이드 프로세스를 제공하고 있으니 참고합니다.

그 외 kubeadm을 활용한 클러스터 업그레이드 계획 및 실행을 수행할 수 있으나 수동으로 설정된 경우 각 클러스터의 모든 구성 요소 개별 업그레이드가 필요합니다.

업그레이드 전략

업그레이드 프로세스는 두 가지 단계로 나눕니다.

1. Master Node(Controlplane) 구성 요소 업그레이드

2. Worker Node 업그레이드

Master Node 업그레이드

마스터 노드 업그레이드 중 제어 플레인 구성 요소(API 서버, 스케줄러, 컨트롤러 관리자)에 짧은 다운타임이 발생합니다. 관리 기능(예: kubectl 액세스 및 새 배포)은 일시적으로 사용할 수 없지만, 워커 노드의 워크로드는 계속 사용자에게 서비스를 제공할 수 있습니다. 업그레이드 후 클러스터는 지원되는 혼합 버전 상태(예: 마스터는 v1.32, 워커는 v1.31)로 작동합니다.

Worker Node 업그레이드 전략

Worker를 업그레이드 하기 위해 수행할 수 있는 전략은 여러가지입니다.

1. 모든 노드 업그레이드 하기

  • 워커 노드 업그레이드 완료될 때 까지 다운타임이 발생합니다.

2. 단일 노드씩 업그레이드 하기

  • 작업 부하가 나머지 노드로 조정될 수 있기 때문에 서비스 중지 시간이 최소화됩니다.
  1. 새 워커노드 추가
  • 업데이트 된 버전으로 새 노드를 배포하고 워크로드를 해당 노드로 마이그레이션하고 이전 노드를 해제합니다.

Kubeadm으로 수행하는 경우

kubeadm upgrade plan

---------------------------------------------------------
[preflight] Running pre-flight checks.
[upgrade] Making sure the cluster is healthy:
[upgrade/config] Making sure the configuration is correct:
[upgrade] Fetching available versions to upgrade to

[upgrade/versions] Cluster version: v1.11.8
[upgrade/versions] kubeadm version: v1.11.3

[upgrade/versions] Latest version in the v1.11 series: v1.11.8


Components that must be upgraded manually after you have
upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT       CURRENT   AVAILABLE
Kubelet         3 x v1.11.3 v1.13.4


Upgrade to the latest stable version:


COMPONENT           CURRENT   AVAILABLE

API Server          v1.11.8   v1.13.4
Controller Manager  v1.11.8   v1.13.4
Scheduler           v1.11.8   v1.13.4
Kube Proxy          v1.11.8   v1.13.4

CoreDNS             v1.1.3    v1.1.3
Etcd                3.2.18    N/A


You can now apply the upgrade by executing the following command:

출력에는 다음이 포함됩니다.

  • 현재 클러스터 버전
  • kubeadm 도구 버전
  • 사용 가능한 최신 버전입
  • 제어 평면 업그레이드(일반적으로 kubelet) 후 수동 업그레이드가 필요한 구성 요소 표현

한 번에 하나의 마이너 버전 업그레이드를 수행해야합니다. 따라서 kubeadm부터 하나 위 마이너 버전으로 업그레이드를 수행합니다.

apt-get upgrade -y kubeadm=1.32.0

이후 Controlplane을 업그레이드

kubeadm upgrade apply v1.32

[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.32". Enjoy!


[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.

kubelet 업그레이드

kubeadm은 Cluster 내부 컴포넌트(apiserver, scheduler, proxy, CoreDNS) 등 컨테이너 Pod로 실행되는 구성 요소를 업데이트합니다. 호스트 레벨(OS 설치)로 동작하는 컴포넌트(kubelet, kubeadm, kubectl) 등은 직접적인 업그레이드를 지원하지않습니다.

따라서 master에서 kubelet 업그레이드는 동일하게 수행되어야합니다.

apt-get upgrade -y kubelet=1.32.0-00
systemctl restart kubelet

Worker Node 업그레이드

가동 중지를 방지하고 작업 부하가 안전하게 재조정되도록 하려면 작업자 노드를 한 번에 하나씩 업그레이드해야 합니다. drain 명령어를 통해 애플리케이션에 영향을 주지않고 노드 업그레이를 안전하게 수행할 수 있도록 지원합니다.

kubectl drain node-1

동일하게 kubeadm을 통한 컴포넌트 업그레이드와 kubelet 업그레이드를 수행합니다.

apt-get upgrade -y kubeadm=1.32.0
apt-get upgrade -y kubelet=1.32.0
kubeadm upgrade node config --kubelet-version v1.32.0
systemctl restart kubelet

결론

한 번에 하나의 마이너 버전을 업그레이드하면 클러스터가 정상적으로 작동하고 애플리케이션의 다운타임을 최소화하여 수행할 수 있다는 것을 확인했습니다. 하지만 핵심 구성요소를 제외한 나머지 플러그인, 드라이버, 컨트롤러 등이 존재한다면 이를 업그레이드하기 위한 절차를 각 구성요소 별로 반드시 수행해야합니다.

각 구성 요소의 호환성 매트릭스(Compatibility Matrix)를 참고하거나 etcd backup, 테스트 환경에서 업그레이드 과정을 검증하는 것이 좋습니다.