Cluster Upgrade Process

Yu Sang Min·2025년 6월 12일

CKA

목록 보기
42/110

공식 문서 : https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

  • 쿠버네티스가 소프트웨어 릴리스 관리 방법과 구성 요소 마다 버전이 다른것을 알아봤다.
  • ETCD, CoreDNS 는 외부 구성요소에 의존
  • Controlplane의 구성요소에 주목하자

    출처 : kodekloud

📌 모두 같은 버전을 사용해야 하는가?

  • 그렇지 않다. 다른 릴리스로 갈 수있다
  • 하지만 다른 어떤 구성 요소도 kube-apiserver 보다 높은 버전을 사용할 순 없다
  • Controller-managerkube-scheduler는 한 버전은 더 낮출 수 있다
  • kubelet이나 kube-proxy는 두 버전 이상 낮을 수 있다
  • kubectlkube-apiserver 보다 한 버전 더 높을 수 있다

❓ 언제 업그레이드 하는가?

  • v1.13이 릴리스 되면서 지원이 종료되는 v1.10을 사용하고 있을때 업그레이드 하기 좋음
  • 한번에 v1.10에서 v1.13으로 업그레이드 하는 것이 아니라 마이너 버전 하나씩 업그레이드

💡 팁

  • GCP 같은 경우 클러스터를 쉽게 업그레이드 하게 해준다
  • 만약 구성요소를 다른 버전으로 사용하고 있었다면 수동으로 업그레이드 해야한다.

🛄 업그레이드 전략

👉🏻 프로덕션 환경이라 가정

  1. 마스터 노드를 우선적으로 업그레이드 한다
  • controlplane의 구성요소는 (API 서버, 스케줄러, 컨트롤러 매니저 등) 잠시 다운 된다.
  • 마스터가 다운된다고 클러스터 상의 워커 노드의 pod들이 영향을 받지 않는다
  • 하지만 마스터가 다운됐으니 관리 기능은 다운됨
  • kubectl 또는 다른 K8S API를 이용해 클러스터에 액세스 할 수 없다.
    • 새 앱을 배포하거나 기존 앱을 삭제, 수정 불가능
    • controller-manager도 동작하지 않음 👉🏻 pod가 다운되면 자동으로 생성되지 않음

  1. 워커 노드를 업그레이드 한다 (세 가지 전략)

1). 한 꺼번에 모든 워커노드를 업그레이드 한다

  • 가동 중지 시간이 필요한 전략이다

2). 한번에 노드를 하나씩 업그레이드 한다

3). 클러스터에 새로운 소프트웨어 버전을 가진 노드를 추가한다

  • 클라우드 환경에서 특히 편리하다
  • 새 노드를 프로비전 하고 오래된 노드를 제거한다

📦 kubeadm - upgrade

master node upgrade

  • kubeadm에는 업그레이드를 위한 명령어가 존재한다
controlplane:~$ kubeadm upgrade plan 
[preflight] Running pre-flight checks.
[upgrade/config] Reading configuration from the "kubeadm-config" ConfigMap in namespace "kube-system"...
[upgrade/config] Use 'kubeadm init phase upload-config --config your-config.yaml' to re-upload it.
[upgrade] Running cluster health checks
[upgrade] Fetching available versions to upgrade to
[upgrade/versions] Cluster version: 1.32.1   // 현재 클러스터의 버전 정보
[upgrade/versions] kubeadm version: v1.32.1  // 현재 kubeadm 의 버전 정보
I0612 02:52:03.294691   10439 version.go:261] remote version is much newer: v1.33.1; falling back to: stable-1.32
[upgrade/versions] Target version: v1.32.5
[upgrade/versions] Latest version in the v1.32 series: v1.32.5  // 최신 버전과 안정 버전에 대한 정보

Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT   NODE           CURRENT   TARGET
kubelet     controlplane   v1.32.1   v1.32.5
kubelet     node01         v1.32.1   v1.32.5
// 수동으로 업그레이드 해야하는 kubele에 대한 버전 정보

