우리는 Cluster Maintenance 클러스터 유지관리에 대해서 3가지 Chapter을 통해 배울것이다.
1. OS 업그레이드 |
2. Cluster 업그레이드 |
3. Backup & Restore |
1. OS upgrade
너의 k8s 클러스터 중 한개 노드를 꺼야되는 상황이 생겼다고 가정하자.
maintenance 목적으로 노드를 종료시켜야 할때가 분명 있을것이다. 인증서 교체를 하거나.. 소프트웨어가 업그레이드가 되었거나 등등
- upgrade a base software
- apply patch like Security patches etc
- change a CA certification
이러한 상황에 쿠버네티스는 어떤 방식으로 해결을 할까?
1. 노드가 5분안에 정상적으로 돌아올수 있다고 판단한다면, 당신은 그냥 업그레이드를 하면 된다.
# kube-controller-manager --pod-eviction-timeout duration Default: 5m0s
2. kubectl drain
그러나 5분안에 노드가 정상적으로 돌아올수 있다고 확신할수 없기 때문에 더 안전한 방법이 있습니다.
업그레이드를 수행하기 전에 노드에서 모든 포드를 안전하게 제거 하는 데 drain을 사용합니다. drain를 사용하면 포드의 컨테이너를 정상적으로 종료할수 있음
# kubectl drain $node이름
# kubectl drain $node이름 --ignore-daemonsets
##
drain 하려는 노드에 daemonset이나 파드를 스케쥴링 해주는 워크로드들이 배포되어 있을경우 사용한다.
# kubectl drain $node이름 --ignore-daemonsets --force
##
drain 하려는 노드에 daemonset이나 파드를 스케쥴링 해주는 워크로드가 아닌 독립 POD가 있을경우
그 데이터 및 어플리케이션을 lost하기 때문에 해당 옵션은 사용하지 않는것을 권장한다.
3. kubectl cordon
하지만 drain의 경우 Replicaset, DaemonSet, Deployment, job 등의 pod를 스케쥴링 해주는 워크로드들이 있는 경우
drain 시키지 못한다. 이럴때 강제로 --force 옵션을 통해 drain하게 되면 해당 노드에 존재했던 어플리케이션은
lost 된다.
이런 상황일때 cordon을 통해 해당 node를 unschedule 시킬수 있고, 반면 이미 존재한 어플리케이션에는 영향을
미치지 않도록 할수 있다.
#kubectl cordon $NODENAME
4. kubectl uncordon
drain을 해서 해당 노드가 전부 비워졌을 경우에 다시 recovery된 상태가 되면 uncordon을 통해 다시 스케쥴링 할수 있도록 만들어준다.
# kubectl uncordon $NODENAME
2. Cluster Upgrade
# kubeadm version과 4개의 static pod component들은 version이 같다.
# Cluster을 업데이트 할때
# 1개의 노드를 drain 한다.
# 그동안 kubeadm을 통해서 controlplane을 업그레이드 할것이다.
# apt update
# apt install kubeadm=1.20.0-00
# kubeadm upgrade apply v1.20.0
# apt install kubelet=1.20.0-00
# systemctl restart kubelet
# kubeadm version
v1.19.0
# kubeadm upgrade plan
kube-api-server : kubeadm과 버전이 같음
kube-ctr-manager : kubeadm과 버전이 같음
kube-scheduler : kubeadm과 버전이 같음
kube-proxy : kubeadm과 버전이 같음
CoreDNS : 별도의 버전을 가지고 있음
etcd : 별도의 버전을 가지고 있음
마찬가지로 node01 에 ssh 접속을 한후에
동일한 절차대로 node01도 업그레이드를 해주면 된다 : )
3. etcd Backup & Restore
### Backup
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
### Restore
ETCDCTL_API=3 etcdctl --data-dir /var/lib/etcd-from-backup \
snapshot restore /opt/snapshot-pre-boot.db
## 확인
cd /var/lib/etcd-from-backup
## 폴더가 생겼는지 확인
### Restore Tip
위 명령어를 입력했을때 Restore이 자동으로 되는것이 아니라
etcd static Pod의 definition file을 수정해줘야 한다. ( /etc/kubernetes/manifests/etcd.yaml)
etcd는 static POD 형태로 관리되고 있으며, volumes에 hostpath를 수정해준다
기본값은 /var/lib/etcd로 되어있는데 (name: etcd-data)
이를 /var/lib/etcd-from-backup 으로 수정해준다.
'컨테이너 > Kubernetes' 카테고리의 다른 글
[Kubernetes] (21). 문제풀이 (Ligtening Lab) (0) | 2021.09.25 |
---|---|
[Kubernetes] (20) Security (0) | 2021.09.15 |
[Kubernetes] (18). Application Lifecycle Management (0) | 2021.09.01 |
[Kubernetes] (16). Static Pods (0) | 2021.08.31 |
[Kubernetes] (17). DaemonSets (0) | 2021.08.30 |