July 6, 2025

[Home-K8S] #7 k8s 업그레이드

[Home-K8S] #7  k8s 업그레이드

k8s는 4개월 마다 새 릴리즈가 나옵니다. https://kubernetes.io/ko/releases/

제가 홈랩에 설치되어있는 k8s 버전은 1.31.7 버전입니다.
저는 홈랩도 그렇고 게임용 데스크탑도 그렇고 포멧을 자주해서 업그레이드를 한 적은 없고 항상 재설치를 했었습니다.

현재 설치된 1.31 버전이 25-10-28에 지원을 종료한다고 해서 업그레이드를 진행해보려고 합니다. (현재 날짜 25-07-05)

사실 개인용 k8s라서 업그레이드할 필요는 없고 그냥 살아도 되지만 OS를 Talos Linux 로 변경하려고 하는데, 그 전에 업그레이드 한번 해보려고 합니다.

k8s 업그레이드

k8s의 패키지 저장소가 apt 와 yum에 없고, pkgs에만 있습니다.

Kubernetes Legacy Package Repositories Will Be Frozen On September 13, 2023
On August 15, 2023, the Kubernetes project announced the general availability of the community-owned package repositories for Debian and RPM packages available at pkgs.k8s.io. The new package repositories are replacement for the legacy Google-hosted package repositories: apt.kubernetes.io and yum.kubernetes.io. The announcement blog post for pkgs.k8s.io highlighted that we will stop publishing packages to the legacy repositories in the future. Today, we’re formally deprecating the legacy package repositories (apt.kubernetes.io and yum.kubernetes.io), and we’re announcing our plans to freeze the contents of the repositories as of September 13, 2023.

그래서 설치할 때도 pkgs의 패키지 저장소를 보고 있습니다.

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key |
sudo gpg --dearmor -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 update

주의점

  1. 기본적으로 마이너 버전 업그레이드(1.31 -> 1.32) 는 한 단계씩 올라가는 것이 정책상 지원됩니다.
  2. 업그레이드 전에 drain 으로 노드에 스케줄을 못하게 합니다.
    실행 중인 pod는 괜찮습니다.
  3. k8s 버전에 따라 다른 구성도 업그레이드를 진행해야 합니다.
    flannel, nginx, istio 등 사용중인 앱들도 k8s 버전에 지원이 되는지 확인하고 업그레이드 해야합니다.
    1. 예를들어 k8s가 1.30이고 nginx가 1.11.7이 설치되어 있다면
      k8s를 1.31로 업그레이드 하기 전에 nginx를 1.12 버전으로 업그레이드 해야합니다.
https://github.com/kubernetes/ingress-nginx

저는 flannel 과 nginx 둘 다 이미 최신 버전이라 넘어가겠습니다.

ETCD 백업

업그레이드 전에 혹시 모르니까 etcd를 백업합니다.
etcdctl로 etcd의 endpoint로 접근해서 백업을 합니다.

sudo ETCDCTL_API=3 etcdctl snapshot save /root/etcd-$(date +%F).db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key
  1. open /etc/kubernetes/pki/etcd/server.crt: permission denied
    etcdctl을 snap으로 설치하면 호스트 파일을 못 읽습니다.
    APT 패키지로 교체합니다. (안되면 pod 내에서 실행합시)
sudo snap remove etcd
sudo apt-get install -y etcd-client

마스터 노드 업그레이드

Upgrading kubeadm clusters
This page explains how to upgrade a Kubernetes cluster created with kubeadm from version 1.32.x to version 1.33.x, and from version 1.33.x to 1.33.y (where y > x). Skipping MINOR versions when upgrading is unsupported. For more details, please visit Version Skew Policy. To see information about upgrading clusters created using older versions of kubeadm, please refer to following pages instead: Upgrading a kubeadm cluster from 1.31 to 1.32 Upgrading a kubeadm cluster from 1.

마스터 플레인의 kubeadm 부터 업그레이드를 진행합니다.
kubelet을 나중에 업그레이드 합니다.

# 패키지 홀드 해제 & repo 설정
sudo apt-mark unhold kubelet kubeadm kubectl
sudo sed -i 's/v1.31/v1.32/' /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update

# 패키지 변경 및 설치 가능한 패키지 확인
sudo apt-cache policy kubeadm

# kubeadm 설치
sudo apt-get install -y kubeadm=1.32.6-1.1

# 업그레이드 확인
sudo kubeadm upgrade plan
# 업그레이드 적용
sudo kubeadm upgrade apply v1.32.6

# kubelet·kubectl 설치 후 재시작
sudo apt-get install -y kubelet=1.32.6-1.1 kubectl=1.32.6-1.1
sudo systemctl daemon-reload && sudo systemctl restart kubelet

# 패키지 홀
sudo apt-mark hold kubelet kubeadm kubectl

한 5분 정도 걸린 것 같습니다.

워커 노드 업그레이드

워커 노드도 kubeadm 부터 업그레이드 진행합니다. 다만 master와 다른 명령어가 쓰입니다.

sudo apt-mark unhold kubelet kubeadm
sudo apt-get install -y kubeadm=1.32.6-00

# 노드 업그레이드 ---------------------------------------
sudo kubeadm upgrade node

# kubelet 업그레이드 후 재시작 --------------------------------------
sudo apt-get install -y kubelet=1.32.6-00
sudo systemctl restart kubelet
sudo apt-mark hold kubelet kubeadm

마무리

kubeadm upgrade 실행 중에 업그레이드가 실패하고 롤백하지 않으면 다시 실행하면 됩니다.

홈랩이라 노드가 1개씩 밖에 없어서 진행했습니다. 마스터가 여러 개여서 일 때는 진행을 또 다르게 해야 합니다.

etcd는 아무 컨트롤 플레인에서 하나만 뜨면 되지만, endpoint를 3개를 전부 입력해도 됩니다.
Master Node는 1개만 Master Node 업그레이드 하듯이 업그레이드를 진행하고, 다른 Master Node는 워커 노드 업그레이드 하듯이 kubeadm upgrade node 하시면 됩니다.

Comments