개발자가 되고 싶은 준개발자

[CKA] Kubernetes: 클러스터 관리(버전 업그레이드 및 백업하는 방법) 본문

도커와 쿠버네티스/CKA 자격증

[CKA] Kubernetes: 클러스터 관리(버전 업그레이드 및 백업하는 방법)

준개발자 2021. 7. 5. 18:23

 

노드 보수

소프트웨어 업데이트나 보안 패치를 적용할 때 노드를 클러스터에서 빼야 할 일이 생김.

 

노드를 보수(shutdown)하면 그 위에 돌아가는 pod들은 어떻게 될까?

노드를 클러스터에서 제거하지 않는 이상 쿠버네티스가 알아서 서버가 지정한 시간(시간은 eviction timeout)보다 오래 내려가 있으면 그 위의 pod를 죽이고, 다른 노드 위에 새로 띄움.

  • kube-controller-manager --pod-eviction-timout=5m0s

(만약에 eviction timeout으로 설정한 시간 이후에 다시 노드가 살아서 올라온다 해도 그 위에 스케줄링되었던 pod는 이미 다른 노드로 옮겨간 상황이므로 당장 돌아가는 pod는 없음.)

 

노드를 클러스터에서 뺀 후에 보수할 수 없을까?

노드 하나를 보수 작업을 위해 K8s 클러스터로부터 분리하여 정지시키고, 작업 완료 후 파드의 실행이 다시 스케줄링되도록 작업할 수 있음.

kubectl cordon node1 #node1에 대한 스케줄 정지
kubectl drain node1 --force #node1의 파드 퇴거

# <node1 셧다운, (보수 작업), 기동>

kubectl uncordon node1 #node1의 스케줄 재개

 

버전 확인 실습

# Cluster의 현재 쿠버네티스 버전 확인 
kubectl get nodes # 노드들의 kubelet 버전
kubectl verction --short # Client와 Server 버전

# workdloas들을 돌리고 있는 노드 확인
kubectl get nodes -o wide

# 클러스터에서 돌아가고 있는 어플리케이션 확인
kubectl get deployments.apps

Kubernetes SW 버전 관리 방법

쿠버네티스는 활발하게 유지 보수되는 프레임워크이므로 이에 맞춰 운영자는 주기적으로 버전 업그레이드를 해줘야 함. 

버전 체계는 Major-minor-patch임. 쿠버네티스는 3개의 버전을 Support함. (만약 v1.13이 나왔으면, v1.10부터는 지원이 안 됨.)

 

클러스터 버전 업그레이드 정책??

  • 컴포넌트들이 다 같은 버전이어야 할 필요는 없음. 그러나 kube-apiserver보다 더 버전이 높은 컴포넌트가 있어서는 안 됨.(controlplane의 다른 component들이 모두 kube-apiserver와 통신하기 때문.)
    • Controller-manager, kube-scheduler는 kube-apiserver와 같거나 한 버전 아래까지 가능.
    • kubelet, kube-proxy는 kube-apiserver보다 두 버전 아래까지 가능
  • 예외로 kubectl은 Kube-apiserver보다 한 버전이 높거나 한 버전 낮게 까지 가능.
  • https://kubernetes.io/releases/version-skew-policy/#supported-version-skew 에서 컴포넌트 간 version skew가 얼마나 가능한 지 확인 가능. 

 

실제로 업그레이드 할 때는 한 버전씩만 업그레이드 하는 것이 권장됨. v1.10에서 v1.13까지 한번에 업그레이드 하는게 아니라 v1.10 -> v1.11 -> v1.12 -> v1.13으로 업그레이드.

 

