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 > Kubernetes 이론' 카테고리의 다른 글
Sandbox key 정보로 Pod안의 Container 찾기(2) : 첫번째 방법 (0) | 2020.11.07 |
---|---|
Sandbox key 정보로 Pod안의 Container 찾기(1) : 환경구성 (0) | 2020.11.07 |
Kubernetes hyperkube container (0) | 2020.11.05 |
Custom Resource Definition (CRD) Golang (0) | 2020.11.05 |
Custom Resource Definition (CRD) Python (0) | 2020.11.05 |