Upgrade to the latest version in the v1.32 series:
// 업그레이드 가능한 controllplane의 구성 요소에 대한 버전 정보

COMPONENT                 NODE           CURRENT    TARGET
kube-apiserver            controlplane   v1.32.1    v1.32.5
kube-controller-manager   controlplane   v1.32.1    v1.32.5
kube-scheduler            controlplane   v1.32.1    v1.32.5
kube-proxy                               1.32.1     v1.32.5
CoreDNS                                  v1.11.3    v1.11.3
etcd                      controlplane   3.5.16-0   3.5.16-0

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

        kubeadm upgrade apply v1.32.5

Note: Before you can perform this upgrade, you have to update kubeadm to v1.32.5.

_____________________________________________________________________


The table below shows the current state of component configs as understood by this version of kubeadm.
Configs that have a "yes" mark in the "MANUAL UPGRADE REQUIRED" column require manual config upgrade or
resetting to kubeadm defaults before a successful upgrade can be performed. The version to manually
upgrade to is denoted in the "PREFERRED VERSION" column.

API GROUP                 CURRENT VERSION   PREFERRED VERSION   MANUAL UPGRADE REQUIRED
kubeproxy.config.k8s.io   v1alpha1          v1alpha1            no
kubelet.config.k8s.io     v1beta1           v1beta1             no
_____________________________________________________________________
  • kubectl이 아니고 kubeadm이다!
  • 현재 클러스터의 버전, kubeadm의 버전, 안정적인 최신버전 등의 정보를 얻을 수 있다
  • controlplane의 구성 요소 현재 버전이 표시되고 업그레이드 가능한 버전의 정보도 얻을 수 있다
  • controllplane 구성 요소를 업글 한 뒤에 노드에서 수동(manually)으로 kubelet 버전을 업그레이드 해야 한다
  • kubeadmkubelet의 버전을 절대 업그레이드 하지 않는다
  • 클러스터를 업그레이드 하기 전에 kubeadm 도구부터 업그레이드 한다
  • kubeadm 툴은 K8S와 같은 소프트웨어 사용
  • 한 번에 하나의 마이너 버전으로만 업그레이드 가능
    (v1.10 > v1.11)

  • 위 이미지에 명령어로 kubeadm과 클러스터를 업그레이드
  • 위 이미지에서 kubectl get node 명령어로 조회된 버전은 kube-apiserver 자체의 버전이 아닌 kubelet의 버전임
  • 이 후에 kubelet 을 수동으로 업그레이드 해야함
  • 마스터 노드에서 kubelet이 실행될 수도 아닐 수도 있음
    • kubeadm으로 배포된 클러스터에는 마스터노드에 kubelet 이 존재한다.
  • kubelet을 설치하고 재기동 하면 kubectl get nodes 명령어로 조회시 해당 노드의 버전이 업그레이드 되어있음을 확인

worker node upgrade

  1. 먼저 실행중인 앱들을 다른 노드로 옮겨야함
    • kubectl drain node01 명령어로 해당 노드의 모든 pod를 안전하게 종료한다
  2. 이후 마스터노드에서 했던것 처럼 명령어로 업그레이드
$ apt-get upgrade -y kubeadm-1.12.0-00
$ apt-get upgrade -y kubelet-1.12.0-00
$ kubeadm upgrade node config --kubelet-version v1.12.0
$ systemctl restart kubelet
  • 이후에 drain 된 노드가 온라인이 되어도 스케줄링 되지 않기 때문에 다음 명령어를 통해 다시 스케줄링 해준다
$ kubectl uncordon node01
  • 이 명령어 이후에도 pod가 바로 노드로 돌아올 필요는 없고 스케줄이 가능하다고 만 표시되어 있을것임

위와같은 절차로 모든워커 노드를 업그레이드 한다!

profile
React, Node.js, AWS, Git, Github, Github Action, Docker, K8S

0개의 댓글