반응형

이번에는 Vagrant를 이용한 kubeadm 클러스터 버전을 업그레이드를 해볼 예정이다. 쿠버네티스 공식 홈페이지에 보면 관련 명령어를 다 확인해볼 수 있다. 오늘 새벽에 최신 버전이 나와서 쿠버네티스의 최신 버전은 현재 기준으로 v1.21.2-00가 최신 버전이다.

 

아래에 보면 노드 드레이닝(draining)에 대한 내용이 등장한다. drain은 '배수'라는 뜻으로, 싱크대를 비우는 것을 생각해볼 수 있다. kubeadm 클러스터를 업그레이드 하기 전에는 비워놓고 해야한다.

 

쿠버네티스 홈페이지

 

아래 명령어를 실행해보면 현재 지원중인 버전의 리스트를 뽑아준다.

vagrant@kube-control1:~$ apt-cache madison kubeadm

 

 


Version Skew Policy

 

 

먼저 버전에 대한 내용을 이해하기 위하여 Version Skew Policy(갭차이)를 살펴보면,

kubernetes version skew policy

 

Kubernetes versions are expressed as x.y.z, where x is the major version, y is the minor version, and z is the patch version, following Semantic Versioning terminology. For more information, see Kubernetes Release Versioning.

 

* 요약 : x는 메이저 버전, y는 마이너 버전, z는 패치 버전

 

버전은 x.y.z형태로 이루어져 있다.

메이저버전은 메인 버전이고 마이너는 소소한 내용이 변경된 것, 패치는 버그나 보완대응 하기위한 버전이다. 메이저버전은 변경된 적 없고 마이너 버전은 3개월에 한 번씩 바뀐다. 1년에 총 4번의 버전이 나온다. 정확하게는 1년에 총 3번의 버전이 나온다.

하나의 버전은 1년이 지나게 되면 지원이 종료된다. 지금은 2.21.x 버전이 나왔으니 1.18~ 이용이 가능하다.

 

참고로 AWSEKS(Elastic Kubernetes Service)의 경우,

아직까지도 쿠버네티스 버전이 1.20까지만 지원되며, 기본값은 1.19이다. 최신버전은 안정성이 떨어지기 때문에 위험하긴 한 부분이 있어 기본값을 이렇게 셋팅해 놓은 것 같다.

 


Supported component upgrade order

 

버전 업그레이드를 하게될 때 순서가 매우 중요하다. 실제 현업에서 중요한 개념인데, 외울 필요는 없지만 알고는 있도록 하자.

 

kubernetes supported component upgrade order

 

해당 내용을 읽다보면 순서가 나타나는데,

kube-apiserver -> kube-controllermamager -> kubelet 순서대로 업그레이드를 해야한다.

 

업그레이드를 하든 업데이트를 하든 그 동안에는 사용을 하지 못한다. 그것을 다운타임이라고 한다. 실제 기업에서는 사용율이 제일 적은 때 서비스를 닫아놓고 다 업데이트한다. ex. 금융권은 추석때 정기점검(그동안 사용 못함)

 

보통 24/7(24시간 일주일 내내)서비스로 돌아가야 하는 경우 365일동안 장애가 발생하지 않는 한 계속해서 서비스 되어야 하는 것인데, 업데이트를 어떻게 할까?

결론은 부분 부분 해야한다. 모두 다 한꺼번에 다 업데이트를 할 수가 없기 때문이다. 한번에 하면 앞서 말했듯 다운타임이 발생한다.

ex. Naver, Daum은 수십억의 매출 손실이 나기 때문에 순차적으로 부분 부분 업그레이드를 해야 전체 서비스가 중단되지 않는다.

그렇기 때문에  버전 설치 순서에 대한 내용을 알고 있어야 하는 것이다.

 

업그레이드 테스트를 해볼텐데, 먼저 z에 해당하는 패치 업그레이드 -> y에 해당하는 마이너 업그레이드 순서로 진행 할 것이다.

 

 


패치 업그레이드

 

[v1.18.18-00 -> v1.18.19-00 패치 업그레이드]

 

