Kubernetes 버전 업그레이드 따라하기(v1.27 to v1.28)
[kt cloud Container개발팀 강성원 님]
Kubernetes 버전 업그레이드 따라하기(v1.27 to v1.28)
본 글은 Kubernetes 클러스터의 버전을 1.27에서 1.28로 업그레이드 하는 방법에 대한 내용입니다.
해당 시나리오는 kt cloud의 K2P Standard를 기반으로 작성하였습니다.
업그레이드 대상 클러스터 정보
- 모든 노드의 OS : ubuntu 22.04
- Kubernetes 버전 : 1.27
- Deployment Tool : kubeadm
- CNI(Container Network Interface) : Calico
- Container Runtime : ContainerD
업그레이드 전 확인
Kubernetes 버전 업그레이드 전 Container Runtime, CNI의 Kubernetes 지원 버전 확인이 필요합니다.
- Container Runtime(ContainerD)의 지원 버전 확인은 ContainerD 공식 사이트에서 확인할 수 있습니다.(https://containerd.io/releases/)
- 해당 시나리오(kt cloud K2P Standard 상품 이용)에서 이미 설치 된 ContainerD의 버전은 1.6.24으로 공식 사이트에서 확인해보시면 지원하는 Kubernetes 버전이 v1.26 ~ v1.28이기 때문에 업그레이드는 생략하도록 하겠습니다.
- CNI(Calico) 지원 버전 확인은 Calico 공식 사이트에서 확인할 수 있습니다.(https://docs.tigera.io/calico/3.26/getting-started/kubernetes/requirements)
- 해당 시나리오(kt cloud K2P Standard 상품 이용)에서 이미 설치 된 Calico의 버전은 3.26.3으로 공식 사이트에서 확인해보시면 지원하는 Kubernetes 버전이 v1.24 ~ v1.28이기 때문에 업그레이드는 생략하도록 하겠습니다.
업그레이드 준비
먼저 Control Plane 노드 1번에서 Kubernetes 클러스터의 현재 버전을 확인합니다.
## kubectl client&server 버전 확인 $ kubectl version |
## 각 노드의 버전 확인 $ kubectl get node |
그 다음 업그레이드 전 준비 작업으로 Kubernetes Package Repository를 추가(혹은 변경)합니다.
이 작업은 클러스터의 모든 노드(Control Plane 노드 포함)에서 수행해야 합니다.
- Kubernetes 공식 Docs(https://v1-27.docs.kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/)를 기반으로 설치한 경우는 아래와 같이 구성하시면 됩니다.
$ vi /etc/apt/sources.list.d/kubernetes.list ## 기존 내용 deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.27/deb/ / ## 추가할 내용 deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ / |
- kt cloud의 K2P Standard 상품을 이용한 경우는 아래와 같이 구성하시면 됩니다.
$ vi /etc/apt/sources.list.d/kubernetes.list ## 기존 내용 deb [signed-by=/usr/share/keyrings/k8s.gpg] https://package.d1container.cloud.kt.com:443/repository/ubuntu-package-proxy_kubernetes/v1.27/deb/ / ## 추가할 내용 deb [signed-by=/usr/share/keyrings/k8s.gpg] https://package.d1container.cloud.kt.com:443/repository/ubuntu-package-proxy_kubernetes/v1.28/deb/ / |
업그레이드
Kubernetes Package Repository 설정 진행 후 본격적으로 Kubernetes 업그레이드 작업을 진행합니다.
첫 번째, Control Plane 노드 1번의 Kubernetes 버전 업그레이드를 진행합니다.
## Package 목록 업데이트 $ apt-get update |
## 설치가능한 kubeadm 패키지 버전 확인 $ apt-cache madison kubeadm |
## kubeadm 패키지에 대해 hold 되어 있는 경우, 해제합니다. $ apt-mark unhold kubeadm |
## 설치하고자 하는 kubeadm 패키지 버전 설치(버전은 minor 버전 기준으로 1씩 업그레이드 하는 것을 권고합니다.) $ apt-get install -y kubeadm=1.28.14-2.1 |
## kubeadm 패키지 hold $ apt-mark hold kubeadm |
## kubeadm 버전 확인 $ kubeadm version |
## kubernetes 버전 업그레이드 plan 확인 $ kubeadm upgrade plan |
## kubernetes 버전 업그레이드 $ kubeadm upgrade apply v1.28.14 |
## kubelet, kubectl 패키지에 대해 hold 되어 있는 경우, 해제합니다. $ apt-mark unhold kubelet kubectl |
## kubelet, kubectl 업그레이드(kubeadm과 같은 버전) $ apt-get install -y kubelet=1.28.14-2.1 kubectl=1.28.14-2.1 |
## kubelet, kubectl 패키지 hold $ apt-mark hold kubelet kubectl |
## kubelet 재시작 $ systemctl daemon-reload $ systemctl restart kubelet |
Control Plane 노드 1번이 업데이트 잘되었는지 확인힙니다.(다른 노드들은 업그레이드 전 입니다.)
$ kubectl get node |
두 번째, 나머지 Control Plane 노드 2번과 3번에 대한 Kubernetes 업그레이드를 진행합니다. Control Plane 노드가 더 존재 한다면 동일하게 진행하시면 됩니다.
아래 절차를 노드(2번, 3번)에서 각각 모두 진행해주시면 됩니다.
## Package 목록 업데이트 $ apt-get update ## 설치가능한 kubeadm 패키지 버전 확인 $ apt-cache madison kubeadm ## kubeadm 패키지에 대해 hold 되어 있는 경우, 해제합니다. $ apt-mark unhold kubeadm ## 설치하고자 하는 kubeadm 패키지 버전 설치 $ apt-get install -y kubeadm=1.28.14-2.1 ## kubeadm 패키지 hold $ apt-mark hold kubeadm ## kubeadm 버전 확인 $ kubeadm version #### 이 절차까지는 앞 절차(Control Plane 1번 업그레이드)와 동일하므로 <예시>는 생략하겠습니다. |
## kubernetes 버전 업그레이드 $ kubeadm upgrade node |
## Control Plane 노드 1번 에서 업그레이드 진행 할 노드를 drain 하도록 다음 명령을 실행합니다. ## drain을 진행하면 해당 node에 있는 daemonset을 제외한 pod들을 다른 노드에 스케줄하고 해당 노드를 스케줄하지 못하도록 방지합니다. ## drain한 노드에 daemonset을 제외한 pod가 다른 노드로 옮겨갔는지 확인(Running) 후 다음 절차를 진행합니다. $ kubectl drain node이름 --ignore-daemonsets |
아래 예시는 Control Plane 2번 노드 Drain 후 노드 목록 조회 시 보여지는 화면입니다.
Control Plane 2번(k8s-ver-up.master02)의 STATUS가 SchedulingDisabled 인 것을 확인 할 수 있습니다.
## kubelet, kubectl 패키지에 대해 hold 되어 있는 경우, 해제합니다. $ apt-mark unhold kubelet kubectl ## kubelet, kubectl 업그레이드(kubeadm과 같은 버전) $ apt-get install -y kubelet=1.28.14-2.1 kubectl=1.28.14-2.1 ## kubelet, kubectl 패키지 hold $ apt-mark hold kubelet kubectl ## kubelet 재시작 $ systemctl daemon-reload $ systemctl restart kubelet #### 이 절차까지는 앞 절차(Control Plane 1번 업그레이드)와 동일하므로 <예시>는 생략하겠습니다. |
## Control Plane 노드 1번 에서 drain한 노드에 스케줄링 될 수 있도록 다음 명령을 실행합니다. $ kubectl uncordon node이름 |
세 번째, Worker 노드에 대한 Kubernetes 업그레이드를 진행합니다.
아래 절차를 모든 Worker 노드에서 진행해주시면 됩니다.
## Package 목록 업데이트 $ apt-get update ## 설치가능한 kubeadm 패키지 버전 확인 $ apt-cache madison kubeadm ## kubeadm 패키지에 대해 hold되어있는 경우, 해제합니다. $ apt-mark unhold kubeadm ## 설치하고자 하는 kubeadm 패키지 버전 설치 $ apt-get install -y kubeadm=1.28.14-2.1 ## kubeadm 패키지 hold $ apt-mark hold kubeadm ## kubeadm 버전 확인 $ kubeadm version #### 이 절차까지는 앞 절차(Control Plane 1번 업그레이드)와 동일하므로 <예시>는 생략하겠습니다. |
#### 이 절차는 나머지 Control Plane 노드 업그레이드 시 사용하는 명령은 같지만, 명령 결과 출력되는 내용이 다르므로 <예시>를 첨부하였습니다. ## kubernetes 버전 업그레이드 $ kubeadm upgrade node |
#### 이후 절차는 앞 절차(Control Plane 2번,3번 업그레이드)와 동일하므로 <예시>는 생략하겠습니다. ## Control Plane 노드 1번 에서 업그레이드 진행 할 노드를 drain 하도록 다음 명령을 실행합니다. ## drain을 진행하면 해당 node에 있는 daemonset을 제외한 pod들을 다른 노드에 스케줄하고 해당 노드를 스케줄하지 못하도록 방지합니다. ## drain한 노드에 daemonset을 제외한 pod가 다른 노드로 옮겨갔는지 확인(Running) 후 다음 절차를 진행합니다. $ kubectl drain node이름 --ignore-daemonsets ## kubelet, kubectl 패키지에 대해 hold되어있는 경우, 해제합니다. $ apt-mark unhold kubelet kubectl ## kubelet, kubectl 업그레이드(kubeadm과 같은 버전) $ apt-get install -y kubelet=1.28.14-2.1 kubectl=1.28.14-2.1 ## kubelet, kubectl 패키지 hold $ apt-mark hold kubelet kubectl ## kubelet 재시작 $ systemctl daemon-reload $ systemctl restart kubelet ## Control Plane 노드 1번 에서 drain한 노드에 스케줄링 될 수 있도록 다음 명령을 실행합니다. $ kubectl uncordon node이름 |
업그레이드 확인
Kubernetes 클러스터의 각 노드들의 버전 업그레이드가 잘 진행되었는지 확인합니다.
$ kubectl get node |
마무리
지금까지 kt cloud K2P Standard 상품을 기반으로 한 Kubernetes 버전을 1.27에서 1.28로 업그레이드를 해보았습니다.
이 포스트가 kubernetes 버전 업그레이드 하는데 조금이라도 도움이 되셨으면 좋겠습니다.