1. Operation System Upgrade
Kubernetes 클러스터를 관리하면서 가장 중요한 작업 중 하나는 클러스터 내 노드의 유지 보수다. 유지 보수 작업은 시스템 업그레이드, 패치 적용, 보안 강화 등 다양한 이유로 수행된다.
kubernetes 에서는 여러 노드와 포드가 서로 연결되어 클러스터를 구성한다.
각 노드는 다수의 pods를 호스팅할 수 있으며, 이 pods들은 클러스터 내에서 애플리케이션을 실행하는 컨테이너들로 구성되어있다. 하지만, 유지 보수와 같은 이유로 node를 다운시킬 때, 해당 node의 pods에 접근할 수 없게 됩니다. 이는 서비스의 연속성에 큰 영향을 미칠 수 있다.
이때, '드레인(Drain)'과 '커든(Cordon)' 기능을 사용하면 이러한 상황을 대비할 수 있다.
드레인(Drain): 드레인 명령어는 유지 보수를 위해 node에서 pod를 안전하게 제거하고, 작업을 클러스터 내의 다른 node로 이동시키는 과정이다.
커든(Cordon): 특정 node에서 새로운 pod의 스케줄링을 방지할 수 있습니다. 이는 드레인과는 달리 기존에 존재하는 pod를 종료하거나 이동시키지 않지만, 추가적인 pod가 그 노드에 배치되는 것을 막는다.
# node01 를 비워라 (데몬셋을 무시하고)
kubectl drain node01 --ignore-daemonsets
# node01 에 대해 "SchedulingDisabled" 상태를 해제하여 다시 파드를 해당 노드에 예약할 수 있게 해라
kubectl uncordon node01
2. cluster upgrade process
쿠버네티스는 가장 최신의 3개 버전만 지원한다.
요소(component)들이 모두 반드시 같은 버전으로만 사용되어야 하는 것은 아니다.
- kube-apiserver가 X 버전(e.g. v.1.10)이라면
- controller-manager, kube-scheduler는 X-1 버전(e.g. v1.9, v1.10)까지
- kubelet, kube-proxy는 X-2 버전(e.g. v.1.8, v1.9, v1.10)까지
- kube-apiserver보다 높은 버전을 가질 수는 없음
이러한 특성 덕분에 live upgrade가 가능
- 요소(component)별로 업그레이드 가능
- 여러 버전을 한 번에 건너뛰어서 업그레이드하기 보다는, 한 버전씩 순차적으로 업그레이드하는 것이 권장된다.
# 버전확인
kubectl version
# workloads를 호스팅하기 위해서는 taints 가 있으면 안된다. (-i 대소문자 구분 x)
kubectl describe nodes node01 | grep -i taints
kubernetes 1.28 에서 1.29로 업데이트 하는 방법
원하는 텍스트 편집기를 사용하여 Kubernetes apt 저장소를 정의하는 파일을 연다.
vim /etc/apt/sources.list.d/kubernetes.list
URL에서 버전을 다음 사용 가능한 마이너 릴리스로 업데이트한다. 즉, v1.29로 업데이트한다.
deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /
변경 사항을 저장하고 텍스트 편집기를 종료한 뒤 다음 명령어를 실행한다.
root@controlplane:~# apt update
root@controlplane:~# apt-cache madison kubeadm
apt-cache madison으로 표시된 버전 정보를 기반으로 하면 Kubernetes 버전 1.29.0에 대한 사용 가능한 패키지 버전이 1.29.0-1.1임을 나타낸다.
따라서 Kubernetes v1.29.0을 위한 kubeadm을 설치하려면 다음 명령어를 사용해야한다.
root@controlplane:~# apt-get install kubeadm=1.29.0-1.1
Kubernetes 클러스터를 업그레이드
root@controlplane:~# kubeadm upgrade plan v1.29.0
root@controlplane:~# kubeadm upgrade apply v1.29.0
💡 kubeadm은 Kubernetes 클러스터의 부트스트래핑(bootstraping)을 위한 도구
이제 원하는 노드를 업데이트 해보자. (controlplane)
root@controlplane:~# apt-get install kubelet=1.29.0-1.1
root@controlplane:~# systemctl daemon-reload
root@controlplane:~# systemctl restart kubelet
root@controlplane:~# kubectl uncordon controlplane
사실 시험볼땐 아래 페이지를 참고할 수 있다.
https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
Upgrading kubeadm clusters
This page explains how to upgrade a Kubernetes cluster created with kubeadm from version 1.28.x to version 1.29.x, and from version 1.29.x to 1.29.y (where y > x). Skipping MINOR versions when upgrading is unsupported. For more details, please visit Versio
kubernetes.io
worker node를 업그레이드 하기
node로 먼저 들어가야된다.
controlplane ~ ➜ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
controlplane Ready control-plane 71m v1.29.0 192.23.18.9 <none> Ubuntu 20.04.6 LTS 5.4.0-1106-gcp containerd://1.6.6
node01 Ready,SchedulingDisabled <none> 70m v1.28.0 192.23.18.12 <none> Ubuntu 20.04.6 LTS 5.4.0-1106-gcp containerd://1.6.6
controlplane ~ ➜ ssh 192.23.18.12
root@node01 ~ ➜
업데이트 하기
먼저 kubernetes apt 저장소 정의 파일을 1.29로 수정
root@node01 ~ ➜ 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.29/deb/ /
apt update 후 확인
root@node01 ~ ➜ apt update
Hit:2 https://download.docker.com/linux/ubuntu focal InRelease
Hit:3 http://security.ubuntu.com/ubuntu focal-security InRelease
Hit:4 http://archive.ubuntu.com/ubuntu focal InRelease
Get:1 https://prod-cdn.packages.k8s.io/repositories/isv:/kubernetes:/core:/stable:/v1.29/deb InRelease [1186 B]
Hit:5 http://archive.ubuntu.com/ubuntu focal-updates InRelease
Hit:6 http://archive.ubuntu.com/ubuntu focal-backports InRelease
Get:7 https://prod-cdn.packages.k8s.io/repositories/isv:/kubernetes:/core:/stable:/v1.29/deb Packages [6511 B]
Fetched 7697 B in 1s (8475 B/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
65 packages can be upgraded. Run 'apt list --upgradable' to see them.
root@node01 ~ ➜ sudo apt-cache madison kubeadm
kubeadm | 1.29.3-1.1 | https://pkgs.k8s.io/core:/stable:/v1.29/deb Packages
kubeadm | 1.29.2-1.1 | https://pkgs.k8s.io/core:/stable:/v1.29/deb Packages
kubeadm | 1.29.1-1.1 | https://pkgs.k8s.io/core:/stable:/v1.29/deb Packages
kubeadm | 1.29.0-1.1 | https://pkgs.k8s.io/core:/stable:/v1.29/deb Packages
sudo apt-mark unhold kubeadm && \
sudo apt-get update && sudo apt-get install -y kubeadm='1.29.0-1.1' && \
sudo apt-mark hold kubeadm
kubeadm 업그레이드
sudo kubeadm upgrade node
kubelet 및 kubectl 업그레이드
sudo apt-mark unhold kubelet kubectl && \
sudo apt-get update && sudo apt-get install -y kubelet='1.29.0-1.1' kubectl='1.29.0-1.1' && \
sudo apt-mark hold kubelet kubectl
kubelet 재실행
sudo systemctl daemon-reload
sudo systemctl restart kubelet
3. Backup and Restore
보통은 github 같은 곳에 backup을 위한 파일들을 저장하는 것이 좋다.
하지만 무조건 그럴 필요는 없고, 다른 방법이 있다.
kubectl을 이용해 KubeAPI 서버를 쿼리 하거나 API 서버에 직접 액세스함으로써 모든 리소스 구성을 복사해서 저장할 수 있다.
"쿼리"는 데이터베이스나 데이터 저장소에서 정보를 검색하거나 가져오는 작업을 말합니다.
예를들어
kubectl get all --all-namespaces -o yaml > all-deploy-services.yaml
ETCD 클러스터
ETCD CLUSTER는 클러스터 상태 정보를 저장한다.
이 ETCD 를 스냅샷을 찍어서 복원하는 방법은 아래와 같다.
먼저 etcd-controlplane 을 확인하면 아래와 같은 정보들이 나온다.
controlplane ~ ➜ kubectl describe pod etcd-controlplane -n kube-system
Name: etcd-controlplane
Namespace: kube-system
Priority: 2000001000
Priority Class Name: system-node-critical
Node: controlplane/192.26.207.8
Start Time: Tue, 19 Mar 2024 12:07:53 +0000
Labels: component=etcd
tier=control-plane
Annotations: kubeadm.kubernetes.io/etcd.advertise-client-urls: https://192.26.207.8:2379
kubernetes.io/config.hash: 9557231b7c47fccbae5c6647aedeff2e
kubernetes.io/config.mirror: 9557231b7c47fccbae5c6647aedeff2e
kubernetes.io/config.seen: 2024-03-19T12:07:39.447167067Z
kubernetes.io/config.source: file
Status: Running
SeccompProfile: RuntimeDefault
IP: 192.26.207.8
IPs:
IP: 192.26.207.8
Controlled By: Node/controlplane
Containers:
etcd:
Container ID: containerd://32487c61886a88c91962aa5f181169d8e2110b811f4e2fb029763754c297d76f
Image: registry.k8s.io/etcd:3.5.10-0
Image ID: registry.k8s.io/etcd@sha256:22f892d7672adc0b9c86df67792afdb8b2dc08880f49f669eaaa59c47d7908c2
Port: <none>
Host Port: <none>
Command:
etcd
--advertise-client-urls=https://192.26.207.8:2379
--cert-file=/etc/kubernetes/pki/etcd/server.crt
--client-cert-auth=true
--data-dir=/var/lib/etcd
--experimental-initial-corrupt-check=true
--experimental-watch-progress-notify-interval=5s
--initial-advertise-peer-urls=https://192.26.207.8:2380
--initial-cluster=controlplane=https://192.26.207.8:2380
--key-file=/etc/kubernetes/pki/etcd/server.key
--listen-client-urls=https://127.0.0.1:2379,https://192.26.207.8:2379
--listen-metrics-urls=http://127.0.0.1:2381
--listen-peer-urls=https://192.26.207.8:2380
--name=controlplane
--peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
--peer-client-cert-auth=true
--peer-key-file=/etc/kubernetes/pki/etcd/peer.key
--peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
--snapshot-count=10000
--trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
여기서
--listen-client-urls=https://127.0.0.1:2379,https://192.26.207.8:2379
--trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
--cert-file=/etc/kubernetes/pki/etcd/server.crt
--key-file=/etc/kubernetes/pki/etcd/server.key
등의 내용을 참고해서
아래 명령어를 입력하면 된다.
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=<trusted-ca-file> --cert=<cert-file> --key=<key-file> \
snapshot save <backup-file-location>
백업으로 복원하기
ETCDCTL_API=3 etcdctl --data-dir <data-dir-location> snapshot restore snapshot.db
아까 내용에서
--data-dir=/var/lib/etcd
이거 참고해서 나는 var/lib/etcd-from-backup 에 저장할거고 저장한 db를 마지막에 snapsho.db 대신에 첨부
controlplane ~ ➜ ETCDCTL_API=3 etcdctl --data-dir /var/lib/etcd-from-backup \
snapshot restore /opt/snapshot-pre-boot.db
2024-03-19 12:34:31.700553 I | mvcc: restore compact to 1694
2024-03-19 12:34:31.716644 I | etcdserver/membership: added member 8e9e05c52164694d [http://localhost:2380] to cluster cdf818194e3a8c32
controlplane ~ ➜ ls /var/lib/etcd-from-backup/
member
그리고 /etc/kubernetes/manifests/etcd.yaml 에 들어가서 수정한다.
volumes:
- hostPath:
path: /etc/kubernetes/pki/etcd
type: DirectoryOrCreate
name: etcd-certs
- hostPath:
path: /var/lib/etcd-from-backup
type: DirectoryOrCreate
name: etcd-data
그리고 몇분 기다리면 된다.