'데이터 엔지니어'로 성장하기

정리하는 걸 좋아하고, 남이 읽으면 더 좋아함

기타/K8S

udemy)CKA 강의 듣고 따라하기_6장_cluster mng :: mightytedkim

MightyTedKim 2022. 4. 3. 00:06
728x90
반응형

udemy)CKA 강의 듣고 따라하기_6장_cluster mng 

+ 후기
수강 기간: 20220402-0406(5일)

(수강 전)
실제 온프렘에서 k8s cluster를 운영하고 있기 때문에 재미있을 것 같다 ㅎㅎ
생각보다 빡시다. 하지만 언제 이런 정보 얻겠나 싶어서 재미있게 들음

(수강 후)
마침 etcdctl 관련 이슈가 있어서, 정보가 필요했는데 이 강의를 들어서 이해되기 시작했다.
여러번 돌려들을 정도로 꼼꼼하게 들었고 지금까지 강의 중에서 제일 재미있었다.
- master, worker 업그레이드하는 과정에서 drain, cordon, uncordon
- etcdctl snapshot save, restore

Section 6: Cluster Maintenance  | 1hr 11min

115. Cluster Maintenance - Section Introduction 1min
> 개요 설명
 
116. Download Presentation Deck 1min
> 강의 자료
 
117. OS Upgrades 4min
>  그림으로 친절하게 설명해줌
cluster가 죽는 상황을 살펴 볼 것
어떻게 배포했느지 따라 상황이 달라짐

- replica가 있으면, 다른 node의 pod에 붙음
- 바로 node가 복구 되면, 원래 pod에 붙음
- Node가 5분동안 내려가면, pod가 죽음 -> 다른 node에 recreate됨 
 $ k-controller-manager --pod-eviction-timeout=5m0s ...
- node가 5분뒤 다시 올라오면 pod 없는 상태로 돌아옴
 
노드를 죽이는 좀 더 안전한 방법
drain
k drain node-1 (다른 node로 workload를 분배)
다시 올라오면, 
k uncordon node-1 
으로 돌려줘야함

k cordon node-2
이거는  노드를  unschedulable 하게 만들어줌, terminate 하지는 않음
118. Practice Test - OS Upgrades 0min
> 점점 재미있어짐ㅎㅎ
1. drain
>  node01의  pod 옮기기

$ k drain node01
error: cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-system/kube-flannel-ds-9zqjf, kube-system/kube-proxy-cblcx

# daemonset 무시해주기
kubectl drain node01 --ignore-daemonsets

---

2. cordon
> node01이 스케줄 되게 설정하기
 - node01 cordon 설정 (다음 pod부터 할당 가능하도록)
$ k uncordon node01
$ k get nodes # 상태 확인
$ k describe nodes master | grep -i taint # taint no-scheduler

3. deploy, replica, daemon, replica가 없는 pod가 node에 있으면? 
> 영원히 사라짐

119. Solution - OS Upgrades (optional) 6min
> 쉽게 경험하지 못할 상황을 예시로 줘서 좋았음
나중에 다시 풀어봐야겠음
120. Kubernetes Software Versions 3min
> 버전에 대해 알 수 있어서 좋았음
버전 많이 타서 힘들었는데, 이에 대해서 설명함
v1.11.3 (major,minor,patch)

alpha : 버그 수정 먼저 작용
beta : 버그 테스트 한번 더, 이후 release로 감

버전이 같은 것 : kube-apiserver, controll-manager, kube-scheduler, kubelet, kube-proxy, kubectl
버전이 다른 것 : etcd cluster, coredns
121. References 1min
> 관련 링크 122. Cluster Upgrade Process 11min
> 좋은 강의 여러번 봐야되는 강의
cluster 업그레이드할 때 고려해야하는 것

1. kube-apiserver 보다 다른 것들의 버전이 낮아야함

x: kube apisever 
x-1: controller-manager, kube-scheduler
x-2: kubelet, kube-proxy
x+1 > x-1 : kubectl

2. 정식 지원
 minor 3버전까지만  공식적으로 지원함
업그레이드는 minor 버전 한단계씩 올려야함

3. 업그레이드 방법
- 클라우드를 사용하면-> 설정값
- kubeadm -> kubeadm upgrade plan, kubeadm upgrade apply
- 수작업으로 해야될 수 있음

3-1. master 노드 먼저 업그레이드 진행
 - master 내려가도  worker node가 죽지는 않음
 - 대신 kubectl 을 사용하지 못함, fail나면 새로 올라가지 않음

# worker node 업그레이드 방법
3-1-1 worker 모두 업그레이드하면 시스템 죽음, 상관없으면 해도됨
3-1-2 worker 하나씩 죽이려면 pod 옮겨가면서 진행해야됨
3-1-3. 새로운 버전의 worker node 추가 후 pod  옮기기

--

$ kubeadm upgrade plan

current cluster. version
kubeadm version
latest stable version 
등의 정보를 줌

kubelet 수동으로 노드마다 업그레이드해야함
kubeadm은 k8s와 같은 버전 가짐

--
# 업그레이드 요약

$ apt-get upgrade -y kubeadm=1.12.0-00
$ k upgrade apply v1.12.0
$ k get nodes #여기서 버전이 아직 적용안됨, 이유는 kubelet version을 보여주기 때문

이제 각각 kubelet 하나씩 설정해줘야함
보통은 master에 kubelet 설치하지 않음, 그런데 아래 예시는 설치했다고 가정
# master node 접속
$ apt-get upgrade -y kubelet=1.12.0-00
$ systemctl restart kubelet
$ k get nodes # 특정 node의 kubelet이 업그레이드 된것 확인함

