0부터 시작하는 Kubernetes 공부 - Cluster Upgrade

Jaehong Lee·2023년 6월 26일
5
post-thumbnail

1. Drain & Cordon & Uncordon

클러스터 업그레이드에서 사용하는 명령어인 Drain, Cordon, Uncordon에 대해 알아보자


Drain

Kubectl drain은 해당 Node에 있는 Pod들을 모두 다른 Node로 이동시키는 명령이다. 해당 Node에 schedulingdisabled 상태를 적용하여 새 파드가 스케줄링 되지 않게 하고, 실행 중인 Pod를 모두 삭제한다

Pod를 어떻게 이동시킬까?

  • 실행 중인 Pod를 모두 삭제하면, Controller에 의해 다른 Node에 다시 배포되는 방식이다. 따라서, Controller에 의해 실행되는 Pod들만 다른 Node로 이동이 가능하다
  • Kubelet을 통해 실행되는 static Pod는 삭제되지 않는다

Drain 시 주의할 점!

  • 만약 Node에 DaemonSet이 있다면, DaemonSet은 해당 Node에 종속적인 오브젝트이므로, Drain 명령 시 오류가 발생한다. 따라서 Drain 할 때, ignore daemonset 옵션을 통해 DaemonSet은 삭제하지 않게 한다
  • 만약 Node에 Controller에 의해 실행되지 않는 Standalone Pod가 있다면 Drain 명령 시 오류가 발생한다. 따라서 Drain을 하기 전에 배포된 Pod들을 Controller가 실행하는 Pod로 재배포해야 한다
    • 만약 force 를 통해 강제로 실행하면, Standalone Pod들은 그냥 삭제된다

Drain 명령 시, Pod들은 어떻게 삭제될까?

  • 종료 명령을 받으면 파드들은 정상 종료되며, Drain은 모든 파드들이 정상 종료될때까지 대기한다

Pod Disruption Budget ( PDB )

  • PDB는 Drain을 사용할 때, 한 번에 모든 Pod가 재배포되는 것을 방지하기 위해, 한 번에 삭제되는 Pod 개수를 지정하는 오브젝트이다
    • 고가용성을 보장하기 위해 몇 개 이상의 Pod를 반드시 유지해야 하는 경우
  • max-available : 유지할 Pod 개수 지정. 해당 개수의 Pod를 제외한 나머지 모든 Pod 삭제 가능
  • max-unavaliable : 삭제할 Pod 개수 지정. 한 번에 해당 개수만큼만 삭제된다

Cordon, Uncordon

  • cordon : Node에 배포된 Pod는 유지하며, 새 Pod들이 스케줄링 되지 않게 한다. 해당 Node는 schedulingdisabled 상태가 된다

  • Uncordon : Drain 혹은 Cordon 을 적용하여 schedulingdisabled 상태가 된 Node 의 schedulingdisabled 상태를 없애준다. 새로운 Pod들이 스케줄링될 수 있다


2. Apt

클러스터 업그레이드에서 사용하는 패키지 관리 도구인 Apt에 대해 알아보자


Apt란

apt는 데비안 계열 리눅스의 패키지 관리 도구이다

  • apt 명령어는 apt-get, apt-cache, dpkg -l이 결합된 명령어이다. 진행률 표시, 업데이트 가능한 패키지 목록 표시 등의 기능도 있다
    • apt-get : 데비안 계열 리눅스의 cli 패키지 관리 도구이며, 인증된 소스에서 패키지를 검색하고, 종속성과 함께 패키지를 설치 & 업데이트 & 제거한다
    • apt-cache : 패키지 조회
    • dpkg -l : 설치된 패키지 조회

apt 와 apt-get 차이

패키지 설치에 있어서 apt와 apt-get은 내부 동작은 큰 차이가 없다. apt는 추가적인 정보를 제공해주며, apt-get은 안정성 및 호환성이 뛰어나다

  • apt-get에 옵션이 많아지다 보니, apt에서는 apt-get에서 자주 사용하는 옵션을 추출하여 사용자들이 보기 편하게 만들었다

apt & apt-get 의 차이

  • apt는 apt-get보다 추가적인 정보를 제공해준다. 허나 apt-get에서 자주 사용되는 옵션들을 추출하였기에, 기능이 제하적이다
  • apt-get은 옵션이 더 많으므로, apt보다 더 많은 기능을 제공해준다. apt-get은 apt보다 오래됬으므로 더 안정적이고, 호환성이 높다
    • Script를 작성할 때 apt-get을 사용하면, 더 안정적인 옵션을 통한 개발이 가능하다

apt-mark

apt-mark는 패키지를 자동 or 수동으로 설치되도록 표시 및 표시 해제하는 명령어

  • hold : 패키지를 고정하여 설치, 업그레이드, 제거되지 않는다
  • unhold : 패키지 고정을 취소하여 모든 작업이 허용되게 한다

3. Cluster Upgrade

Kubeadm을 이용해 설치한 Kubernetes 클러스터를 업그레이드해보자

업그레이드 순서

Kubernetes Cluster 업그레이드 순서는 다음과 같다

