Kubernetes Client Version과 Server Version
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.2", GitCommit:"092fbfbf53427de67cac1e9fa54aaa09a28371d7", GitTreeState:"clean", BuildDate:"2021-06-16T12:59:11Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"9e991415386e4cf155a24b1da15becaa390438d8", GitTreeState:"clean", BuildDate:"2020-03-25T14:50:46Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}
WARNING: version difference between client (1.21) and server (1.18) exceeds the supported minor version skew of +/-1
kubectl의 버전이 Client Version이고, Kubernetes Cluster의 Kubernetes API Server의 버전이 Server Version이다. Kubectl 버전과 Kubernetes API Server의 버전 차이가 너무 많이 나게 되면 Yaml file로 리소스를 생성할 때 API Server가 문법을 인식하지 못해 에러가 나기도 한다.
업그레이드 순서
1.기본 컨트롤 플레인 노드를 업그레이드한다.
2.추가 컨트롤 플레인 노드를 업그레이드한다.
3.워커(worker) 노드를 업그레이드한다.
컨트롤 플레인 노드 업그레이드 (master node)
버전 다운로드
✅ 한번에 한 단계씩만 버전을 업그레이드 할 수 있다. (1.29.x->1.20.x, 1.20.x -> 1.21.x)
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=1.23.x-00 && \
apt-mark hold kubeadm
다운로드하려는 버전이 잘 받아졌는지 확인한다.
kubeadm version
업그레이드 계획을 확인한다.
이 명령은 클러스터를 업그레이드할 수 있는지를 확인하고, 업그레이드할 수 있는 버전을 가져온다. 또한 컴포넌트 구성 버전 상태가 있는 표를 보여준다.
kubeadm upgrade plan
✅ 한번에 한 단계씩만 버전을 업그레이드 할 수 있다.
여러 단계를 업그레이드하려하면 plan 명령어 입력시 아래와 같은 출력이 나온다.
업그레이드할 버전을 선택하고, 적절한 명령을 실행한다. 예를 들면 다음과 같다.
# 이 업그레이드를 위해 선택한 패치 버전으로 x를 바꾼다.
sudo kubeadm upgrade apply v1.23.x
명령어 완료되면 다음을 확인해야한다.
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.20.0". Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.
노드 드레인
- Prepare the node for maintenance by marking it unschedulable and evicting the workloads:
# <node-to-drain>을 드레인하는 노드의 이름으로 바꾼다.
kubectl drain <node-to-drain> --ignore-daemonsets
kubelet과 kubectl 업그레이드
모든 컨트롤 플레인 노드에서 kubelet 및 kubectl을 업그레이드한다.
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.23.x-00 kubectl=1.23.x-00 && \
apt-mark hold kubelet kubectl
kubelet을 다시 시작한다.
sudo systemctl daemon-reload
sudo systemctl restart kubelet
노드 uncordon
- 노드를 스케줄 가능으로 표시하여 노드를 다시 온라인 상태로 전환한다.
# <node-to-drain>을 드레인하는 노드의 이름으로 바꾼다.
kubectl uncordon <node-to-drain>
워커 노드 업그레이드
워커 노드의 업그레이드 절차는 워크로드를 실행하는 데 필요한 최소 용량을 보장하면서, 한 번에 하나의 노드 또는 한 번에 몇 개의 노드로 실행해야 한다.
kubeadm 업그레이드
모든 워커 노드에서 kubeadm을 업그레이드한다.
# 1.23.x-00의 x를 최신 패치 버전으로 바꾼다
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=1.23.x-00 && \
apt-mark hold kubeadm
-
# apt-get 버전 1.1부터 다음 방법을 사용할 수도 있다
apt-get update && \
apt-get install -y --allow-change-held-packages kubeadm=1.23.x-00
"kubeadm upgrade" 호출
워커 노드의 경우 로컬 kubelet 구성을 업그레이드한다.
sudo kubeadm upgrade node
노드 드레인
스케줄 불가능(unschedulable)으로 표시하고 워크로드를 축출하여 유지 보수할 노드를 준비한다.
# <node-to-drain>을 드레이닝하려는 노드 이름으로 바꾼다.
kubectl drain <node-to-drain> --ignore-daemonsets
kubelet과 kubectl 업그레이드
kubelet 및 kubectl을 업그레이드한다.
# 1.23.x-00의 x를 최신 패치 버전으로 바꾼다
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.23.x-00 kubectl=1.23.x-00 && \
apt-mark hold kubelet kubectl
-
# apt-get 버전 1.1부터 다음 방법을 사용할 수도 있다
apt-get update && \
apt-get install -y --allow-change-held-packages kubelet=1.23.x-00 kubectl=1.23.x-00
kubelet을 다시 시작한다.
sudo systemctl daemon-reload
sudo systemctl restart kubelet
노드에 적용된 cordon 해제
스케줄 가능(schedulable)으로 표시하여 노드를 다시 온라인 상태로 만든다.
# <node-to-drain>을 노드의 이름으로 바꾼다.
kubectl uncordon <node-to-drain>
https://kubernetes.io/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
kubeadm 클러스터 업그레이드
이 페이지는 kubeadm으로 생성된 쿠버네티스 클러스터를 1.22.x 버전에서 1.23.x 버전으로, 1.23.x 버전에서 1.23.y(여기서 y > x) 버전으로 업그레이드하는 방법을 설명한다. 업그레이드가 지원되지 않는
kubernetes.io
'Kubernetes' 카테고리의 다른 글
Controller [2] - ReplicaSet (0) | 2022.01.29 |
---|---|
Controller [1] - Replication Controller (0) | 2022.01.29 |
5-1. kubernetes pod (0) | 2022.01.21 |
kubeadm init 에러 : Get http://localhost:10248/healthz: dial tcp 127.0.0.1:10248: connect: connection refused (0) | 2022.01.18 |
namespace 강제 삭제하기 (0) | 2022.01.14 |