일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 블린이
- 리스트의 리스트
- 독후감
- Envoy
- 와썹맨
- 삼성역량테스트
- leetcode
- 알고리즘
- BFS
- 기술적 채무
- 동적 프로그래밍
- LongestPalindromicSubstring
- mysql #numa #swap #memory
- minimum path sum
- 리트코드
- 트리
- technical debt
- 나는 아마존에서 미래를 다녔다
- 파이썬
- 김태강
- No Rules Rules
- Python
- 아마조니언
- Dynamic Programmin
- Unique Paths
- 규칙없음
- 프로그래머스
- list of list
- 그거봤어?
- 삼성인 아마조니언 되다
- Today
- Total
개발자가 되고 싶은 준개발자
[CKA] Kubernetes: 클러스터 관리(버전 업그레이드 및 백업하는 방법) 본문
노드 보수
소프트웨어 업데이트나 보안 패치를 적용할 때 노드를 클러스터에서 빼야 할 일이 생김.
노드를 보수(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으로 업그레이드.
실무에서 운영중인 클러스터를 업그레이드 해야 할 때 안전하게 업그레이드 하는 방법?
- 새로운 VM을 추가(Provision new VM) (Cloud에서 유용)
- 새 버전을 가진 노드를 추가 & 예전 버전 노드의 workload를 새 노드로 이동하고 노드는 삭제.
- 기존 노드들로만 업그레이드 진행
- 한 노드씩 업그레이드를 진행하고, 노드가 업그레이드되는 동안은 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
- imperative:kubectl 명령어로 실행하는 경우
- 백업: kubectl get all --all-namespaces -o yaml > all-deploy-services.yml
- declarative: yaml 파일을 미리 작성 후 적용하는 경우
- 백업: 쉬움 -> Source code repo(예. Github)에 configuration 관련 파일들 백업
- imperative:kubectl 명령어로 실행하는 경우
- 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
- ETCDCTL_API: etcdctl은 etcd의 Command line client
- 백업
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
'도커와 쿠버네티스 > CKA 자격증' 카테고리의 다른 글
[CKA] 쿠버네티스 클러스터 환경 구성(Vagrant, VirtualBox, KubeAdm) (0) | 2021.07.26 |
---|