[Kubernetes] 클러스터 업그레이드

1. OS 업그레이드

노드가 다운되었다고 가정해보자. 클러스터는 해당 노드가 복구되는 대로 파드를 재기동 시킬려고 할 것이다. 만약 5분동안 노드가 복구되지 않는다면 클러스터 매니저는 노드가 복구 불가 상태라고 판단하고 다른 노드에 파드를 올린다. (이때의 5분이라는 시간은 pod-eviction-timeout 값으로 컨트롤러 매니저에서 설정할 수 있다.)

노드의 OS를 업그레이드 하려면 다운타임이 필요한데 해당 노드에만 올라가 있고 replica가 없는 단일 파드는 다른 노드에서 자동 실행이 되지 않는다. 따라서 OS 업그레이드를 할떄는 우선 kubectl drain node-1 명령어로 해당 노드에 있는 파드들을 내리고 다른 노드에서 실행하도록 해야한다. drain이 실행된 노드는 별도 명령을 내리기 전까지 스케쥴링 할 수 없는 상태가 된다. 업그레이드 이후 기동된 서버를 schedulable 하게 변경하려면 kubectl uncordon node-1 커맨드를 실행해야 한다. 그러나 다른 노드로 이동된 파드들이 자동으로 해당 노드에서 다시 실행되지는 않는다. 새로 실행된 파드들이 해당 노드에서 실행될 것이다. 추가적으로 kubectl cordon node-1 명령어는 파드들을 이동시키지는 않고 unschedulable하게만 만든다.

2. 클러스터 업그레이드

kubectl get nodes 실행시 노드에 설치된 쿠버네티스 엔진 버전을 조회할 수 있다. kubectl version —short로도 확인 가능하다. 쿠버네티스 버전은 3단계로 구성되어 있는데 1.18.0 을 예로 들면 1이 major, 18이 minor, 0이 Patch 버전이다. minor 버전은 매달 나오며 기능적인 변경이 있을 때 나온다. Patch는 Bug fix 시 릴리즈 된다. major 버전은 출시되기 전 alpha, beta 버전으로 테스트 기간을 거친다. 쿠버네티스 패키지를 설치하면 모든 컴퍼넌트들의 버전이 패키지 버전과 동일하지만 etcd와 coreDNS와 같이 별도 프로젝트의 경우는 자체 버전을 따른다. 주요 컴포넌트들 간에도 버전이 완전히 같을 필요는 없다. 메인 컴포넌트인 kube-apiserver의 버전을 기준으로 직전 버전까지 사용 가능하다.(kubelet은 바로 다음 버전까지도 호환된다.)

2. 클러스터 업그레이드 절차

2-1. Master 노드 업그레이드

  • Master 노드 업그레이드 시 Worker 노드에서 운영 중인 서비스들은 영향이 없다. 관리 컴포넌트 기능들만 사용이 불가능하다. 컨트롤러 매니저도 다운되므로 만약 파드가 죽어도 자동 실행되지 않는다.
  • 클러스터 업그레이드 전에 kubeadm 부터 최신버전으로 업그레이드 해야한다.

2-2. Worker 노드 업그레이드

  • 서비스 요구사항에 따라 세가지 전략을 가질 수 있는데 다운타임을 감안하고 한번에 모든 노드를 업그레이드 하는 방법, 한 노드씩 파드들을 넘기고 업그레이드를 진행해 서비스 중단이 없도록 하는 방법, 클라우드 플랫폼이라면 기존 노드와 동일한 신규 노드를 프로비저닝 한 뒤 업그레이드하여 파드를 옮기는 방법이 가능하다.
  • kubelet은 kubeadm으로 설치가 불가능하다. 업그레이드도 마찬가지로 kubeadm으로 불가능하며 별도로 진행해야 한다.

2-3. 업그레이드 관련 명령어

# upgrade 관련 정보 확인
# 클러스터 버전, kubeadm 버전, 최신 버전, 컴포넌트별 버전 등
kubeadm upgrade plan

# 파드 이전, unschedulable
kubectl drain master

# kubeadm 업그레이드
apt-get upgrade -y kubeadm-1.12.0-00

# 클러스터 업그레이드
kubeadm upgrade apply v1.12.0

# kubelet 업그레이드
apt-get upgrade -y kubelet-1.12.0-00
systemctl restart kubelet

# master schedulable 변경
kubectl uncordon master

# node01 파드 이전, unschedulable 변경
kubectl drain node01

# kubeadm 업그레이드
apt-get upgrade -y kubeadm-1.12.0-00

# kubelet 업그레이드
apt-get upgrade -y kubelet-1.12.0-00
kubeadm upgrade node config --kubelet-version v1.12.0
systemctl restart kubelet

# node01 schedulable 변경
kubectl uncordon node01

'Kubernetes' 카테고리의 다른 글

[Kubernetes] 권한 관리(RBAC)  (0) 2020.12.30
[Kubernetes] 백업, 복구  (0) 2020.12.23
[Kubernetes] 어플리케이션 배포 관리  (0) 2020.12.11
[Kubernetes] 모니터링, 로깅  (0) 2020.11.28
[Kubernetes] Service  (0) 2020.11.19