Kubernetes - kubeadm 활용팁 - 클러스터 업그레이드

358

kubeadm 활용팁 - 클러스터 업그레이드

프로젝트를 진행하면서 쿠버네티스 클러스터 구성을 AWS, AZURE, GCP 환경에 구축하면서 kubeadm 툴을 사용했다. (각 프로바이더들이 제공하는 컨테이너 서비스를 이용한 것이 아니라 bare-metal 과 같이 인스턴스를 생성해서 클러스터를 구축하는 방식을 적용했다)

이전에는 알파 버전이었지만 현재는 베타 버전인 것으로 알고 있다. 새롭게 클러스터를 구축하는 것이라면 당연히 쿠버네티스를 설치하면 되지만 기존에 설치되어 있는 클러스터를 업그레이드를 하는 것은 딱히 정형화된 방법을 찾지 못했었다.

kubeadm을 이용해서 설치하는 방법은 이미 많은 자료들이 존재하기 때문에 따로 게시글을 올리지는 않았지만 (혹여 누군가 요청을 한다면 올릴 예정) 이미 설치된 클러스터를 수동으로 설정해서 업그레이드가 가능하기 때문에 이를 정리해 보도록 한다.

클러스터 업그레이드 방법

가장 먼저 수행할 부분이 현재 버전과 업그레이드할 버전을 검증하는 것이다. 버전 정보 를 참고해서 대상 버전과 실행버전 정보를 확인해 한다.

실행 버전 확인
1
2
3
4
# 클러스터 구성 버전 확인
$ kubectl version
# 클러스터 구성 노드들 확인
$ kubectl get nodes

여기서는 쿠버네티스 1.6.2 에서 1.6.4 로 업그레이드 하는 것을 기준으로 한다.

kubelet 처리

버전 확인이 되었다면 가장 먼저 클러스터를 구성하고 있는 모든 노드들에 설치되어 있는 시스템 패키지를 업그레이드 해야 한다.

시스템 패키지 업그레이드
1
$ sudo apt-get update && sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni

kubernetes 처리

그리고 쿠버네티스를 구성하고 있는 컴포넌트들을 갱신해 줘야 한다.

  • kube-apiserver
  • kube-scheduler
  • kube-controller-manager

각 컴포넌트는 마스터 서버에 존재하기 때문에 아래의 명령을 통해서 운영에 필요한 설정 파일들의 이미지 버전 정보를 변경해 줘야 한다.

컴포넌트 구성파일 갱신
1
$ sudo sed -i 's/v1.6.2/v1.6.4/g' /etc/kubernetes/manifests/*

위의 명령은 sed 툴을 이용해서 /etc/kubernetes/manifests/ 경로에 있는 모든 파일들을 대상으로 내용 중에서 지정한 정규식에 맞는 부분을 변경하는 작업을 수행하는 것이다.

kube-proxy 처리

kube-proxyDaemonSet 이기 때문에 Rolling update 를 지원하지 않는다. 따라서 실행 중인 kube-proxy 컨테이너를 수동으로 삭제하고 아래의 명령으로 DaemonSet 정보를 갱신해 줘야 한다.

DaemonSet 정보 갱신
1
$ kubectl edit daemonsets kube-proxy -n=kube-system

kube-dns 처리

최신 버전을 아래의 명령을 통해서 검증해야 한다.

dns 버전 검증
1
$ curl -s https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dns/kubedns-controller.yaml.base | grep image

dns 에는 3개의 이미지가 존재하므로 버전을 변경해 준다. 배포는 Rolling update 를 지원하기 때문에 아래의 명령을 실행하면 된다.

kube-dns 배포 처리
1
$ kubectl edit deployments kube-dns -n=kube-system

결론

위의 처리를 수행하면 다음과 같이 재 구성되어 동작하는 파드 컨테이너들을 확인할 수 있다.

향후에는 기본적인 옵션으로 제공이 될 것으로 예상이 되지만 현재는 위와 같이 단계별로 처리를 해 주면 큰 문제없이 갱신이 가능하다.

이제 변경된 이미지 버전에 따라서 모든 컨테이너들이 원격에서 다운로드되어 변경될 때까지 기다리면 된다.

컨테이너 교체
1
$ watch -n 2 kubectl get pods -o wide --all-namespaces

Importants

단, 특정 버전을 대상으로 한 것이기 때문에 다른 버전에서는 인증 방식과 같은 환경 상의 문제 등으로 오류가 발생할 수 있다. 특히 1.5.x 버전 대에서 1.6.x 버전으로 넘어가는 경우는 인증 방법과 데이터 저장 방식등의 변화가 있기 때문에 문제가 발생할 소지가 상당히 많을 수 있다. (이 부분은 직접 테스트해 볼 기회가 없어서 검증을 하지 못한 상태다)


References

  • https://crondev.com/kubernetes-upgrade-kubeadm/

Written by Morris (ccambo@gmail.com - MSFL)


공유하기