실무에서 운영중인 클러스터를 업그레이드 해야 할 때 안전하게 업그레이드 하는 방법?

  1. 새로운 VM을 추가(Provision new VM) (Cloud에서 유용)
    • 새 버전을 가진 노드를 추가 & 예전 버전 노드의 workload를 새 노드로 이동하고 노드는 삭제.
  2.  기존 노드들로만 업그레이드 진행
    • 한 노드씩 업그레이드를 진행하고, 노드가 업그레이드되는 동안은 pod가 스케줄되지 않도록 설정. 기존에 돌고있는 workload들은 다른 노드로 이동.
    • 마스터 노드 먼저 업그레이드 후, worker 노드 업그레이드
      • 마스터 업그레이드 시에는 master의 역할은 수행 못하지만 worker에서 돌고 있는 pod들은 그대로 수행됨

 

클러스터 업그레이드 방법?

먼저 업그레이드 계획을 확인. 클러스터를 업그레이드 할 수 있는 지 확인하고, 업그레이드 가능한 최신 버전을 알려줌.

 

1) 마스터 노드(controlplane) 업그레이드

kubectl drain master #SchedulingDisabled로 상태가 바뀜

#Cluster의 Server 업그레이드
kubeadm version #kubeadm 버전 확인
apt-get upgrade -y kubeadm=1.12.0-00
kubeadm upgrade apply v1.12.0 #Cluster의 Server를 업그레이드
kubectl version --short
# 이 상태에서 kubectl get nodes하면 아직 마스터 노드의 버전이 v1.11으로 보임. 
# 마스터 노드의 kubelet의 버전을 보여주기 때문임. 
# 따라서 kubelet의 버전도 업그레이드 해줘야 함.

# Master 노드의 kubelet 업그레이드
kubectl get nodes
apt-get upgrade -y kubelet=1.12.0-00
kubectl get nodes # kubelet이 다시 뜨면 업데이트된 버전이 반영됨

kubectl uncordon master

 

2) 워커 노드 업그레이드

마스터 노드에서 node-1을 drain 시킴.

  • Drain: 노드를 unschedulable로 mark하고, 돌고 있는 workload도 evict함.
kubectl drain node-1 # node-1에 스케줄링되어 있는 pod은 다른 pod로 보내고, 앞으로 스케줄링도 되지 않음

워커 노드 node-1에서 업그레이드 진행.

#마스터에서 node-1로 이동
ssh node-1

apt-get upgrade -y kubeadm=1.12.0-00
apt-get upgrade -y kubelet=1.12.0-00
kubeadm upgrade node config --kubelet-verion v1.12.0 #node configuration을 업그레이드
systemctl restart kubelet

logout

다시 마스터 노드에서 node-1에 pod가 스케줄링 되도록 설정. (uncordon하면 node-1에서 다른 노드로 옮겨진 pod들이 다시 node-1으로 옮겨지는 게 아리나 새로 스케줄링할 pod가 생길 때 node-1에 스케줄링이 가능해지는 것임.)

  • Uncordon: 노드를 스케줄 가능으로 표시하여 다시 온라인 상태로 노드를 전환.
kubectl uncordon node-1

 

왜 drain했다가 undrain하는 게 아니라 uncordon함??? Drain과 cordon의 차이??

  • drain: 가동 중인 파드를 다른 노드로 이동 (drain하면 노드의 상태가 SchedulingDisabled로 상태로 바뀜!)
  • cordon: 노드에 새로운 파드의 스케줄 금지
  • uncordon: 노드에 새로운 파드의 스케줄 재개

Backup과 Restore

버전을 업그레이드 할 때 혹시 모르니 이전 클러스터에 대한 Backup을 해놓는 게 좋음.

 

