Kubernetes/Kubernetes 이론

Kubernetes Version upgrade

이쿠우우 2020. 11. 7. 12:41
반응형

 

 

Kubernetes Version upgrade

 

 

Kubernetes Version 1.18.3에서 1.19.2 Version 으로 Upgrade 과정 정리

 

 

[환경]

 

Master Node server

 OS = CentOS 7

 리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64

 docker version : 1.13.1

 api verison : 1.26

 

Worker Node server

 OS = CentOS 7

 리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64

 docker version : 1.13.1

 api verison : 1.26

 

Kubernetes version

 1.18

 

 

 


 

1. 현재 Version 확인

 

[명령어]

kubectl version

 

[결과]

Kubernetes version

1.18

 

 


 

 

2. Upgrade Version 결정

 

[CentOS, RHEL, Fedora 명령어]

yum list --showduplicates kubeadm --disableexcludes=kubernetes

 

[Ubuntu, Debian, HypriotOS 명령어]

apt update

apt-cache madison kubeadm

 

 

2.1. CentOS 에서 해당 명령 결과

yum list --showduplicates kubeadm --disableexcludes=kubernetes

 

최신 Version이 1.19.2 로 조회가 되어서

해당 Version으로 Upgrade 하기로 함

 

 

 


 

 

 

3. Master Node Version Upgrade

 

 

3.1. kubeadm Upgrade

 

[CentOS, RHEL, Fedora 명령어]

(1.19.x-0에서 x를 최신 패치 버전으로 변경.)

yum install -y kubeadm-1.19.x-0 --disableexcludes=kubernetes

 

예)

yum install -y kubeadm-1.19.2-0 --disableexcludes=kubernetes

 

 

[Ubuntu, Debian, HypriotOS 명령어]

(1.19.x-00에서 x를 최신 패치 버전으로 변경)

apt-mark unhold kubeadm && \

apt-get update && apt-get install -y kubeadm=1.19.x-00 && \

apt-mark hold kubeadm

 

 

(apt-get 버전 1.1부터 다음 방법을 사용할 수도 있음)

apt-get update && \

apt-get install -y --allow-change-held-packages kubeadm=1.19.x-00

 

 

[CentOS에서 명령 결과]

 

 

3.2. kubeadm Version 확인

 

[명령어]

kubeadm version

 

[결과]

1.19.2로 변경됨.

 

 

 

3.3. Master Node Drain 작업. (잠시 Cluster에서 제외시킴)

 

[명령어]

(<cp-node-name>을 컨트롤 플레인 노드 이름으로 변경)

kubectl drain <cp-node-name> --ignore-daemonsets

 

예)

kubectl drain kube.master.node --ignore-daemonsets

 

[결과]

 

 

3.4. Master Node Upgrade 계획 확인

 

[명령어]

kubeadm upgrade plan

 

[결과]

아래과 같이 1.19 version 으로 Upgrade가 가능하다고 나옴

 

 

3.5. Master Node Upgrade 시작

 

[주의]

kubeadm upgrade 명령 시 

Master Node에서 관리하는 인증서를 자동으로 갱신함. 

인증서 갱신을 하지 않으려면 --certificate-renewal=false 플래그를 사용해야함.

 

[명령어]

kubeadm upgrade apply v1.19.x

예) 

kubeadm upgrade apply v1.19.2 --certificate-renewal=false

 

[결과]

아래와 비슷하게 나와야함.

.....

 

 

 

 

 

3.6. kubelet, kubectl Upgrade

 

[CentOS, RHEL, Fedora 명령어]

( 1.19.x-0에서 x를 최신 패치 버전으로 변경 )

yum install -y kubelet-1.19.x-0 kubectl-1.19.x-0 --disableexcludes=kubernetes

 

예)

yum install -y kubelet-1.19.2-0 kubectl-1.19.2-0 --disableexcludes=kubernetes

 

 

[Ubuntu, Debian, HypriotOS 명령어]

( 1.19.x-00의 x를 최신 패치 버전으로 변경 )

apt-mark unhold kubelet kubectl && \

apt-get update && apt-get install -y kubelet=1.19.x-00 kubectl=1.19.x-00 && \

apt-mark hold kubelet kubectl

 

(  apt-get 버전 1.1부터 다음 방법을 사용할 수도 있음 )

apt-get update && \

apt-get install -y --allow-change-held-packages kubelet=1.19.x-00 kubectl=1.19.x-00

 

 

 

[CentOS에서 명령 결과.]

받아놓았었나봄.

 

3.7. kubelet 재시작

 

[명령어]

sudo systemctl daemon-reload

sudo systemctl restart kubelet

 

 

 

3.8.Master Node Upgrade 확인

 

[명령어]

kubectl get nodes

 

SchedulingDisabled 로 표시되어있는 이유는 

Drain 작업을 걸어놔서 다음과 같이 표시됨

 

 

3.9. 다시 master node 를 cluster에 포함시킴

 

[명령어]

kubectl uncordon kube.master.node 

명령을 해주면 SchedulingDisabled 가 해제됨

 

 

 

3.10. CNI Upgrade 확인

 

사용중이던 CNI에 종류에 따라서 수동으로 Upgrade 해줘야할 수도 있는데

Flannel 또는 Calico, Canal 과 같이 Daemonset 형태로 