# worker node 접속
$ k drain node01 #pod들 다른 node로 옮기기
$ apt-get upgrade -y kubeadm=1.12.0-00
$ apt-get upgrade -y kubelet=1.12.0-00
$ kubeadm upgrade node config --kubelet-version v1.12.0
$ systemcl restart  kubelet

## drain하면 해당 node를 unshcedulable로 만들기 때문에, unmark 해줘야함
$ k uncordon node01 #다시 옮겨지지 않음, 그냥 unmark 된거임, 다른 노드들에도 drain하면 해결됨
 
123. Demo - Cluster upgrade 12min
> 데모를 보여줌  꿀자료
# cluster status check
$ k cluster  info

업그레이드 데모를 시현할 수 있는 웹사이트. 그런데 버전이 약간씩 안맞아서 실습하는데 시간이 좀 걸림
https://katacoda.com/

124. Practice Test - Cluster Upgrade 0min
> 좋은 연습 문제 
나중에 업그레이드 할 일이 있으면, 와서 봐야겠다.
125. Solution: Cluster Upgrade 13min
> 꿀자료
$ k get nodes

# client, server
$ k version --short
$ kubeadm upgrade plan
$ k drain controlplane

---
# ubuntu
---
#controlplane
## kubeadm upgrade 

$ apt install kubeadm=1.18.0-00 -y
$ k drain controlplane
$ kubeadm upgrade apply v1.18.0
$ k uncordon controlplane
$ k version --short 

## kubelet upgrade(k get nodes, kubelet)

$ k drain controlplane
$ kubeadm upgrade apply v1.18.0
$ k uncordon controlplane
$ k version --short 


#worker
## kubeadm upgrade (controlplane과 동일함)

$ k drain node01
$
ssh node01
$ (node01) apt install kubeadm=1.18.0-00 -y
$ (node01) kubeadm upgrade node

## kubelet upgrade(k get nodes, kubelet)
$ (node01) apt install kubelet=1.18.0-00 -y
$ exit

$ k get nodes # version all changed
$ k uncordon node01
26. Backup and Restore Methods 6min
> 백업 방법 3가지
무엇을 백업해야할까?

1. config 백업
- imperattive + declartive 
- source code에 저장하는것이 필요함 (github)
- 솔루션 ㅣ VELERO(ARK)로도 가능함, api로 관리함
 
2. ETCD Cluster
- 모든 클러스터 정보가 저장됨
- master에 호스트됨. etcd.service에 백업이 저장됨
- snapshot도 있음.  ETCDCTL_API=3 etcdctl snapshot save snapshot.db
복구하는법
$ Service kube-apiserver stop
$ ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \ --data-dir /var/lib/etcd-from-backup
-> 새로 만들어짐, 이후 etcd.service의 data-dir 경로 변경
$ systemctl daemon-reload
$ service etcd restart
$ service kube-apiserver start 
+ endpoint, certificate 설정을 꼭 넣어줘야함
managed service 사용하면 etcd 권한도 없을 거임

3. PV 도 백업 대상임
127. Working with ETCDCTL 1min
> 마침 etdctl backup 관련 이슈가 업무에 있었는데 도움이 됨
etcdctl 로 백업할 때 etdctl_api=3 으로 설정해야함

$ etdctl version

$ etcdctl snapshot save -h
--cacert                                                verify certificates of TLS-enabled secure servers using this CA bundle
--cert                                                    identify secure client using this TLS certificate file
--endpoints=[127.0.0.1:2379]          This is the default as ETCD is running on master node and exposed on localhost 2379.
--key                                                      identify secure client using this TLS key file

$ etcdctl snapshot restore -h
128. Practice Test - Backup and Restore Methods 0min
> 으 어려움.. 하지만 너무나 소중한자료, 나도 master 재기동해야함
# etcd cluster 접근하는 url
$ kubectl describe pod etcd-controlplane -n kube-system
--listen-client-urls=https://127.0.0.1:2379,https://10.37.46.3:2379

$ ETCDCTL_API=3 etcdctl 
--endpoints=https://127.0.0.1:2379 \ 
--cacert=/etc/kubernetes/pki/etcd/ca.crt \ 
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \ 
snapshot save /opt/snapshot-pre-boot.db

$ ETCDCTL_API=3 etcdctl snapshot restore snapshot-pre-boot.db --data-dir /var/lib/etcd-from-backup
2022-04-05 14:52:11.203439 I | mvcc: restore compact to 1646
2022-04-05 14:52:11.209946 I | etcdserver/membership: added member 8e9e05c52164694d [http://localhost:2380] to cluster cdf818194e3a8c32

$ vi /etc/kubernetes/manifests/etcd.yaml
  - hostPath:
          #path: /var/lib/etcd
      path: /var/lib/etcd-from-backup
      type: DirectoryOrCreate
    name: etcd-data

# static pod기 때문에 알아서 적용됨
129. Solution - Backup and Restore 14min
> 상세하게 설명해줘서 좋았음
$ kubectl describe pod etcd-controlplane -n kube-system 
# master에서 접근하는 url 
--listen-client-urls=https://127.0.0.1:2379,https://10.37.46.3:2379
#  other node to join 
--listen-peer-urls=https://172.17.0.12:2380


etcdctl을 설정값  잘못입력하거나 개행하면 입력자체가 안됨

restore 예시는 너무 좋앗음

$ docker ps -a | grep etcd
# 새로 시작된  docker conatiner id를 describe
$ docker describe *******
# 서버가 올라오는걸 확인할 수 있음
130. Certification Exam Tip! 1min
> 팁
실제 시험에서는 문제가 맞았는지 모르기 때문에 꼭 명령어로 확인하는 습관을 가져야함

131. References 1min

 

728x90
반응형