본문 바로가기
MLOps/Doker & Kubernetes

Udemy CKA 강의 정리 126: Demo - Cluster Upgrade

by 공부하는 무니 2023. 1. 14.
반응형

해당 내용은 Udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests 강의를 공부한 내용입니다. 내용을 그대로 번역하기보다는, 제가 이해하기 쉬운 대로 수정한 부분들이 있습니다.

⚠️ 영어 독해가 많이 부족합니다. 틀린 내용이 있으면 알려주시면 감사하겠습니다.


이번 강의에서는 kubeadm을 사용하여 배포된 쿠버네티스 클러스터 업그레이드를 시연합니다. 따라서 이를 위해서는 전제 조건으로 kube adm tool을 사용하여 배포된 Kubernetes가 필요합니다. 노트북의 로컬 설정이거나 클라우드의 설정일 수도 있고 우리 Lab을 사용할 수도 있습니다. 이 데모에서는 katacoda 플레이그라운드의 클러스터를 사용하고 있습니다. Katacoda로 이동하여 Kubernetes 플레이그라운드를 검색하면 마스터 및 워커 노드가 있고 클러스터 업그레이드를 매우 쉽게 연습할 수 있는 실험 세션인 플레이그라운드를 즉시 열 수 있습니다.

오른쪽에는 마스터 및 워커 노드가 있는 Katacoda의 Kubernetes 클러스터에 대한 터미널인 Kubernetes 클러스터가 있습니다. 컨트롤 플레인인 마스터 노드가 맨 위에 있고 워커 노드와 터미널이 아래에 있습니다.

왼쪽에는 Kubernetes 문서 페이지가 열려 있습니다. 문서는 kubeadm upgrade를 검색하면 나오는 첫 번째 링크로 들어온 것입니다. default로 현재 1.19 부터 2.20까지 업그레이드에 대한 최신 지침이 포함된 페이지가 열립니다. 그리고 현재 내 클러스터는 1.8 버전입니다. 따라서 1.8에서 1.9로 업그레이드하는 링크를 선택하겠습니다.

따라서 현재 버전에 따라 관련 문서 페이지를 선택해야 합니다. 이제 환경이 로드되면 lanunch.sh가 시작되고 클러스터가 준비될 때까지 기다립니다. 이것은 Katacoda에만 적용되므로 다른 환경에서 사용하는 경우 필요하지 않을 수 있습니다. 따라서 이 특정 단계는 Katacoda로 프로비저닝된 환경에만 관련됩니다. 클러스터를 시작하고 나타날 때까지 기다립니다.

kubectl get nodes

kubectl get nodes 커맨드를 실행하여 클러스터가 준비되었는지 확인합니다.

watch kubectl get nodes

우리는 kubectl get nodes 커맨드과 함께 watch 커맨드를 사용하여 노드가 모두 READY상태가 될 때까지 지켜볼 수 있습니다. 현재 이 설정에는 단일 control plane과 단일 워커 노드가 있습니다.

이제 두 노드가 모두 준비되었으며 kubeadm 커맨드를 실행하여 kubeadm이 설치되었고 클러스터가 kubeadm을 사용하여 설정되었는지 확인할 수 있습니다.

kubeadm token list

kubeadm token list를 실행하면 토큰이 표시됩니다. 이는 해당 토큰을 사용하여 클러스터를 설정하고 kube system 네임스페이스에 있는 파드를 포함하여 모든 파드를 조회하는 옵션인 kubectl get pods 커맨드를 대시와 함께 실행할 수도 있음을 보여줍니다.

kubectl get pods -A

여기서 ETCD 컨트롤 플레인에 core dns가 있고 네트워킹 솔루션이 flannel이라는 것을 알 수 있습니다. 이 데모에서는 Kubernetes 컴포넌트만 업그레이드하고 flannel 네트워킹 솔루션에서는 업그레이드하지 않을 것입니다. 이를 업그레이드하기 위한 별도의 지침이 있습니다. 우리는 제어 평면과 워커 노드를 업그레이드하는 데만 집중할 것입니다.