배포가 되는 CNI의 경우는 해당 단계를 안해도 됨.

 

만약 Daemonset 형식으로 배포되는 CNI가 아니라면

아래 명령을 해줘야함.

Test 환경에서는 Canal 을 사용중이여서 해당 단계는 건너뜀.

 

[명령어]

(<cp-node-name>을 컨트롤 플레인 노드 이름으로 변경)

kubectl uncordon <cp-node-name>

 

 

 

3.11. Master Node가 2개인 경우 나머지 Master Node Upgrade 

 

다른 Master Node 로 이동해서 아래의 명령 실행.

첫번째 Master Node 와 명령어가 다름.

kubeadm upgrade plan 명령도 하지 않아도 됨.

 

[명령어]

kubeadm upgrade node

 

Test 환경은 Master Node 가 1개임으로 하지 않음.

 

 


 

 

 

4. Worker Node Upgrade

 

Worker Node의 Upgrade 절차는 워크로드를 실행하는데 필요한 최소 용량을 보장하면서, 

한 번에 하나의 Node 또는 한 번에 몇 개의 Node를 진행해야함.

동시에 모든 Node 를 Upgrade 하게 되면 Servie 가 중단되기 때문.

 

아래에서 진행되는 과정은 모든 Worker Node 에서 해줘야함.

 

4.1. Worker Node kubeadm upgrade

Worker Node 에서 작업

모든 Worker Node kubeadm 을 upgrade 해줘야함.

 

[CentOS, RHEL, Fedora 명령어]

( 1.19.x-0에서 x를 최신 패치 버전으로 변경 )

yum install -y kubeadm-1.19.x-0 --disableexcludes=kubernetes

 

 

예)

yum install -y kubeadm-1.19.2-0 --disableexcludes=kubernetes

 

 

 

[Ubuntu, Debian, HypriotOS 명령어]

( 1.19.x-00의 x를 최신 패치 버전으로 변경 )

apt-mark unhold kubeadm && \

apt-get update && apt-get install -y kubeadm=1.19.x-00 && \

apt-mark hold kubeadm

-

( apt-get 버전 1.1부터 다음 방법을 사용할 수도 있음 )

apt-get update && \

apt-get install -y --allow-change-held-packages kubeadm=1.19.x-00

 

 

[CentOS 명령 결과]

 

 

 

 

4.2. Worker Node Drain 작업

Master Node 에서 작업

 

[명령어]

( <node-to-drain>을 드레이닝하려는 노드 이름으로 변경 )

kubectl drain <node-to-drain> --ignore-daemonsets

 

예) 

kubectl drain kube.worker.node --ignore-daemonsets

 

 

[결과]

Test 환경에서는 Worker Node가 한개라서 Drain작업을 하면 아래와같은 오류가 발생함.

error: unable to drain node "kube.worker.node", aborting command...
There are pending nodes to be drained:
kube.worker.node
error: cannot delete Pods not managed by ReplicationController, ReplicaSet, Job, DaemonSet or StatefulSet (use --force to override): default/iksoon-pod-mysql, default/iksoon-pod-tomcat

 

이를 강제로 진행하기 위해 '--force' 옵션을 사용함.

kubectl drain kube.worker.node --ignore-daemonsets --force

정확히는 해당 명령을 두번했더니 drained 가 됐음.

 

명령어가 적용되면 아래와 같이 Worker Node가 SchedulingDisabled 로 됨.

 

 

 

4.3. kubeadm 구성 Upgrade

모든 Worker Node 에서 진행

 

[명령어] 

kubeadm upgrade node

 

[결과]

 

 

4.4. kubelet, kubectl Upgrade

모든 Worker Node에서 진행

 

 

[CentOS, RHEL, Fedora 명령어]

( 1.19.x-0에서 x를 최신 패치 버전으로 변경 )

yum install -y kubelet-1.19.x-0 kubectl-1.19.x-0 --disableexcludes=kubernetes

예)

yum install -y kubelet-1.19.2-0 kubectl-1.19.2-0 --disableexcludes=kubernetes

 

 

[Ubuntu, Debian, HypriotOS 명령어]

( 1.19.x-00의 x를 최신 패치 버전으로 변경 )

apt-mark unhold kubelet kubectl && \

apt-get update && apt-get install -y kubelet=1.19.x-00 kubectl=1.19.x-00 && \

apt-mark hold kubelet kubectl

-

( apt-get 버전 1.1부터 다음 방법을 사용할 수도 있음)

apt-get update && \

apt-get install -y --allow-change-held-packages kubelet=1.19.x-00 kubectl=1.19.x-00

 

 

[CentOS에서 결과]

 

 

4.5. kubelet 재시작

모든 Worker Node 에서 진행

 

[명령어]

systemctl daemon-reload

systemctl restart kubelet

 

 

4.6. Worker Node에 적용된 cordon 해제 (Worker Node 다시 Cluster에 합류)

Master Node 에서 실행

[명령어]

kubectl uncordon <node-to-drain>

<node-to-drain> = worker node hosts name 

예)

kubectl uncordon kube.worker.node

[결과]

 


 

5. 결과 확인

 

결과를 확인해보면 Version 이 모두 1.19.2로 변경된 것을 확인할 수 있음.

 

[명령어]

kubectl get node

 

 

 

 

 

 


제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!


 

 

 

참고

https://kubernetes.io/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

 

 

반응형