Tech story/Container

Kubernetes 버전 업그레이드 따라하기(v1.27 to v1.28)

kt cloud 테크블로그 2024. 10. 29. 10:17

[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 버전 확인 예시 >

 

## 각 노드의 버전 확인
$ kubectl get node

 

< 모든 노드 조회 시 버전 확인 예시 >

그 다음 업그레이드 전 준비 작업으로 Kubernetes Package Repository를 추가(혹은 변경)합니다.

이 작업은 클러스터의 모든 노드(Control Plane 노드 포함)에서 수행해야 합니다.

$ 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/ /

 

<K2P Standard 이용 시 kubernetes.list 파일 내용 변경 예시 >

 

업그레이드 

 

Kubernetes Package Repository 설정 진행 후 본격적으로 Kubernetes 업그레이드 작업을 진행합니다.

번째, Control Plane 노드 1번의 Kubernetes 버전 업그레이드를 진행합니다.

## Package 목록 업데이트
$ apt-get update

 

<Package 목록 업데이트 예시 >

## 설치가능한 kubeadm 패키지 버전 확인
$ apt-cache madison kubeadm

< 설치 가능한 kubeadm 패키지 버전 확인 예시 >

## kubeadm 패키지에 대해 hold 되어 있는 경우, 해제합니다.
$ apt-mark unhold kubeadm

 

<kubeadm 패키지 unhold 예시 >

## 설치하고자 하는 kubeadm 패키지 버전 설치(버전은 minor 버전 기준으로 1씩 업그레이드 하는 것을 권고합니다.)
$ apt-get install -y kubeadm=1.28.14-2.1

<kubeadm 패키지 업그레이드 예시 >

## kubeadm 패키지 hold
$ apt-mark hold kubeadm

<kubeadm 패키지 hold 예시 >

## kubeadm 버전 확인
$ kubeadm version

<kubeadm 버전 확인 예시 >

## kubernetes 버전 업그레이드 plan 확인
$ kubeadm upgrade plan

 

<kubernetes 버전 업그레이드 plan 확인 예시 >

## kubernetes 버전 업그레이드
$ kubeadm upgrade apply v1.28.14

<kubernetes 버전 업그레이드 결과 예시 >

 

## kubelet, kubectl 패키지에 대해 hold 되어 있는 경우, 해제합니다.
$ apt-mark unhold kubelet kubectl 

<kubelet, kubectl 패키지 unhold 예시 >

## kubelet, kubectl 업그레이드(kubeadm과 같은 버전)
$ apt-get install -y kubelet=1.28.14-2.1 kubectl=1.28.14-2.1 

<kubelet, kubectl 패키지 업그레이드 예시 >

## kubelet, kubectl 패키지 hold
$ apt-mark hold kubelet kubectl

<kubelet, kubectl 패키지 hold 예시 >

## kubelet 재시작
$ systemctl daemon-reload
$ systemctl restart kubelet 

<kubelet 서비스 재시작 예시>

 

Control Plane 노드 1번이 업데이트 잘되었는지 확인힙니다.(다른 노드들은 업그레이드 전 입니다.)

$ kubectl get node

< 노드 목록 조회 시 Control Plane 1 번 노드 업그레이드 확인 예시 >

 

번째, 나머지 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

<kubernetes 버전 업그레이드 결과 예시 >

## Control Plane 노드 1번 에서 업그레이드 진행 할 노드를 drain 하도록 다음 명령을 실행합니다.
## drain을 진행하면 해당 node에 있는 daemonset을 제외한 pod들을 다른 노드에 스케줄하고 해당 노드를 스케줄하지 못하도록 방지합니다.
## drain한 노드에 daemonset을 제외한 pod가 다른 노드로 옮겨갔는지 확인(Running) 후 다음 절차를 진행합니다.
$ kubectl drain node이름 --ignore-daemonsets

< 노드 Drain 수행 결과 예시 >

 

아래 예시는 Control Plane 2번 노드 Drain 후 노드 목록 조회 시 보여지는 화면입니다.
Control Plane 2번(k8s-ver-up.master02)의 STATUS가 SchedulingDisabled 인 것을 확인 할 수 있습니다.

< 노드 Drain 수행 후 Node 목록 조회 예시 >

## 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이름

< 노드 cordon 수행 결과 예시 >

 

번째, 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

<kubernetes 버전 업그레이드 결과 예시 >

#### 이후 절차는 앞 절차(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 버전 업그레이드 하는데 조금이라도 도움이 되셨으면 좋겠습니다.

 

 

참고/출처