k8s upgrade

김호현·2023년 10월 12일
0

CKA

목록 보기
6/10

Kubernetes Upgrade

쿠버네티스 업그레이드는 쿠버네티스를 구성하는 3가지 패키지의 버전을 한 단계 업그레이드 시키는 것을 말한다.
쿠버네티스를 구성하는 3가지 패키지의 종류와 역할은 다음과 같다.

  1. kubeadm
    클러스터를 부트스트랩하는 명령
  2. kubelet
    Pod와 Container의 시작과 같은 작업을 수행하는 컴포넌트
  3. kubectl
    Cluster와 통신하기 위한 Command Line Utility

쿠버네티스 업그레이드는 Master node(Control Plane)을 업그레이드 하는 경우와, worker node를 업그레이드 하는 경우로 나뉜다.

Control Plane(마스터 노드) upgrade (Ubuntu 22.04 기준)

  1. upgrade를 진행할 마스터 노드 접속
    ssh <master>

  2. upgrade 진행할 버전 확인
    apt update
    # 아래 두 가지 명령어 중 하나를 골라 실행하면 된다.
    # 쿠버네티스 공식 문서에서는 전자의 경우로 안내하고 있다.
    # 1.
    apt-cache madison kubeadm
    # 2.
    sudo apt list kubeadm --installed --all-versions
  3. upgrade 준비
    이 단계는 kubeadm 패키지를 업그레이드 시키고자 하는 버전을 repo에서 다운받고 kubeadm에 적용한다.
    이 단계를 진행할 때는 root 권한이 필요하다. 각각의 명령어 앞에 sudo를 붙여주거나, 진행에 앞서 sudo -i 명령어를 실행해서 root 계정으로 로그인해주자.
    apt-mark unhold kubeadm && \
    apt-get update && apt-get install -y kubeadm=[version] && \
    apt-mark hold kubeadm
    이 명령어를 1.26.1-00 버전 기준으로 작성한 예시는 다음과 같다.
    apt-mark unhold kubeadm && \
    apt-get update && apt-get install -y kubeadm=1.26.1-00 && \
    apt-mark hold kubeadm
  4. kubeadm version 확인
    현재 설치된 kubeadm 패키지 버전을 확인한다.
    kubeadm version
  5. 업그레이드 계획 확인
    이 단계에서는 kubeadm 업그레이드가 가능한지를 점검한다.
    명령어는 일반적인 형태로 사용할 수도 있고, 특정 버전을 명시해줄 수도 있다.
    # 일반적인 실행 형태
    kubeadm upgrade plan
    # 버전 명시 실행 형태
    kubeadm upgrade plan v1.26.1

  6. 업그레이드 수행
    업그레이드 플랜을 확인했다면, 이제 본격적인 업그레이드를 수행해주면 된다.
    이전 단계에서 플랜을 확인했을 때, 아래와 같이 apply 명령어가 출력되는 것을 확인할 수 있다.
    위의 명령어를 복사한 뒤 그대로 실행하면 업그레이드가 수행된다.
    kubeadm upgrade apply v1.26.1
  7. 노드 드레인
    특정한 노드를 Schedular에서 제외시켜 Pod가 할당되지 않게 하고, 기존에 배포된 Pod를 다른 Node로 이동시킨다.
    노드를 업데이트하는 경우에 활용할 수 있다.

    위 사진과 같이 현재 컨트롤 플레인에서 실행 중인 etcd, API Server, coreDNS 등의 Pod들을 비우기 위해 사용한다.
    kubectl drain [node name] --ignore-daemonsets
    노드 이름은 업그레이드를 실행할 컨트롤 플레인 노드의 이름을 기입해주면 되는데, 이름은 아래와 같이 확인이 가능하다.

    이렇게 완성한 명령어를 입력해주면 노드 드레인이 실행된다.
    데몬셋으로 생성된 파드는 삭제해도 데몬셋에 의해 즉시 재실행되므로, 데몬셋이 존재할 경우 drain이 실패하게 된다. 이럴 경우 --ignore-daemonsets 옵션을 같이 사용해준다.
    kubectl drain k8s-master --ignore-daemonsets

    kubernetes에는 Cordon과 Drain이라는 개념이 존재한다.
    둘 다 특정한 Node를 Schedular에서 제외시켜 파드가 할당되지 않도록 하는 동작은 동일하지만, Cordon의 경우는 기존에 배포된 파드는 그대로 유지하는 반면에 Drain은 기존에 배포된 파드도 다른 노드로 이동시키는 차이가 있다.

  8. kubelet, kubectl 업그레이드
    나머지 kubelet, kubectl의 버전을 업그레이드 해준다.
    apt-mark unhold kubelet kubectl && \
    apt-get update && apt-get install -y kubelet='1.26.x-*' kubectl='1.26.x-*' && \
    apt-mark hold kubelet kubectl
    마찬가지로 sudo 권한이 필요하기 때문에 각 명령어의 앞에 일일이 sudo를 붙여주거나 sudo -i 명령어를 통해 루트 계정으로 전환한 뒤 실행해야한다.
    위 명령어를 실행했다면, kubelet을 재실행해야한다.
    sudo systemctl daemon-reload
    sudo systemctl restart kubelet
    여기까지 정상적으로 진행했다면, 아래와 같이 컨트롤 플레인의 버전이 바뀌어 있어야 한다.
  9. 노드 uncordon
    이전에 컨트롤 플레인에 drain을 적용시켜두었기 때문에, 이걸 해제해야 컨트롤 플레인에 시스템 파드가 정상적으로 스케줄링된다.
    적용은 drain으로 실행했지만, 해제는 uncordon 명령어로 한다.
    kubectl uncordon [node name]
    # kubectl uncordon k8s-master
    여기까지의 과정이 컨트롤 플레인에 대한 업그레이드였다면, 이후에 워커 노드에 대한 업그레이드는 별도로 진행해주어야 한다.