* 사전 준비해야 할 환경 : v1.18.18-00로 설치된 master node, node1, node2 환경

준비사항은 이전 포스팅 참고 : Ubuntu 18.04 LTS, Vagrant를 이용한 쿠버네티스 아키텍처 설치

 

Ubuntu 18.04 LTS, Vagrant를 이용한 쿠버네티스 아키텍처 설치

쿠버네티스의 기본 중에서 쿠버네티스 아키텍처에 대한 간단한 설명과 함께 다양한 테스트를 해보려고 한다. 쿠버네티스 클러스터의 구성 요소는 큼직하게 컨트롤 플레인(Control Plane), 노드(Node)

simroot.tistory.com

 

패치 업그레이드 순서는 다음과 같다.

1. control-plane 
- kubeadm 
- kubectl, kubelet 
2. kube-node1/node2 
- kubeadm 
- kubectl, kubelet

 

1. control-plane

- kubeadm 업그레이드

vagrant@kube-control1:~$ sudo apt-get install -y --allow-change-held-packages kubeadm=1.18.19-00
// kubeadm 업그레이드
vagrant@kube-control1:~$ sudo kubeadm upgrade plan

vagrant@kube-control1:~$ sudo kubeadm upgrade apply v1.18.19
// 조금 오래걸림. 명령이 완료되면 SUCCESS! 가 뜬다.
vagrant@kube-control1:~$ kubectl get nodes
// 아직 변동안되어있음

 

- kubelet, kubectl 업그레이드

vagrant@kube-control1:~$ sudo  apt-get install -y --allow-change-held-packages kubelet=1.18.19-00 kubectl=1.18.19-00
// kubelet, kubectl 업그레이드

vagrant@kube-control1:~$ sudo systemctl daemon-reload
vagrant@kube-control1:~$ sudo systemctl restart kubelet

vagrant@kube-control1:~$ kubectl get nodes
NAME            STATUS   ROLES    AGE    VERSION
kube-control1   Ready    master   135m   v1.18.19
kube-node1      Ready    <none>   97m    v1.18.18
kube-node2      Ready    <none>   106m   v1.18.18

kubelet, kubectl을 업그레이드 해줄 때에는 daemon을 reload해줘야 하고 kubelet을 restart시켜주는 과정이 필요하다. 이후 노드를 확인해보면 kube-control1만 v1.18.19로 업그레이드 된 것을 확인할 수 있다.

 

2. kube-node1/node2  각각 업그레이드

- kubeadm 업그레이드

vagrant@kube-node1:~$ sudo apt-get install -y --allow-change-held-packages kubeadm=1.18.19-00
vagrant@kube-node1:~$ sudo kubeadm upgrade node

 

- kubelet, kubectl 업그레이드

vagrant@kube-node1:~$ sudo apt-get install -y --allow-change-held-packages kubelet=1.18.19-00 kubectl=1.18.19-00
vagrant@kube-node1:~$ sudo systemctl daemon-reload
vagrant@kube-node1:~$ sudo systemctl restart kubelet

 

* 클러스터 상태 확인

vagrant@kube-control1:~$ kubectl get nodes
NAME            STATUS   ROLES    AGE    VERSION
kube-control1   Ready    master   135m   v1.18.19
kube-node1      Ready    <none>   97m    v1.18.19
kube-node2      Ready    <none>   106m   v1.18.19

-> 나머지 2개의 노드 모두 1.18.19 버전으로 업그레이드 완료

 


마이너 업그레이드

 

[v1.18.19에서 1.19의 최신버전(v1.19.11-00)으로 업그레이드하기]

 

업그레이드 순서는 동일하다.

1. control plane

- kubeadm

- kubelet, kubectl

2. worker node

- kubeadm

- kubelet, kubectl

* 여기서 드는 의문) 만약 작업이 수백대라면? 엄청 오래 걸릴 것. 이 부분도 해결하는 방법이 있을 것 같은데 더 공부해봐야 할 문제인 것 같다.

 

1.19버전의 최신버전은 무엇일까?