백업할 항목

  • Resource configuration
    1. imperative:kubectl 명령어로 실행하는 경우
      • 백업: kubectl get all --all-namespaces -o yaml > all-deploy-services.yml
    2. declarative: yaml 파일을 미리 작성 후 적용하는 경우
      • 백업: 쉬움 -> Source code repo(예. Github)에 configuration 관련 파일들 백업
  • ETCD Cluster: 클러스터의 state를 저장함.
    • 백업
      • 백업할 공간을 지정
      • 스냅샷 찍을 수도 있음.
        • ETCDCTL_API: etcdctl은 etcd의 Command line client
          • etcdctl의 v3을 쓰려면 export ETCDCTL_API=3 하면 됨. 
          • etcdctl snapshot save snapshot.db # 스냅샷 저장
          • service kube-apiserver stop # kube-apiserver 정지
          • etcdctl snapshot restore snapshot.db --data-dir /var/lib/etcd # restore하면서 data directory 장소를 지정
          • etcd.service의 data directory를 설정.
          • systemctl daemon-reload
            service etcd restart
            service kube-apiserver restart

 

ETCD 관련 설정 확인 실습

# ETCD의 버전 확인
# kubeadm으로 클러스터를 만들면 ETCD는 kube-system 네임스페이스에 POD로 배포됨
kubectl get pods -n kube-system #ETCD pod의 이름을 찾음
kubectl -n kube-system describe pod etcd-controlplane #Pod의 Container Image 부분을 보면 버전이 있음 (예. k8s.gcr.io/etcd:3.4.9-1)

# master에서 ETCD를 접근하는 address 확인
# (ETCD Pod의 Service configuration에서 확인 가능)
kubectl -n kube-system describe pod etcd-controlplane # Command 항목의 --listen-client-urls: 같은 노드(마스터)에서 접근할 때, --listen-peer-urls: 다른 노드에서 접근할 때

# ETCD server certificate 위치 확인
kubectl -n kube-system describe pod etcd-controlplane # Command 항목의 --cert-file에서 확인 가능

# ETCD CA certificate 위치 확인
kubectl -n kube-system describe pod etcd-controlplane # Command 항목의 --peer-trusted-ca-file에서 확인 가능

​

 

ETCD 백업 실습

# ETCD 백업을 위해 ETCD 스냅샷 생성

# Controlplane 노드의 ETCDCTL 툴 사용
ETCDCTL_API=3 etcdctl version

# 필수 옵션들 
# kubectl -n kube-system describe pod etcd-controlplane 커맨드를 통해 필수 옵셔들에 경로를 찾아서 넣어야 함
ETCDCTL_API=3 etcdctl snapshot save --help
ETCDCTL_API=3 etcdctl --cacert="" --cert="" --key="" snapshot save /opt/snapshot-pre-boot.db


 

ETCD 백업으로부터 Restore 실습

# ETCD Restore
ETCDCTL_API=3 etcdctl snapshot restore --help

# etcd의 원래 경로는 /var/lib/etcd
# /var/lib/etcd-from-backup에 스냅샷을 restore
ETCDCTL_API=3 etcdctl snapshot restore /opt/snapshot-pre-boot.db --data-dir=/var/lib/etcd-from-backup

# etcd의 경로를 백업 폴더로 변경
cd /etc/kubernetes/manifests
vi etcd.yaml
# volume 항목의 etcd-data의 hostPath를 변경

docker ps -a | grep etcd #기존의 pod가 죽고, 다시 생성되는지 확인
docker logs <ETCD 컨테이너 ID> # ETCD 서버가 static pod로 뜨는 지 확인

참조

http://www.yes24.com/Product/Goods/93317828

 

15단계로 배우는 도커와 쿠버네티스 - YES24

한 권으로 배우는 도커와 쿠버네티스 실전 가이드!컨테이너 기술에 처음 입문하는 독자도 체계적으로 실력을 쌓아갈 수 있도록 도커부터 시작하여 쿠버네티스의 전반적인 기능을 기초부터 단

www.yes24.com

https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/

https://kubernetes.io/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

 

kubeadm 클러스터 업그레이드

이 페이지는 kubeadm으로 생성된 쿠버네티스 클러스터를 1.20.x 버전에서 1.21.x 버전으로, 1.21.x 버전에서 1.21.y(여기서 y > x) 버전으로 업그레이드하는 방법을 설명한다. 업그레이드가 지원되지 않는

kubernetes.io