티스토리 뷰

kubeadm 클러스터 업그레이드

이 페이지에서는 kubeadm으로 생성된 Kubernetes 클러스터를 버전 1.20.x에서 버전 1.21.x로, 버전 1.21.x에서 1.21.y(여기서 y > x)로 업그레이드하는 방법을 설명합니다. 업그레이드 시 MINOR 버전 건너뛰기는 지원되지 않습니다.

  1. 기본 제어 영역 노드를 업그레이드합니다.
  2. 추가 제어 평면 노드를 업그레이드합니다.
  3. 작업자 노드를 업그레이드합니다.

시작하기 전에

  • 릴리스 정보 를 주의 깊게 읽으십시오 .
  • 클러스터는 정적 제어 평면과 etcd 포드 또는 외부 etcd를 사용해야 합니다.
  • 데이터베이스에 저장된 앱 수준 상태와 같은 중요한 구성 요소를 백업해야 합니다. kubeadm upgrade작업 부하에는 영향을 미치지 않고 Kubernetes 내부 구성 요소만 다루지만 백업은 항상 모범 사례입니다.
  • 스왑을 비활성화해야 합니다 .

추가 정보

  • kubelet MINOR 버전 업그레이드 전에 드레이닝 노드 가 필요합니다. 제어 평면 노드의 경우 CoreDNS Pod 또는 기타 중요한 워크로드를 실행할 수 있습니다.
  • 컨테이너 사양 해시 값이 변경되어 업그레이드 후 모든 컨테이너가 다시 시작됩니다.

업그레이드할 버전 결정

OS 패키지 관리자를 사용하여 안정적인 최신 1.21 버전을 찾으십시오.

apt update
apt-cache madison kubeadm
# find the latest 1.21 version in the list
# it should look like 1.21.x-00, where x is the latest patch

컨트롤 플레인 노드 업그레이드

컨트롤 플레인 노드의 업그레이드 절차는 한 번에 하나의 노드에서 실행해야 합니다. 먼저 업그레이드할 컨트롤 플레인 노드를 선택합니다. 파일 이 있어야 /etc/kubernetes/admin.conf합니다.

"kubeadm 업그레이드" 호출

첫 번째 제어 평면 노드의 경우

  • kubeadm 업그레이드:
# replace x in 1.21.x-00 with the latest patch version
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=1.21.x-00 && \
apt-mark hold kubeadm
-
# since apt-get version 1.1 you can also use the following method
apt-get update && \
apt-get install -y --allow-change-held-packages kubeadm=1.21.x-00
  • 다운로드가 작동하고 예상 버전이 있는지 확인합니다.
  • kubeadm version
    
  • 업그레이드 계획 확인:이 명령은 클러스터를 업그레이드할 수 있는지 확인하고 업그레이드할 수 있는 버전을 가져옵니다. 또한 구성 요소 구성 버전 상태가 포함된 테이블도 표시됩니다.
  • kubeadm upgrade plan
    
