이 페이지에서는 기출 문제 중 클러스터 업그레이드, 백업 관련 문제를 다룬다.
1. 클러스터 업그레이드
문서 링크: https://kubernetes.io/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
문서의 내용을 따라하면 크게 어렵지 않은 문제이다.
업그레이드 순서는 다음의 순서대로 진행한다.
1) 마스터 노드 drain
2) 마스터 노드의 kubeadm 업그레이드
3) 마스터 노드의 kubectl, kubelet 업그레이드
4) 마스터 노드 uncordon
5) 워커 노드 drain
6) 워커 노드의 kubeadm 업그레이드
7) 워커 노드의 kubectl, kubelet 업그레이드(kubectl이 없을 경우 kubelet만 업그레이드)
8) 워커 노드 uncordon
단계가 많아 보이지만 규칙을 이해하면 크게 복잡하지는 않다.
먼저 마스터 노드를 업그레이드 한 후 워커 노드를 업그레이드한다.
모든 노드는 업그레이드 전 drain, 업그레이드 후 uncordon을 실행한다.
kubectl drian {노드명} 명령은 노드에서 실행 중인 파드를 다른 노드로 옮기고 새로운 파드의 스케줄링을 막는다. 업그레이드 중인 노드 내부에는 데몬셋을 제외한 파드가 없어야 하고 새로운 파드 생성 시 업그레이드 중인 노드에 스케줄링이 되면 안되기 때문에 업그레이드 전 해당 명령을 수행해야 한다.
이후 노드의 kubeadm을 먼저 업그레이드 한 후, kubelet과 kubectl을 업그레이드 한다. kubectl은 단순 클라이언트 도구이기 때문에 워커 노드에 없는 경우도 있다. 이 경우 kubelet만 업그레이드 한다.
업그레이드가 종료되면 kubectl uncordon {노드명} 명령을 통해 해당 노드의 스케줄링을 다시 허가한다. 해당 명령은 단순히 스케줄링만 허가하기 때문에, drain시 다른 노드로 배치되었던 파드가 다시 돌아오지는 않는다.
[실습]
1. 노드 상태 확인
먼저 현재 노드의 상태를 확인한다. (출력은 시험 환경과 차이가 있다.)
controlplane $ kubectl get no
NAME STATUS ROLES AGE VERSION
controlplane Ready master 11m v1.18.0
node01 Ready <none> 10m v1.18.0
마스터 노드 1대, 워커 노드 1대로 구성된 클러스터이다. 먼저 마스터 노드를 업그레이드 한 후 워커노드를 업그레이드 한다.
2. 마스터 노드 drain
controlplane $ kubectl drain controlplane --ignore-daemonsets
node/controlplane already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/kube-flannel-ds-amd64-c9h4z, kube-system/kube-keepalived-vip-46r8b, kube-system/kube-proxy-9z5fn
evicting pod kube-system/coredns-66bff467f8-7j9ss
evicting pod kube-system/coredns-66bff467f8-h5wjg
pod/coredns-66bff467f8-7j9ss evicted
pod/coredns-66bff467f8-h5wjg evicted
node/controlplane evicted
마스터 노드를 drain한다. --ignore-daemonsets 옵션을 통해 데몬셋 제외 한 파드를 다른 노드에 배치한다.
3. 마스터 노드의 kubeadm 업그레이드
#현재 버전 확인
controlplane $ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"9e991415386e4cf155a24b1da15becaa390438d8", GitTreeState:"clean", BuildDate:"2020-03-25T14:56:30Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}
#apt 업그레이드 수행
controlplane $ apt update
...
#업그레이드 가능한 kubeadm 버전 확인
controlplane $ apt-cache madison kubeadm
kubeadm | 1.19.4-00 | http://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
kubeadm | 1.19.3-00 | http://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
kubeadm | 1.19.2-00 | http://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
kubeadm | 1.19.1-00 | http://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
kubeadm | 1.19.0-00 | http://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
...
#kubeadm 업그레이드
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=1.19.0-00 && \
apt-mark hold kubeadm
#업그레이드 된 kubeadm 버전 확인
kubeadm version: &version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.0", GitCommit:"e19964183377d0ec2052d1f1fa930c4d7575bd50", GitTreeState:"clean", BuildDate:"2020-08-26T14:28:32Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}
#컴포넌트 업그레이드 가능 버전 확인
kubeadm upgrade plan
Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT CURRENT AVAILABLE
kubelet 2 x v1.18.0 v1.19.12
Upgrade to the latest stable version:
COMPONENT CURRENT AVAILABLE
kube-apiserver v1.18.0 v1.19.12
kube-controller-manager v1.18.0 v1.19.12
kube-scheduler v1.18.0 v1.19.12
kube-proxy v1.18.0 v1.19.12
CoreDNS 1.6.7 1.7.0
etcd 3.4.3-0 3.4.9-1
#업그레이드 진행
kubeadm upgrade apply v1.19.0
[upgrade/version] You have chosen to change the cluster version to "v1.19.0"
[upgrade/versions] Cluster version: v1.18.0
[upgrade/versions] kubeadm version: v1.19.0
[upgrade/confirm] Are you sure you want to proceed with the upgrade? [y/N]: y
...
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.19.0". Enjoy!
kubeadm은 쿠버네티스 클러스터를 관리하는 관리 도구이다. kubeadm을 먼저 업그레이드 한 후 kubeadm upgrade plan 명령을 실행하면 업그레이드 가능한 쿠버네티스 버전과 각 컴포넌트들의 버전을 확인할 수 있다. 이후 kubeadm upgrade apply를 적용하여 업그레이드를 진행한다.
4. 마스터 노드의 kubelet, kubectl 업그레이드
#kubelet, kubectl 업그레이드
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.19.0-00 kubectl=1.19.0-00 && \
apt-mark hold kubelet kubectl
#kubelet 재시작
sudo systemctl daemon-reload
sudo systemctl restart kubelet
#kubelet, kubectl 버전 확인
controlplane $ kubelet --version
Kubernetes v1.19.0
controlplane $ kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.0", GitCommit:"e19964183377d0ec2052d1f1fa930c4d7575bd50", GitTreeState:"clean", BuildDate:"2020-08-26T14:30:33Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.0", GitCommit:"e19964183377d0ec2052d1f1fa930c4d7575bd50", GitTreeState:"clean", BuildDate:"2020-08-26T14:23:04Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}
5. 마스터 노드 uncordon
controlplane $ kubectl uncordon controlplane
node/controlplane uncordoned
6. 워커 노드 접속 및 kubeadm 업그레이드
#노드 확인
controlplane $ kubectl get no
NAME STATUS ROLES AGE VERSION
controlplane Ready master 8m49s v1.19.0
node01 Ready <none> 8m22s v1.18.0
#업그레이드 할 노드 drain
kubectl drain node01 --ignore-daemonsets
node/node01 evicted
#노드 접속
controlplane $ ssh node01
#노드의 kubeadm 버전 확인
node01 $ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"9e991415386e4cf155a24b1da15becaa390438d8", GitTreeState:"clean", BuildDate:"2020-03-25T14:56:30Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}
#kubeadm 업그레이드
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=1.19.0-00 && \
apt-mark hold kubeadm
#노드 업그레이드
kubeadm upgrade node
...
[upgrade] The configuration for this node was successfully updated!
7. kubelet 및 kubectl 업그레이드
#kubelet 및 kubectl 업그레이드
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.19.0-00 kubectl=1.19.0-00 && \
apt-mark hold kubelet kubectl
#kubelet 재시작
systemctl daemon-reload
systemctl restart kubelet
8. 노드 uncordon 및 노드 업그레이드 상태 확인
node01 $ exit
logout
Connection to node01 closed.
controlplane $ kubectl uncordon node01
node/node01 uncordoned
controlplane $ kubectl get no
NAME STATUS ROLES AGE VERSION
controlplane Ready master 18m v1.19.0
node01 Ready <none> 18m v1.19.0
업그레이드가 완료된 것을 확인할 수 있다.
2. 클러스터 백업
문서 링크: https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/
문제에서 인증서 관련 파일이 주어지기 때문에 어렵지 않게 수행할 수 있다.
root@controlplane $ ETCDCTL_API=3 etcdctl --cacert="/etc/kubernetes/pki/etcd/ca.crt" \
--cert="/etc/kubernetes/pki/etcd/server.crt" \
--key="/etc/kubernetes/pki/etcd/server.key" \
snapshot save /opt/snapsho.db
Snapshot saved at /opt/snapsho.db
CKA 자격증 정보 및 문제 풀이 연관 글
[쿠버네티스] CKA 자격 시험 접수 및 후기 (202105) | 데인트리 라이브러리
[쿠버네티스] CKA 기출 자료_1 [RBAC, Node] | 데인트리 라이브러리
[쿠버네티스] CKA 기출 자료_2 [클러스터 업그레이드, 백업] | 데인트리 라이브러리
[쿠버네티스] CKA 기출 자료_3 [파드, 디플로이먼트] | 데인트리 라이브러리
[쿠버네티스] CKA 기출 자료_4 [PV, PVC] | 데인트리 라이브러리
[쿠버네티스] CKA 기출 자료_5 [네트워킹] | 데인트리 라이브러리
내용에 오류가 있거나 질문이 있으면 댓글로 소통해주세요
언제나 환영합니다
'쿠버네티스 > CKA 자격증' 카테고리의 다른 글
[쿠버네티스] CKA 기출 자료_5 [네트워킹] | 데인트리 라이브러리 (4) | 2021.07.20 |
---|---|
[쿠버네티스] CKA 기출 자료_4 [PV, PVC] | 데인트리 라이브러리 (0) | 2021.07.20 |
[쿠버네티스] CKA 기출 자료_3 [파드, 디플로이먼트] | 데인트리 라이브러리 (0) | 2021.07.06 |
[쿠버네티스] CKA 기출 자료_1 [RBAC, Node] | 데인트리 라이브러리 (3) | 2021.06.13 |
[쿠버네티스] CKA 자격 시험 접수 및 후기 (202105) | 데인트리 라이브러리 (2) | 2021.05.23 |
댓글