기타/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 하지는 않음 |
> 점점 재미있어짐ㅎㅎ
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에 있으면? > 영원히 사라짐 |
> 쉽게 경험하지 못할 상황을 예시로 줘서 좋았음
나중에 다시 풀어봐야겠음 |
> 버전에 대해 알 수 있어서 좋았음
버전 많이 타서 힘들었는데, 이에 대해서 설명함 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
> 좋은 강의 여러번 봐야되는 강의
123. Demo - Cluster upgrade 12min
> 데모를 보여줌 꿀자료
124. Practice Test - Cluster Upgrade 0min
> 좋은 연습 문제
125. Solution: Cluster Upgrade 13min
> 꿀자료
26. Backup and Restore Methods 6min
> 백업 방법 3가지
127. Working with ETCDCTL 1min
> 마침 etdctl backup 관련 이슈가 업무에 있었는데 도움이 됨
128. Practice Test - Backup and Restore Methods 0min
> 으 어려움.. 하지만 너무나 소중한자료, 나도 master 재기동해야함
129. Solution - Backup and Restore 14min
> 상세하게 설명해줘서 좋았음
130. Certification Exam Tip! 1min
> 팁
131. 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하면 해결됨 |
> 데모를 보여줌 꿀자료
# cluster status check $ k cluster info 업그레이드 데모를 시현할 수 있는 웹사이트. 그런데 버전이 약간씩 안맞아서 실습하는데 시간이 좀 걸림 https://katacoda.com/ |
> 좋은 연습 문제
나중에 업그레이드 할 일이 있으면, 와서 봐야겠다. |
> 꿀자료
$ 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 |
> 백업 방법 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 도 백업 대상임 |
> 마침 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 |
> 으 어려움.. 하지만 너무나 소중한자료, 나도 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기 때문에 알아서 적용됨 |
> 상세하게 설명해줘서 좋았음
$ 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 ******* # 서버가 올라오는걸 확인할 수 있음 |
> 팁
실제 시험에서는 문제가 맞았는지 모르기 때문에 꼭 명령어로 확인하는 습관을 가져야함 |
728x90
반응형