본문 바로가기
K8s/Practices

[K8s] 쿠버네티스 버전 업그레이드 (v1.30 → v1.31)

by okms1017 2024. 11. 17.
728x90

✍ Posted by Immersive Builder  Seong

 

쿠버네티스 버전 정책(Skew Policy)

쿠버네티스 프로젝트는 평균 4개월에 한 번씩 업스트림 마이너 버전을 릴리스합니다. 

그리고 최신 버전을 포함하여 3개의 마이너 버전(v1.29, v1.30, v1.31)을 지원하고 있습니다. (*24.11 기준)

 

따라서 새로운 마이너 버전이 릴리스되는 시점이 쿠버네티스의 버전을 업그레이드하는 적절한 시기가 됩니다. 

참고로 쿠버네티스의 버전은 단계별로 마이너 업그레이드를 진행해야 하며 건너뛸 수 없습니다. 

 

또한, 쿠버네티스의 구성 요소 간에 지원되는 버전 차이는 다음과 같습니다. 

 

  • 구성 요소 중에 kube-apiserver의 버전이 가장 최신이어야 합니다. (x.y)
  • controller-manager, kube-schedular는 kube-apiserver보다 한 버전 낮게 설정할 수 있습니다. (~>x.y-1)
  • kubelet, kube-proxy는 kube-apiserver보다 두 버전 낮게 설정할 수 있습니다. (~>x.y-2)
  • kubectl은 kube-apiserver를 기준으로 한 버전 차이 내에서 지원합니다. (x.y+1, x.y, x.y-1)

 


쿠버네티스 버전 업그레이드 

kubeadm을 이용하여 구성한 쿠버네티스 클러스터의 버전을 업그레이드하는 방법입니다. 

 

클러스터의 버전 업그레이드 작업은 Control-Plane, Worker Nodes 순으로 진행합니다. 

각 노드별로 업그레이드가 필요한 구성 요소는 아래와 같습니다. 

 

  • Control-Plane : kube-apiserver, controller-manager, kube-schedular, kubelet, kube-proxy 
  • Worker Nodes : kubelet, kube-proxy

 

OS 별로 지원하는 업그레이드 명령어가 상이합니다. (*공식문서 참조)

아래 내용은 Ubuntu OS를 기준으로 기술한 가이드입니다. 

 

1. Control-Plane 업그레이드 

Control-Plane을 업그레이드하는 작업은 주요 구성 요소의 일시적인 중단을 발생시킵니다. 따라서 작업하는 동안은 kubectl 명령어 및 쿠버네티스 API 사용, 파드 생성/변경/삭제, 그리고 파드 실패 시 재생성 프로세스 등이 제한됩니다.  

 

  • 쿠버네티스 패키지 레포지토리 변경 (*링크 참조)

$ 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

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

$ sudo apt-get update

 

  • 마이너 버전의 업그레이드 가능한 최신 패치 목록 조회

$ 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.31.x-*' && \
sudo apt-mark hold kubeadm

 

$ kubeadm version

 

  • 업그레이드 계획 검증 

$ sudo kubeadm upgrade plan

 

  • Control-Plane 업그레이드 

$ sudo kubeadm upgrade apply v1.31.x

 

# proceed if it is multi-control-plane-nodes

$ sudo kubeadm upgrade node

 

  • CoreDNS 등 파드 축출 (Drain)

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

 

  • kubelet / kubectl 업그레이드 

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

 

  • kubelet 재시작

$ sudo systemctl daemon-reload
$ sudo systemctl restart kubelet

 

  • Uncordon

$ kubectl uncordon <control-plane-node>

 


2. Worker Nodes 업그레이드 

Worker Nodes는 한 번에 하나의 노드를 대상으로 업그레이드를 진행합니다.  

그리고 목표한 버전에 도달할 때까지 마이너 업그레이드 작업을 노드마다 반복하여 수행합니다.  

 

  • 쿠버네티스 패키지 레포지토리 변경 (위와 동일)

$ 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

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

$ sudo apt-get update

 

  • kubeadm 업그레이드

$ sudo apt-mark unhold kubeadm && \

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

 

$ kubeadm version

 

  • Worker Node 업그레이드 

$ sudo kubeadm upgrade node

 

  • 워크로드 파드 축출 (Drain)

$ kubectl drain <worker-node-01> --ignore-daemonsets

 

  • kubelet / kubectl 업그레이드 

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

 

  • kubelet 재시작

$ sudo systemctl daemon-reload
$ sudo systemctl restart kubelet

 

  • Uncordon

$ kubectl uncordon <worker-node-01>

 

 


[출처]

1) https://kubernetes.io/releases/version-skew-policy/

 

Version Skew Policy

The maximum version skew supported between various Kubernetes components.

kubernetes.io

2) https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

 

Upgrading kubeadm clusters

This page explains how to upgrade a Kubernetes cluster created with kubeadm from version 1.30.x to version 1.31.x, and from version 1.31.x to 1.31.y (where y > x). Skipping MINOR versions when upgrading is unsupported. For more details, please visit Versio

kubernetes.io

3) https://kubernetes.io/blog/2023/08/15/pkgs-k8s-io-introduction/

 

pkgs.k8s.io: Introducing Kubernetes Community-Owned Package Repositories

On behalf of Kubernetes SIG Release, I am very excited to introduce the Kubernetes community-owned software repositories for Debian and RPM packages: pkgs.k8s.io! The new package repositories are replacement for the Google-hosted package repositories (apt.

kubernetes.io

4) https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/upgrading-linux-nodes/

 

Upgrading Linux nodes

This page explains how to upgrade a Linux Worker Nodes created with kubeadm. Before you begin You need to have shell access to all the nodes, and the kubectl command-line tool must be configured to communicate with your cluster. It is recommended to run th

kubernetes.io

728x90