OS Upgrades
Security Patch 나 Software Upgrade 등의 유지보수 사유로 Node 를 제거해야 하는 경우, 해당 Node 에서 실행되고 있는 Pod 을 다른 Node 에 옮겨두는 방법을 택할 수 있다.
kube-controller-manager --pod-eviction-timeout=5m0s
ReplicaSet 으로 배포된 Pod 의 경우, 기본적으로 5분 뒤 다른 Node 에 재배포된다.
kubectl drain node-1
Node 내 Pod 를 다른 Node 로 옮기고 싶은 경우 drain 명령어를 통해 Pod 를 옮길 수 있다. 만약 ReplicaSet 으로 배포되지 않은 Pod 가 존재한다면 Error 가 발생한다.
kubectl uncordon node-1
Node 가 재시작 된 이후 Pod 가 해당 Node 에 Scheduling 될 수 있도록 uncordon 을 사용할 수 있고,
kubectl cordon node-2
반대로 cordon 명령어를 통해 Node 에 Pod 가 Scheduling 되는 것을 제한할 수 있다.
Kubernetes Software Versions
K8s 는 일반적인 Software 처럼 Release Version 을 가지고 있으며, 기본적으로 최근 3개의 마이너 버전을 지원한다. kube-apiserver, controller-manager, kube-scheduler, kubelet, kube-proxy, kubectl 은 모두 동일한 버전으로 출시되며, etcd 와 core-dns 는 각각 다른 프로젝트이기에 독립적인 버전을 가지고 있다.
kube-apiserver 를 기준으로 다른 Component 들의 버전이 호환될 수 있는데 이는 아래와 같다.
- 예를 들어 kube-apiserver 가 v1.10 일 경우,
- controller-manager 와 kube-scheduler 는 v1.9 와 v1.10 이 호환되고,
- kubelet 과 kube-proxy 는 v1.8 과 v1.9 와 v1.10 이 호환되고,
- kubectl 은 v1.9 와 v1.10 과 v1.11 이 호환된다.
Cluster Upgrade Process
K8s Cluster 를 업그레이드할 때 EKS 나 AKS 같은 Managed-Service 를 사용한다면 간단하게 몇 번의 클릭으로 업그레이드가 가능하지만, 그렇지 않은 경우엔 kubeadm 툴을 활용해 Cluster 를 업그레이드할 수 있다.
# k8s apt repository 리스트 파일에서
vim /etc/apt/sources.list.d/kubernetes.list
# 아래로 변경
echo -e "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /" > /etc/apt/sources.list.d/kubernetes.list
# apt 업데이트 후 kubeadm 최신 버전 확인
apt update
apt-cache madison kubeadm
apt-get install kubeadm=1.32.0-1.1
kubeadm upgrade plan v1.32.0
kubeadm upgrade apply v1.32.0
kubectl get nodes
apt-get install kubelet=1.32.0-1.1
systemctl restart kubelet
kubectl get nodes
먼저 Master Node 를 위 명령어들을 통해 업그레이드하자. kubeadm 툴 역시 업그레이드하고자 하는 버전으로 새로 설치해주어야한다. 또한, kubectl get nodes 는 기본적으로 kubelet 의 버전을 보여주기 때문에 kubelet 역시 새로운 버전으로 설치해준 뒤 확인해보자.
# 먼저 node01 에 실행중인 Pod 을 drain 하고
kubectl drain node01
# node01 으로 접속한 뒤
ssh node01
# k8s apt repository 리스트 파일에서
vim /etc/apt/sources.list.d/kubernetes.list
# 아래로 변경
deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /
# apt 업데이트 후 kubeadm 최신 버전 확인
apt update
apt-cache madison kubeadm
apt-get install kubeadm=1.32.0-1.1
kubeadm upgrade node config --kubelet-version v1.32.0
apt-get install kubelet=1.32.0-1.1
systemctl restart kubelet
exit
kubectl uncordon node-1
이제 Worker Node 로 넘어간 뒤 마찬가지로 업그레이드해주면 된다.
Backup and Restore Methods
kubectl get all --all-namespaces -o yaml > all-deploy-services.yaml
Resource Configuration 자체를 yaml 파일로 저장하여 백업하는 방법이 있고,
# etcd 스냅샷 생성
export ETCDCTL_API=3
etcdctl snapshot save /tmp/snapshot.db \
--endpoints=https://[127.0.0.1]:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/etcd-server.crt \
--key=/etc/kubernetes/pki/etcd/etcd-server.key
etcdctl snapshot status snapshot.db
# etcd 복원
etcdctl snapshot restore /opt/snapshot-pre-boot.db \
--data-dir /var/lib/etcd-from-backup
# kube-apiserver 정지
service kube-apiserver stop
# etcd 재시작
systemctl daemon-reload
service etcd restart
# kube-apiserver 재시작
service kube-apiserver start또는 etcd 스냅샷을 이용해 백업하는 방법이 있다.
vi /etc/kubernetes/manifests/etcd.yaml
# 복원 이후 volume path 수정
volumes:
- hostPath:
path: /var/lib/etcd-from-backup
type: DirectoryOrCreate
name: etcd-data
복원 이후 etcd volume path 를 수정해주자.