Worker Node upgrade

전반적인 진행 과정은 control plane의 업그레이드 과정과 비슷하지만, 약간의 차이가 있다는 점을 유의해서 진행한다.

  1. 워커 노드에 ssh 접속
    ssh k8s-worker1
  2. kubeadm 업그레이드 설치
    apt-mark unhold kubeadm && \
    apt-get update && apt-get install -y kubeadm='1.26.x-*' && \
    apt-mark hold kubeadm
  3. kubeadm upgrade 호출
    sudo kubeadm upgrade node
    위 명령어가 정상적으로 실행되었다면, 아래와 같이 정상적으로 업그레이드가 진행되었다는 메시지를 확인할 수 있다.
  4. Node drain 실행
    이 명령어는 워커 노드에서는 실행이 되지 않는다. 컨트롤 플레인 또는 클러스터 명령이 가능한 console 서버로 이동해서 실행해준다.
    kubectl drain [node name] --ignore-daemonsets
    # kubectl drain k8s-worker1 --ignore-daemonsets
  5. kubelet, kubectl 업그레이드
    이 다음 과정은 다시 워커 노드에 접속한 후 실행한다.
    apt-mark unhold kubelet kubectl && \
    apt-get update && apt-get install -y kubelet='1.26.x-*' kubectl='1.26.x-*' && \
    apt-mark hold kubelet kubectl
    위 명령어를 실행한 이후에 kubelet을 재실행 해준다.
    sudo systemctl daemon-reload
    sudo systemctl restart kubelet
    다음 이미지와 같이 워커 노드의 kubectl 버전 또한 정상적으로 upgrade 되어 있음을 확인할 수 있다.
  6. node uncordon
    다시 console 또는 control plane으로 접속 후, drain을 해제해서 Pod들이 정상적으로 Scheduling 되도록 한다.
    kubectl uncordon [node name]
    # kubectl uncordon k8s-worker1
  7. 모든 노드에 반복
    이 과정을 클러스터를 구성하고 있는 모든 노드에 대해 반복적으로 진행한다.

참고 문서

https://v1-26.docs.kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
Upgrading kubeadm clusters 쿠버네티스 공식 문서

profile
Cloud/DevOps Engineer

0개의 댓글