vagrant@kube-control1:~$ apt-cache madison kubeadm | grep 1.19

위 명령어를 이용해 현재 지원되는 1.19버전의 목록을 찾아보았더니 1.19.11-00버전이 최신버전으로 확인된다. 1.18에서 1.19로 두번째 부분인 y 부분이 바뀌는 것이니 마이너 업그레이드라고 할 수 있다.

 

1. control plane

 

- kubeadm

vagrant@kube-control1:~$ sudo apt-get install -y --allow-change-held-packages kubeadm=1.19.11-00
vagrant@kube-control1:~$ sudo kubeadm upgrade plan

vagrant@kube-control1:~$ sudo kubeadm upgrade apply v1.19.11

 

- kubelet, kubectl

vagrant@kube-control1:~$ sudo  apt-get install -y --allow-change-held-packages kubelet=1.19.11-00 kubectl=1.19.11-00

vagrant@kube-control1:~$ sudo systemctl daemon-reload
vagrant@kube-control1:~$ sudo systemctl restart kubelet.service 

 

- 상태 확인

vagrant@kube-control1:~$ kubectl get nodes

 

 

2. worker node(kube-node1/node2  각각 업그레이드)

 

- kubeadm

vagrant@kube-node1:~$ sudo apt-get install -y --allow-change-held-packages kubeadm=1.19.11-00
vagrant@kube-node1:~$ kubeadm version
vagrant@kube-node1:~$ sudo kubeadm upgrade node

 

- kubelet, kubectl

vagrant@kube-node1:~$ sudo apt-get install -y --allow-change-held-packages kubelet=1.19.11-00 kubectl=1.19.11-00
vagrant@kube-node1:~$ sudo systemctl daemon-reload
vagrant@kube-node1:~$ sudo systemctl restart kubelet

 

* 클러스터 상태 확인(최종)

kvagrant@kube-control1:~$ kubectl get nodes
NAME            STATUS   ROLES    AGE    VERSION
kube-control1   Ready    master   151m   v1.19.11
kube-node1      Ready    <none>   113m   v1.19.11
kube-node2      Ready    <none>   122m   v1.19.11

 

 


 

글을 마치며..

 

이번 글을 쓰면서 버전에 대한 개념에 대해 제대로 정립할 수 있었다. 파이썬이나 다른 서비스들을 다운로드 받을 때 최신버전은 안정성이 떨어진다고 하는 동료들의 이야기를 듣고 사실 큰 신경을 쓰지 않았었다. 그런데 쿠버네티스를 공부하면서 모든 서비스들이 서로 유기적으로 연결되어있다보니, 버전은 현업에서 중요하게 작용하는 부분임을 확실하게 느낄 수 있었다.

 

나중에 이 글을 보더라도 이해할 수 있도록 신경써서 정리를 해봤는데, 중요한 개념들을 종종 적어나가면서 스킬업 해나가야겠다. 다음번 포스팅에서는 Clean up에 대해 다룰건데, 마스터와 노드들을 셋팅하는것도 중요하지만 제거하는 것도 중요하다. 그래서 노드를 제거하는것과 다시 추가해보는 테스트도 진행해볼 것이다.

 

위에 글에서 정리했던 내용들은 쿠버네티스 공식 홈페이지에 잘 정리되어있고, 이 문서들은 다 영어로 작성되어있어서 가독성이 너무 떨어진다는 점이 있지만 짬내서 번역하며 읽어보는 것도 중요할 것 같다. 아래 링크도 참고해보시길..

 

 

* 출처

 

<kubeadm 클러스터 업그레이드>

 

kubeadm 클러스터 업그레이드

이 페이지는 kubeadm으로 생성된 쿠버네티스 클러스터를 1.20.x 버전에서 1.21.x 버전으로, 1.21.x 버전에서 1.21.y(여기서 y > x) 버전으로 업그레이드하는 방법을 설명한다. 업그레이드가 지원되지 않는

kubernetes.io

<Version Skew Policy>

 

Version Skew Policy

The maximum version skew supported between various Kubernetes components.

kubernetes.io

 

반응형

+ Recent posts