1. ControlPlane Node업그레이드

  • ControlPlane Node Drain
  • ControlPlane Node Kubeadm, Kubelet, Kubectl 업그레이드
  • ControlPlane Node uncordon

2. WorkerNode 업그레이드

  • WorkerNode Drain
  • WorkerNode Kubeadm, Kubelet, Kubectl 업그레이드
  • WorkerNode uncordon

ControlPlane Node Upgrade

1. ControlPlane Node Drain

kubectl drain controlplane --ignore-daemonset
  • 먼저, ControlPlane Node의 Daemonset 및 StaticPod를 제외한 Pod들을 삭제하고, 새 Pod가 스케줄링되지 않게 한다

2. 패키지 리스트 최신화

apt update
  • apt 패키지 관리 도구를 이용해 설치 가능한 패키지 리스트를 최신화 한다

3. Kubeadm 버전 찾기

apt-cache madison kubeadm
  • 업그레이드 할 Kubeadm 버전을 확인한다

4. Kubeadm 업그레이드

apt-mark unhold kubeadm
apt-get upgrade
apt-get install -y kubeadm=1.25.0-00
apt-mark hold kubeadm
  • Kubeadm을 업그레이드한다

5. 컴포너트 업그레이드 게획 확인

kubeadm upgrade plan
  • 클러스터를 업그레이드 할 수 있는지 여부와 업그레이드 가능한 버전을 확인하자
  • Kubelet은 따로 업그레이드 해야 하므로, Kubelet 업그레이드 가능 버전을 기억해두자

6. 컴포넌트 업그레이드

kubeadm upgrade apply v1.25.0
  • 클러스터 업그레이드
  • 컴포넌트 업그레이드 버전은 Kubeadm 버전보다 높으면 안된다

7. Kubelet & Kubectl 업그레이드

apt-mark unhold kubelet kubectl
apt-get update
apt-get install -y kubelet=1.25.0 kubectl=1.25.0
apt-mark hold kubelet kubectl
  • Kubelet과 Kubectl을 업그레이드 한다
  • 버전은 위에서 확인한 버전으로 업그레이드 한다

8. Kubelet 재시작

sudo systemctl daemon-reload
sudo systemctl restart kubelet
  • Kubelet은 리눅스 데몬이기에 업그레이드 후 재시작해줘야 한다

9. ControlPlane Node uncordon

kubectl uncordon controlplane
  • ControlPlane Node 업그레이드 작업이 끝났으므로, 새 Pod가 스케줄링되게 uncordon 명령을 내린다

Worker Node Upgrade

1. Worker Node Drain

kubectl drain workernode01 --ignore-daemonsets
  • 업그레이드할 Worker Node에 Drain 명령을 내린다

2. Worker Node 접속

ssh workernode01
  • 업그레이드할 Worker Node에 접속한다

3. Kubeadm 업그레이드

apt-mark unhold kubeadm
apt-get update
apt-get install -y kubeadm=1.25.0-00
apt-mark hold kubeadm
  • Kubeadm을 업그레이드한다. 이때, ControlPlane Node에서 업그레이드한 버전과 동일한 버전으로 업그레이드 해야 한다

4. Node 업그레이드

kubeadm upgrade node
  • Worker Node를 업그레이드 한다

5. Kubelet 및 Kubectl 업그레이드

apt-mark unhold kubelet kubectl
apt-get update
apt-get install -y kubelet=1.25.0 kubectl=1.25.0
apt-mark hold kubelet kubectl
  • Kubelet과 Kubectl을 업그레이드 한다

6. Kubelet 재시작

sudo systemctl daemon-reload
sudo systemctl restart kubelet
  • Kubelet은 리눅스 데몬이기에 업그레이드 후 재시작해줘야 한다

7. Worker Node uncordon

kubectl uncordon node01
  • ControlPlane Node로 돌아와서 Worker Node에 uncordon 명령을 내린다

Kubernetes 클러스터 업그레이드가 완료됬다


Cluster Upgrade Error

원인

couldn't create a Kubernetes client from file "/etc/kubernetes/kubelet.conf": failed to load admin kubeconfig: open /etc/kubernetes/kubelet.conf: no such file or directory
To see the stack trace of this error execute with --v=5 or higher
  • kubeadm upgrade node를 입력하면, 위와 같은 오류가 발생할 때가 있다
  • 해당 Node가 Cluster에 가입되지 않았으므로 발생하는 오류다

해결법

kubeadm token create --print-join-command
  • Master Node에서 Cluster 가입을 위한 Token을 생성하자. 명령을 실행하면, 밑에 Cluster에 가입할 Worker Node에서 실행해야 하는 명령어가 나온다. 복사해두자
ssh workernode
  • Cluster에 가입할 Worker Node로 이동하자
kubeadm join *********:6443 --token ********* --discovery-token sha256:******************
  • 위에서 복사한 명령어를 입력하자
  • Worker Node가 Cluster에 가입되었다. 이제 다시 Cluster Upgrade를 진행하면 된다
profile
멋진 엔지니어가 될 때까지

0개의 댓글