클러스터 업그레이드에서 사용하는 명령어인 Drain, Cordon, Uncordon에 대해 알아보자
- 실행 중인 Pod를 모두 삭제하면, Controller에 의해 다른 Node에 다시 배포되는 방식이다. 따라서, Controller에 의해 실행되는 Pod들만 다른 Node로 이동이 가능하다
- Kubelet을 통해 실행되는 static Pod는 삭제되지 않는다
- 만약 Node에 DaemonSet이 있다면, DaemonSet은 해당 Node에 종속적인 오브젝트이므로, Drain 명령 시 오류가 발생한다. 따라서 Drain 할 때, ignore daemonset 옵션을 통해 DaemonSet은 삭제하지 않게 한다
- 만약 Node에 Controller에 의해 실행되지 않는 Standalone Pod가 있다면 Drain 명령 시 오류가 발생한다. 따라서 Drain을 하기 전에 배포된 Pod들을 Controller가 실행하는 Pod로 재배포해야 한다
- 만약 force 를 통해 강제로 실행하면, Standalone Pod들은 그냥 삭제된다
- 종료 명령을 받으면 파드들은 정상 종료되며, Drain은 모든 파드들이 정상 종료될때까지 대기한다
- PDB는 Drain을 사용할 때, 한 번에 모든 Pod가 재배포되는 것을 방지하기 위해, 한 번에 삭제되는 Pod 개수를 지정하는 오브젝트이다
- 고가용성을 보장하기 위해 몇 개 이상의 Pod를 반드시 유지해야 하는 경우
- max-available : 유지할 Pod 개수 지정. 해당 개수의 Pod를 제외한 나머지 모든 Pod 삭제 가능
- max-unavaliable : 삭제할 Pod 개수 지정. 한 번에 해당 개수만큼만 삭제된다
cordon : Node에 배포된 Pod는 유지하며, 새 Pod들이 스케줄링 되지 않게 한다. 해당 Node는 schedulingdisabled 상태가 된다
Uncordon : Drain 혹은 Cordon 을 적용하여 schedulingdisabled 상태가 된 Node 의 schedulingdisabled 상태를 없애준다. 새로운 Pod들이 스케줄링될 수 있다
클러스터 업그레이드에서 사용하는 패키지 관리 도구인 Apt에 대해 알아보자
- apt 명령어는 apt-get, apt-cache, dpkg -l이 결합된 명령어이다. 진행률 표시, 업데이트 가능한 패키지 목록 표시 등의 기능도 있다
- apt-get : 데비안 계열 리눅스의 cli 패키지 관리 도구이며, 인증된 소스에서 패키지를 검색하고, 종속성과 함께 패키지를 설치 & 업데이트 & 제거한다
- apt-cache : 패키지 조회
- dpkg -l : 설치된 패키지 조회
- apt-get에 옵션이 많아지다 보니, apt에서는 apt-get에서 자주 사용하는 옵션을 추출하여 사용자들이 보기 편하게 만들었다
- apt는 apt-get보다 추가적인 정보를 제공해준다. 허나 apt-get에서 자주 사용되는 옵션들을 추출하였기에, 기능이 제하적이다
- apt-get은 옵션이 더 많으므로, apt보다 더 많은 기능을 제공해준다. apt-get은 apt보다 오래됬으므로 더 안정적이고, 호환성이 높다
- Script를 작성할 때 apt-get을 사용하면, 더 안정적인 옵션을 통한 개발이 가능하다
- hold : 패키지를 고정하여 설치, 업그레이드, 제거되지 않는다
- unhold : 패키지 고정을 취소하여 모든 작업이 허용되게 한다
Kubeadm을 이용해 설치한 Kubernetes 클러스터를 업그레이드해보자
- ControlPlane Node Drain
- ControlPlane Node Kubeadm, Kubelet, Kubectl 업그레이드
- ControlPlane Node uncordon
- WorkerNode Drain
- WorkerNode Kubeadm, Kubelet, Kubectl 업그레이드
- WorkerNode uncordon
kubectl drain controlplane --ignore-daemonset
- 먼저, ControlPlane Node의 Daemonset 및 StaticPod를 제외한 Pod들을 삭제하고, 새 Pod가 스케줄링되지 않게 한다
apt update
- apt 패키지 관리 도구를 이용해 설치 가능한 패키지 리스트를 최신화 한다
apt-cache madison kubeadm
- 업그레이드 할 Kubeadm 버전을 확인한다
apt-mark unhold kubeadm
apt-get upgrade
apt-get install -y kubeadm=1.25.0-00
apt-mark hold kubeadm
- Kubeadm을 업그레이드한다
kubeadm upgrade plan
- 클러스터를 업그레이드 할 수 있는지 여부와 업그레이드 가능한 버전을 확인하자
- Kubelet은 따로 업그레이드 해야 하므로, Kubelet 업그레이드 가능 버전을 기억해두자
kubeadm upgrade apply v1.25.0
- 클러스터 업그레이드
- 컴포넌트 업그레이드 버전은 Kubeadm 버전보다 높으면 안된다
apt-mark unhold kubelet kubectl
apt-get update
apt-get install -y kubelet=1.25.0 kubectl=1.25.0
apt-mark hold kubelet kubectl
- Kubelet과 Kubectl을 업그레이드 한다
- 버전은 위에서 확인한 버전으로 업그레이드 한다
sudo systemctl daemon-reload
sudo systemctl restart kubelet
- Kubelet은 리눅스 데몬이기에 업그레이드 후 재시작해줘야 한다
kubectl uncordon controlplane
- ControlPlane Node 업그레이드 작업이 끝났으므로, 새 Pod가 스케줄링되게 uncordon 명령을 내린다
kubectl drain workernode01 --ignore-daemonsets
- 업그레이드할 Worker Node에 Drain 명령을 내린다
ssh workernode01
- 업그레이드할 Worker Node에 접속한다
apt-mark unhold kubeadm
apt-get update
apt-get install -y kubeadm=1.25.0-00
apt-mark hold kubeadm
- Kubeadm을 업그레이드한다. 이때, ControlPlane Node에서 업그레이드한 버전과 동일한 버전으로 업그레이드 해야 한다
kubeadm upgrade node
- Worker Node를 업그레이드 한다
apt-mark unhold kubelet kubectl
apt-get update
apt-get install -y kubelet=1.25.0 kubectl=1.25.0
apt-mark hold kubelet kubectl
- Kubelet과 Kubectl을 업그레이드 한다
sudo systemctl daemon-reload
sudo systemctl restart kubelet
- Kubelet은 리눅스 데몬이기에 업그레이드 후 재시작해줘야 한다
kubectl uncordon node01
- ControlPlane Node로 돌아와서 Worker Node에 uncordon 명령을 내린다
couldn't create a Kubernetes client from file "/etc/kubernetes/kubelet.conf": failed to load admin kubeconfig: open /etc/kubernetes/kubelet.conf: no such file or directory
To see the stack trace of this error execute with --v=5 or higher
- kubeadm upgrade node를 입력하면, 위와 같은 오류가 발생할 때가 있다
- 해당 Node가 Cluster에 가입되지 않았으므로 발생하는 오류다
kubeadm token create --print-join-command
- Master Node에서 Cluster 가입을 위한 Token을 생성하자. 명령을 실행하면, 밑에 Cluster에 가입할 Worker Node에서 실행해야 하는 명령어가 나온다. 복사해두자
ssh workernode
- Cluster에 가입할 Worker Node로 이동하자
kubeadm join *********:6443 --token ********* --discovery-token sha256:******************
- 위에서 복사한 명령어를 입력하자
- Worker Node가 Cluster에 가입되었다. 이제 다시 Cluster Upgrade를 진행하면 된다