본문 바로가기

컨테이너/Kubernetes

[Kubernetes] (19). Cluster Maintenance

우리는 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 으로 수정해준다.