[CKA] Kubernetes 버전과 클러스터 업그레이드

Kubernetes 버전과 클러스터 업그레이드의 핵심 개념과 구성 방법, 실습 풀이를 정리합니다.

kubectl get nodes 를 사용하면 쿠버네티스의 버전을 확인할 수 있습니다.
Major, Minor, Patch로 나뉘며 항상 업데이트되며 표준 소프트웨어 릴리스 버전 관리 절차를 따릅니다.

Version number

컨트롤 플레인의 모든 구성요소는 버전 번호가 다른 구성 요소들이 있을 수 있다는 것을 알아야합니다.
특히 etcd와 CoreDNS는 각 다른 프로젝트로 고유 버전을 가지고 있습니다.

버전 업그레이드 방법

Kubernetes 구성 요소는 공식 version skew 범위 안에서 서로 다른 마이너 버전을 사용할 수 있습니다.

API 서버가 여러 개인 고가용성 클러스터에서는 API 서버 간 skew 조건도 함께 확인해야 합니다.

또한 업그레이드에 있어서 한 번에 마이너 버전 하나씩 업그레이드하는 것을 권장하며, 업그레이드 프로세스는 모두 클러스터 설정에 있습니다
다른 kubernetes provider를 사용한다면 클릭 몇번으로 쉽게 업그레이드 할 수 있지만 kubeadm으로 배포했다면 다양한 구성 요소를 직접 업그레이드 해야합니다.

업그레이드 단계

kubeadm으로 설치한 경우를 가정합니다.

  1. 마스터 노드 업그레이드
    1. 마스터가 업그레이드 되는 동안 각 구성 요소는 잠시 다운되지만 마스터가 다운 되었다고 하여 클러스터 상의 워커들과 앱이 영향을 받진 않습니다.
    2. 단 kubectl이나 다른 k8s api를 통해 클러스터에 엑세스, 배포, 삭제, 수정 및 고가용성이 동작하지 않습니다.
    3. 다시 복구 된다면 정상적으로 동작합니다.
  2. 워커 노드 업그레이드
    1. 작업자 노드 업그레이드에는 다양한 전략이 사용됩니다.
      1. 한 번에 업그레이드 되는 경우 파드가 다운되며 앱 접속에 문제가 발생합니다.
      2. 노드 하나씩 업그레이드 하면 마스터가 업그레이드 되길 기다린 후 각 노드가 하나씩 업그레이드 되며 노드에 속한 파드는 다른 파드로 이동합니다.
      3. 새로운 버전을 가진 노드를 추가하여 새로운 노드를 빠르게 프로비저닝한 뒤 새 노드로 옮길 수 있습니다.

kubeadm upgrade plan 을 통해 많은 정보를 얻어 cotrollplane, apiserver를 확인할 수 있습니다. 또한 어떤 버전으로 업그레이드 되어야하는지 확인할 수 있습니다.
주의해야할 점은 kubeadm은 kubelet을 설치하거나 업그레이드 하지 않습니다.
따라서 업데이트되었다고 했을 때 kubectl get nodes 를 한다고 하여 바로 확인되지 않습니다. kubelet을 따라가기 때문이며 마지막으로 kubelet 업그레이드를 진행해야합니다.

master node → kubelet → worker node

작업자 노드에서 drain하여 노드의 스케줄을 조정할 때 작업자 노드에서도 각 kubeadm과 kubelet 패키지 업데잍를 진행해야합니다.
마찬가지로 kubeadm과 kubelet 패키지를 업데이트 하고 다시 시작합니다.
uncordon을 빼먹지 않고 설정해야 파드와 deployment 서비스가 문제없이 동작할 수 있습니다.

Upgrading kubeadm clusters

Upgrading kubeadm clusters
Changing The Kubernetes Package Repository
문서를 계속 읽어보면 진행할 수 있습니다.

반드시 패키지 리포지토리 변경 사항을 추적해야합니다.
Kubernetes 클러스터 업그레이드의 일반적인 순서는 다음과 같습니다:

  1. kubeadm
  2. 클러스터 (Control Plane 컴포넌트)
  3. 마스터 노드 (Control Plane 노드)
  4. kubectl
  5. 워커 노드
    이 순서를 더 상세히 설명하겠습니다:
  6. kubeadm: 클러스터 관리 도구를 먼저 업그레이드합니다.
    • kubernetes 패키지 저장소를 업데이트 해야합니다.
      • ubuntu/debian 환경에서 apt 형식으로 변경되었습니다.
      • 각 Kubernetes 버전은 특정 저장소에서 관리됩니다.
      • 새로운 버전으로 업그레이드하려면 해당 버전의 패키지에 접근해야 합니다.
      • vim /etc/apt/sources.list.d/kubernetes.list
      • deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /
      • apt update
      • apt-cache madison kubeadm
      • apt-get install kubeadm=1.30.0-1.1
        • 패키지의 빌드버전 확인
        • CoreDNS, kube-proxy 또한 마찬가지로 즉시 업데이트 됩니다.
    • kubeadm upgrade plan
    • kubeadm upgrade apply v1.xx.x
  7. 클러스터: Control Plane 컴포넌트(예: API 서버, 컨트롤러 매니저, 스케줄러)를 업그레이드합니다.
    • 이는 kubeadm upgrade apply 과정 중 자동으로 수행됩니다.
  8. 마스터 노드: Control Plane 노드의 kubelet과 기타 컴포넌트를 업그레이드합니다.
    • apt-get install kubelet=1.30.0-1.1
    • systemctl restart kubelet
    • kubelet과 kubectl 패키지 업그레이드
    • kubelet 서비스 재시작
    • 모든 파드가 종료되므로 영향을 받지 않기 위해선 다른 controlplane 노드로 옮겨야합니다.
    • kubectl uncordon controlplane
  9. kubectl: 관리 도구인 kubectl을 업그레이드합니다.
    • 패키지 매니저를 통해 업그레이드
  10. 워커 노드: 마지막으로 각 워커 노드를 업그레이드합니다.
    • 작업 노드의 업그레이드 수행 전 모든 노드를 drain해야합니다.
      1. ssh node01
      2. k8s apt 리포지토리 변경
        1. vim /etc/apt/sources.list.d/kubernetes.list
        2. deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /
      3. 업그레이드 가능한 최신 버전의 패키지 정보 조회
        1. apt update
        2. apt-cache madison kubeadm
      4. kubeadm 패키지 업그레이드
        1. apt-get install kubeadm=1.30.0-1.1
        2. kubeadm upgrade node
      5. kubelet 패키지 업그레이드 및 재시작
        1. apt-get install kubelet=1.30.0-1.1
        2. systemctl daemon-reload
        3. systemctl restart kubelet
      6. 노드 스케줄 등록
        1. kubectl uncordon node1

정리하면 다음과 같습니다.
마스터 노드 (Control Plane) 업그레이드:

  1. 마스터 노드 drain
  2. 마스터 노드의 kubeadm 업그레이드
  3. kubeadm upgrade apply 실행 (Control Plane 컴포넌트 업그레이드)
  4. 마스터 노드의 kubelet, kubectl 업그레이드
  5. kubelet 재시작
  6. 마스터 노드 uncordon

워커 노드 업그레이드:

  1. 워커 노드 drain
  2. 워커 노드의 kubeadm 업그레이드
  3. kubeadm upgrade node 실행
  4. 워커 노드의 kubelet 업그레이드 (kubectl은 선택적)
  5. kubelet 재시작
  6. 워커 노드 uncordon