CKA #6 Cluster Maintenance

· Infra, Kubernetes, CKA

Certified Kubernetes Administrator (CKA) with Practice Tests 강의를 듣고 몰랐던 내용, 알고 있어도 중요하다고 생각하는 내용 등을 추가적인 공부와 함께 간략히 정리한 글입니다.

저번 #5 Application LifeCycle를 공부하면서 집중력이 많이 떨어진 것 같아, #6부터는 필기 정리를 가미해서 공부하기로 했습니다. 역시 집중이 안될 땐 필기 정리를 하면 머리에 정보를 욱여넣을 수 있는… 그리고 6장은 DR 관련된 사항들이 많고, 현업에서 실제로 써본 적은 없었던 내용들이라 재밌게 공부했습니다.

현업에서 쿠버네티스 클러스터 버전 업그레이드는 EKS로만 해보고, kubeadm으로 업그레이드해본 적은 없는데 이 부분과 etcd 백업과 복원 파트가 도움이 많이 되었습니다.

Index

Operating System Upgrades

몇 개의 노드와 파드를 제공하는 클러스터에서, 노드 중 하나가 다운되면 어떻게 될까? 파드에 접근이 불가능해진다. 파드를 어떻게 배치하냐에 따라 유저가 영향받을 수 있다. 여러 노드에 걸쳐 레플리카로 서비스되는 파드는 영향이 없을 수 있다. 하지만 다운된 노드에만 떠있는 파드가 있었다면 영향이 생길 것이다.

쿠버네티스는 이런 상황에서 어떻게 대처할까? 만약 노드가 다운된 즉시 다시 노드가 살아난다면 (kubelet이 켜지면서 온라인으로 돌아오는 경우) 다시 파드가 정상적으로 동작한다. 하지만 노드가 5분 이상 다운된다면, 쿠버네티스 클러스터는 해당 노드에 배치된 파드를 종료시키고, 다른 노드에 파드를 띄운다. 파드가 죽었다고 판단하는 타임아웃 시간(pod-eviction-timeout)은 기본값으로 5분이다.

따라서 노드에서 실행, 유지 관리할 일이 있다면, 다른 노드에 복제본이 있다는 점이 확실하다면 노드를 빠르게 재부팅키면서 업데이트 작업을 수행할 수 있다. 하지만 그 노드가 5분 안에 돌아올 수 있다는 보장이 없다. 따라서 더 안전한 방법이 필요하다. 한 노드 내의 모든 작업을 드레인하는 방법이다. 파드나 작업 내용이 다른 노드로 이동된다. 드레인 명령을 실행하면 노드에는 어떤 파드도 스케줄되지 않는다.

kubectl drain node-1

노드에 드레인 작업을 실행하고, 노드에 필요한 작업(OS 업데이트 등)을 수행하고 다시 kubelet을 띄워 클러스터에 연결해도, 여전히 파드는 스케줄되지 않는다. uncordon을 통해 노드가 다시 일할 수 있다는 것을 클러스터에 알려야 한다.

kubectl uncordon node-1

이 작업을 한다고 해서 다른 노드로 옮겨간 파드가 바로 다시 돌아오는 것은 아니다. 해당 파드가 재생성되거나 하면, 노드가 돌아올 수 있다.
cordon이라는 명령어도 있는데, 이 명령어는 drain과 달리 기존의 파드가 내려가지는 않지만, 새 파드가 스케줄되지 않도록 하는 명령어다.

k8s Versions

우린 쿠버네티스 클러스터를 만들 때 특정 버전의 쿠버네티스 버전을 설치한다. 쿠버네티스가 어떻게 소프트웨어 릴리즈를 관리할까?
예를 들어 버전 구성을 살펴보자. v1.24.3라는 버전이 있다고 하면, 앞의 1은 메이저 버전, 24는 마이너 버전, 3은 패치 버전이다.

Cluster Upgrade Process

kubeadm에서 직접 버전 올리기

/etc/apt/sources.list.d/kubernetes.list

내의 내용을 바꾸어주어야 한다.

deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /

처음 열어보면 v1.29 부분이 현재 버전 정보로 되어있는데, 이걸 업그레이드하고자 하는 버전에 맞춰 적어주어야 한다.

root@controlplane:~# apt update
root@controlplane:~# apt-cache madison kubeadm

업그레이드할 수 있는 버전 정보를 확인한다.

root@controlplane:~# apt-get install kubeadm=1.29.0-1.1

업그레이드하고자 하는 버전을 설치한다.

root@controlplane:~# kubeadm upgrade plan v1.29.0
root@controlplane:~# kubeadm upgrade apply v1.29.0

컨트롤 플레인의 업그레이드를 진행한다. 업그레이드를 마쳤더라도, 컨트롤 플레인의 쿠블렛은 업그레이드되지 않았다. 쿠블렛도 목표버전에 맞게 설치한다.

root@controlplane:~# apt-get install kubelet=1.29.0-1.1
root@controlplane:~# systemctl daemon-reload
root@controlplane:~# systemctl restart kubelet
root@controlplane:~# kubectl uncordon controlplane

이후 워커 노드도 kubelet 업그레이드를 진행해준다.

Backup and Restore Methodologies

백업을 해야하는 컴포넌트들

실제로 복구해보기

ETCDCTL_API=3 etcdctl  --data-dir /var/lib/etcd-from-backup \
snapshot restore /opt/snapshot-pre-boot.db

백업해둔 ETCD 정보를 불러온다.

그리고 /etc/kubernetes/manifests/etcd.yaml 파일을 수정한다.

  volumes:
  - hostPath:
      path: /var/lib/etcd-from-backup # etcd -> etcd-from-backup 으로 복구한 파일명으로 맞춰줌
      type: DirectoryOrCreate
    name: etcd-data

파일을 수정하고 나면 ETCD 팟은 자동으로 재시작된다. 팟은 static-pod 형태로 /etc/kubernetes/manifests 아래에 재생성된다.

ETCD 관련 옵션의 주요 특징

multiple cluster context switching

kubectl config use-context cluster1