이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Kubernetes

39. 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/

 

 

반응형

'클라우드 > Kubernetes' 카테고리의 다른 글

41. Flannel CNI 분석  (0) 2020.11.07
40. Flannel CNI Networking 분석  (0) 2020.11.07
38. Kubernetes Network Policy  (0) 2020.11.07
37. Kubernetes hyperkube container  (0) 2020.11.05
36. Custom Resource Definition (CRD) Golang  (0) 2020.11.05