kubectl get nodes

kubectl get nodes 커맨드를 실행하여 클러스터의 현재 버전을 확인하면 버전 18.0 으로 확인됩니다. 그러나 이것은 노드에서 실행되는 kublet 버전이라는 점을 기억하세요. kubeadm tool은 plan커맨드를 실행할 때 모든 다른 컴포넌트의 정확한 버전을 확인하는 데 도움이 됩니다.

왼쪽에 있는 문서 페이지에서 첫 번째 단계는 업그레이드하려는 버전을 결정하는 것입니다. 우리는 1.19로 업그레이드 할 것입니다. 그러나 우리는 1.19 안에서도 정확한 버전을 모릅니다. 이를 위해 커맨드를 실행해야 하는데, 그 전에 사용 중인 운영 체제가 확실하지 않은 경우 cat /etc/*release* 커맨드를 실행하면 릴리스 파일의 내용이 조회되며 이 데모 환경의 경우 우분투임을 알 수 있습니다.

그래서 우리는 여기에서 buntu 커맨드를 고수할 것입니다.

apt upgrade

apt update를 실행합니다. 이 데모 전체에서 여기에서 조회된 앱 커맨드를 실행하여 업그레이드에 사용할 수 있는 다양한 버전을 확인합니다. 우리는 1.19로 업그레이드하기 때문에, 1.19의 최신 버전인 1.19.6 버전을 선택합니다.

대략적인 프로세스는 컨트롤 플레인 노드를 업그레이드한 다음 해당 노드에서 kublet 및 kubectl을 업그레이드한 다음 워커 노드를 업그레이드하는 것입니다. 따라서 이 절차를 따르지만 워커 노드와 같은 특정 부분만 업그레이드하려는 경우에는 컨트롤 플레인 업그레이드에 사용되는 이 초기 섹션을 건너뛸 수 있습니다. 또는 컨트롤 플레인을 업그레이드하고 워커 노트 섹션을 건너뛰고 싶은 경우에도 그렇게 할 수 있습니다. 그러니 정말 하고 싶은 섹션을 자유롭게 선택하세요.

먼저 컨트롤 플레인 업그레이드를 진행해 보겠습니다. 첫 번째 단계는 컨트롤 플레인에서 kubeadm 자체를 업그레이드하는 것입니다. 이를 위해 위 커맨드들을 실행하고 cubeadm 1.19.6버전을 설치합니다. 업데이트가 완료될 때까지 기다리겠습니다. 이렇게 업데이트를 마치고 이제 kubeadm version 커맨드로 큐브 ADM 버전을 확인하니 성공적으로 1.19.6으로 업그레이드 된 것 같습니다.

kubeadm upgrade plan

다음으로 kubeadm upgrade plan 커맨드를 실행하여 업그레이드 plan을 살펴봅니다. 이는 컴포넌트의 현재 버전을 보여줍니다. 현재 버전이 1.18. 0 이고 업그레이드할 수 있는 버전도 보여주는데 우리는 1.19.6으로 업그레이드를 결정합니다.

kubeadm upgrade apply v1.19.6

다음 단계는 kubeadm upgrade apply v1.19.6 커맨드를 실행하여 버전 1.19.6로 업그레이드하는 것입니다. 이를 위해 커맨드를 실행한 다음 프롬프트에서 확인합니다. 이 작업은 몇 분 정도 걸릴 수 있습니다. 완료될 때까지 기다리겠습니다. 완료되면 클러스터가 1.19.6으로 업그레이드되었다는 메시지가 표시됩니다.

kubeadm upgrade plan

성공적으로 큐브를 실행했는지 확인합니다. kubeadm upgrade plan 커맨드를 다시 실행하면 더 이상 업그레이드 권장 사항이 없음을 알 수 있습니다. 따라서 모든 컴포넌트가 성공적으로 업그레이드되었음을 확인할 수 있습니다.

그런데 아직 kubectl get nodes 커맨드를 실행하면 버전이 1.18.0으로 표시됩니다. 여기에 표시되는 것은 kubelet의 버전이고 kubeadm upgrade 커맨드는 kubelet을 업그레이드하지 않기 때문입니다. 이것이 다음 단계입니다.

kubectl drain controlplane --ignore-daemonsets
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.19.6-00 kubectl=1.19.6-00 && \
apt-mark hold kubelet kubectl

kubelet이 파드 실행을 담당하므로 kubelet을 업그레이드하기 전에 노드를 비워야 합니다. 따라서 controlplane 노드를 비우기 위해 kubectl drain 커맨드를 실행하고 완료되면 upgrade 커맨드를 진행하여 kublet 및 kubectl 유틸리티 자체를 업그레이드합니다. 

sudo systemctl daemon-reload
sudo systemctl restart kubelet

완료되면 daeman을 다시 로드하고 kubelet을 다시 시작합니다.

kubectl get nodes 커맨드를 실행하면 컨트롤 플레인이 이제 1.19.6로 업그레이드된 것을 볼 수 있습니다. 상태는 SchdulingDisabled입니다. 이것은 이전에 노드를 비웠기 때문이고, 이제 uncordon해야 합니다.

kubectl uncordon controlplane

이제 노드 상태를 다시 확인하면 노드가 READY되었음을 확인합니다. 이렇게 우리는 성공적으로 마스터 노드를 업그레이드했습니다.

이제 다음 단계는 워커 노드를 업그레이드하는 것입니다. 이전과 마찬가지로 첫 번째 단계는 워커 노드에서 kubeadm을 업그레이드하는 것입니다. 문서에 kubeadm을 대상 버전으로 업그레이드하기 위한 APT 설치 커맨드가 있습니다. 그리고 이것은 워커 노드에서 수행되며 업데이트되어야 합니다. 그래서 당연히 kubectl 관련 커맨드를 제외하고 워커노드를 업그레이드하는 대부분의 커맨드는 워커노드에서 이루어집니다. 각각의 커맨드를 실행할 때 적절한 노드에 있는지 확인하십시오.

apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=1.19.6-00 && \
apt-mark hold kubeadm

이제 끝났습니다. 다음 단계는 kubelet configuration을 업그레이드하는 것입니다.

sudo kubeadm upgrade node

완료되면 다음 단계는 노드를 비우는 것입니다. 그리고 여기서 많은 사람들이 실수를 합니다. drain 커맨드는 kubectl 커맨드기 때문에 컨트롤 플레인 노드에서 실행됩니다. 워커 노드에서 실행하면 오류가 발생합니다. 따라서 컨트롤 플레인 노드에서 실행해야 합니다.

kubectl drain node1 --ignore-daemonsets

워커 노드의 업그레이드에 대해 방금 말했듯이 대부분의 커맨드는 워커 노드에서 실행되지만 drain과 uncordon은 컨트롤 플레인 노드에서 수행되도록 수행됩니다.

완료되면 다음 단계는 kublet 및 kubectl을 업그레이드하는 것입니다.

apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.19.6-00 kubectl=1.19.6-00 && \
apt-mark hold kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet

완료되면 데몬을 다시 로드하고 kubelet을 다시 시작합니다.

kubectl get nodes커맨드로 워커 노드에서 업그레이드가 성공했음을 확인하고, 아직 uncordon 하지 않았기 때문에 SchdulingDisabled이 된 것이 확인됩니다. uncordon 작업은 마스터 노드에서도 수행되어야 한다는 점을 기억하세요. 

이제 업그레이드 절차를 성공적으로 완료했습니다. 

반응형

댓글