참고: kubeadm upgrade 또한 이 노드에서 관리하는 인증서를 자동으로 갱신합니다. 인증서 갱신을 거부하려면 플래그 --certificate-renewal=false를 사용할 수 있습니다. 자세한 내용은 인증서 관리 안내서 를 참조하십시오 .
참고:kubeadm upgrade plan 수동 업그레이드가 필요한 구성 요소 구성이 표시되면 사용자는 명령줄 플래그를 통해 대체 구성이 포함된 구성 파일을 제공 해야 합니다 kubeadm upgrade apply. --config그렇게 하지 않으면 kubeadm upgrade apply오류와 함께 종료되고 업그레이드가 수행되지 않습니다.
  • 업그레이드할 버전을 선택하고 적절한 명령을 실행합니다. 예를 들어:명령이 완료되면 다음이 표시되어야 합니다.
  • [upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.21.x". Enjoy! [upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.
  • # replace x with the patch version you picked for this upgrade
    sudo kubeadm upgrade apply v1.21.x
    
  • CNI 공급자 플러그인을 수동으로 업그레이드합니다.CNI 공급자가 DaemonSet으로 실행되는 경우 추가 컨트롤 플레인 노드에서는 이 단계가 필요하지 않습니다.
  • CNI(컨테이너 네트워크 인터페이스) 제공업체에 따라야 할 자체 업그레이드 지침이 있을 수 있습니다. 애드온 페이지에서 CNI 공급자를 찾고 추가 업그레이드 단계가 필요한지 확인하십시오 .

다른 제어 평면 노드의 경우

첫 번째 제어 평면 노드와 동일하지만 다음을 사용합니다.

sudo kubeadm upgrade node

대신에:

sudo kubeadm upgrade apply

또한 더 이상 CNI 제공자 플러그인을 호출 kubeadm upgrade plan하고 업그레이드할 필요가 없습니다.

노드 비우기

  • 노드를 예약 불가능으로 표시하고 워크로드를 제거하여 유지 관리를 위해 노드를 준비합니다.
  • # replace <node-to-drain> with the name of your node you are draining
    kubectl drain <node-to-drain> --ignore-daemonsets
    

kubelet 및 kubectl 업그레이드

  • kubelet 및 kubectl 업그레이드
    # 1.21.x-00의 x를 최신 패치 버전으로 교체
    apt-mark unhold kubelet kubectl && \
    apt-get 업데이트 && apt-get 설치 -y kubelet=1.21.x-00 kubectl=1.21.x-00 && \
    apt-mark 홀드 kubelet kubectl
    -
    # apt-get 버전 1.1부터 다음 방법을 사용할 수도 있습니다.
    apt-get 업데이트 && \
    apt-get 설치 -y --allow-change-hold-packages kubelet=1.21.x-00 kubectl=1.21.x-00
    
  • kubelet을 다시 시작합니다.
  • sudo systemctl daemon-reload
    sudo systemctl restart kubelet
    

노드 차단 해제

  • 예약 가능으로 표시하여 노드를 다시 온라인 상태로 만듭니다.
  • # replace <node-to-drain> with the name of your node
    kubectl uncordon <node-to-drain>
    

작업자 노드 업그레이드

작업자 노드의 업그레이드 절차는 워크로드를 실행하는 데 필요한 최소 용량을 손상시키지 않으면서 한 번에 하나의 노드 또는 몇 개의 노드를 실행해야 합니다.

kubeadm 업그레이드

  • kubeadm 업그레이드:
# replace x in 1.21.x-00 with the latest patch version
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=1.21.x-00 && \
apt-mark hold kubeadm
-
# since apt-get version 1.1 you can also use the following method
apt-get update && \
apt-get install -y --allow-change-held-packages kubeadm=1.21.x-00

"kubeadm 업그레이드" 호출

  • 작업자 노드의 경우 로컬 kubelet 구성을 업그레이드합니다.
  • sudo kubeadm upgrade node
    

노드 비우기

  • 노드를 예약 불가능으로 표시하고 워크로드를 제거하여 유지 관리를 위해 노드를 준비합니다.
  • # replace <node-to-drain> with the name of your node you are draining
    kubectl drain <node-to-drain> --ignore-daemonsets
    

kubelet 및 kubectl 업그레이드

  • kubelet 및 kubectl 업그레이드:
# replace x in 1.21.x-00 with the latest patch version
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.21.x-00 kubectl=1.21.x-00 && \
apt-mark hold kubelet kubectl
-
# since apt-get version 1.1 you can also use the following method
apt-get update && \
apt-get install -y --allow-change-held-packages kubelet=1.21.x-00 kubectl=1.21.x-00
  • kubelet을 다시 시작합니다.
  • sudo systemctl daemon-reload
    sudo systemctl restart kubelet
    

노드 차단 해제

  • 예약 가능으로 표시하여 노드를 다시 온라인 상태로 만듭니다.
  • # replace <node-to-drain> with the name of your node
    kubectl uncordon <node-to-drain>
    

클러스터 상태 확인

모든 노드에서 kubelet이 업그레이드된 후 kubectl이 클러스터에 액세스할 수 있는 모든 곳에서 다음 명령을 실행하여 모든 노드를 다시 사용할 수 있는지 확인하십시오.

kubectl get nodes

STATUS열은 모든 노드에 대해 표시 되어야 Ready하며 버전 번호가 업데이트되어야 합니다.

실패 상태에서 복구

kubeadm upgrade예를 들어 실행 중 예기치 않은 종료로 인해 실패하고 롤백되지 않으면 다시 실행할 수 있습니다 kubeadm upgrade. 이 명령은 멱등성이고 결국 실제 상태가 선언한 원하는 상태인지 확인합니다.

kubeadm upgrade apply --force잘못된 상태에서 복구하기 위해 클러스터가 실행 중인 버전을 변경하지 않고 실행할 수도 있습니다 .

업그레이드하는 동안 kubeadm은 아래에 다음 백업 폴더를 씁니다 /etc/kubernetes/tmp.

  • kubeadm-backup-etcd-<date>-<time>
  • kubeadm-backup-manifests-<date>-<time>

kubeadm-backup-etcd이 제어 평면 노드에 대한 로컬 etcd 멤버 데이터의 백업을 포함합니다. etcd 업그레이드가 실패하고 자동 롤백이 작동하지 않는 경우 이 폴더의 내용을 에서 수동으로 복원할 수 있습니다 /var/lib/etcd. 외부 etcd를 사용하는 경우 이 백업 폴더는 비어 있습니다.

kubeadm-backup-manifests이 제어 평면 노드에 대한 정적 포드 매니페스트 파일의 백업이 포함되어 있습니다. 업그레이드가 실패하고 자동 롤백이 작동하지 않는 경우 이 폴더의 내용을 에서 수동으로 복원할 수 있습니다 /etc/kubernetes/manifests. 어떤 이유로 특정 구성 요소에 대한 사전 업그레이드 및 사후 업그레이드 매니페스트 파일 간에 차이가 없으면 해당 구성 요소에 대한 백업 파일이 작성되지 않습니다.

작동 방식

kubeadm upgrade apply다음을 수행합니다.

  • 클러스터가 업그레이드 가능한 상태인지 확인합니다.
    • API 서버에 연결할 수 있습니다.
    • 모든 노드가 Ready상태 에 있음
    • 제어 영역이 정상입니다.
  • 버전 편향 정책을 시행합니다.
  • 제어 평면 이미지가 사용 가능하거나 기계로 가져올 수 있는지 확인하십시오.
  • 구성 요소 구성에 버전 업그레이드가 필요한 경우 교체를 생성하거나 사용자가 제공한 덮어쓰기를 사용합니다.
  • 컨트롤 플레인 구성 요소를 업그레이드하거나 하나라도 나타나지 않는 경우 롤백합니다.
  • 신규 CoreDNS및 kube-proxy매니페스트를 적용하고 필요한 모든 RBAC 규칙이 생성되었는지 확인합니다.
  • API 서버의 새 인증서 및 키 파일을 생성하고 180일 이내에 만료되는 오래된 파일을 백업합니다.

kubeadm upgrade node추가 제어 평면 노드에서 다음을 수행합니다.

  • 클러스터 에서 kubeadm ClusterConfiguration을 가져옵니다.
  • 선택적으로 kube-apiserver 인증서를 백업합니다.
  • 제어 평면 구성 요소에 대한 정적 Pod 매니페스트를 업그레이드합니다.
  • 이 노드에 대한 kubelet 구성을 업그레이드합니다.

kubeadm upgrade node작업자 노드에서 다음을 수행합니다.

  • 클러스터 에서 kubeadm ClusterConfiguration을 가져옵니다.
  • 이 노드에 대한 kubelet 구성을 업그레이드합니다.
댓글