Kubeadm으로 Kubernetes Cluster 업그레이드하기
사전 준비 사항
업그레이드할 버전을 선택합니다. Kubernetes / Version Skew Policy에 따라 minor 버전 1 증가 또는 patch 버전 증가만 가능합니다.
Kubernetes GitHub / CHANGELOG를 읽고 어떤 기능이 추가되고 제거되었는지 확인합니다.
kubent는 Kubernetes 클러스터에 deprecated된 API를 사용하는지 확인하는 도구입니다. asdf로 런타임 버전 관리하기를 참고하여 kubent를 설치합니다.
asdf plugin add kubent
아래 명령어를 실행하여 deprecated된 API를 사용하는지 확인합니다.
kubent
Control Plane Node 업그레이드
control plane component들을 업그레이드하기 전에 drain을 먼저 실행하여 Pod을 모두 축출하고, kubelet 업그레이드까지 완료한 후에 uncordon을 실행해도 됩니다.
한 번에 하나씩, 첫 번째 Node부터 업그레이드를 진행해야 합니다.
- First Node
- The Other Nodes
타겟 버전의 kubeadm을 설치한 후 아래 명령어를 실행하여 업그레이드 계획을 확인합니다.
kubeadm upgrade plan [<version>]
sudo kubeadm upgrade apply <version> [<flag> ...]
--config=<file>
:UpgradeConfiguration
설정 파일을 지정합니다.--ignore-preflight-errors=all
위 명령어가 실행되면
- 클러스터가 업그레이드 가능한 상태인지 확인합니다.
- Version Skey Policy를 따르는지 확인합니다.
- control plane component들의 이미지가 있는지 또는 pull 가능한지 확인합니다.
- control plane component들의 설정이 업그레이드가 필요한 경우 생성하거나 유저가 제공한 설정을 사용합니다.
- control plane component들을 업그레이드합니다. 실패하면 롤백합니다.
- 새로운 CoreDNS, kube-proxy manifest를 적용하고, 필요한 RBAC 설정을 생성합니다.
- apiserver의 인증서 만료가 180일 이내인 경우 인증서를 갱신합니다.
타겟 버전의 kubeadm을 설치한 후 아래 명령어를 실행하여 업그레이드합니다.
sudo kubeadm upgrade node [<flag> ...]
--config=<file>
:UpgradeConfiguration
설정 파일을 지정합니다.--ignore-preflight-errors=all
위 명령어가 실행되면
- 클러스터에서 ClusterConfiguration을 가져옵니다.
- 상황에 따라 kube-apiserver의 인증서를 백업합니다.
- control plane component들의 static Pod manifest를 업그레이드합니다.
- kubelet 설정을 업그레이드합니다.
kubelet을 업그레이드하기 전에 해당 노드의 Pod을 모두 축출합니다.
kubectl drain \
--ignore-daemonsets \
--delete-emptydir-data \
<node>
sudo systemctl stop kubelet
타겟 버전의 kubelet/kubectl을 설치하고 kubelet을 재시작합니다.
sudo systemctl daemon-reload
sudo systemctl start kubelet
업그레이드된 Node를 다시 스케줄 가능 상태로 변경합니다.
kubectl uncordon <node>
Worker Node 업그레이드
타겟 버전의 kubeadm을 설치한 후 아래 명령어를 실행합니다.
sudo kubeadm upgrade node
위 명령어가 실행되면
- 클러스터에서 ClusterConfiguration을 가져옵니다.
- kubelet 설정을 업그레이드합니다.
kubelet을 업그레이드하기 전에 해당 노드의 Pod을 모두 축출합니다.
kubectl drain \
--ignore-daemonsets \
--delete-emptydir-data \
<node>
sudo systemctl stop kubelet
타겟 버전의 kubelet/kubectl을 설치하고 kubelet을 재시작합니다.
sudo systemctl daemon-reload
sudo systemctl start kubelet
업그레이드된 Node를 다시 스케줄 가능 상태로 변경합니다.
kubectl uncordon <node>