Search

Cluster Upgrade

Created
2023/10/22 01:36
Tags
k8s
CKA
Mumshad Mannambeth
Cluster Maintenance

1) Version

ETCD와 CoreDNS 같은 외부 의존성을 제외한 나머지 Controlplane를 기준으로, 모두 같은 버전을 유지해야될까?
그렇지는 않고, 각 객체들의 릴리즈 버전이 다를 순 있음
Kube API Server의 경우 가장 주된 요소이고 다른 객체들과 통신하는 기능을 담당하기 때문에 다른 구성 요소들보다 가장 최신 릴리즈여야됨
Controller Manager / Kube Scheduler의 경우 Kube API Server 보다 한 버전 낮을 수 있음
Kubelet 및 Kube Proxy는 Kube API Server 보다 두 버전 낮을 수 있음
API를 이용하는 CLI인 kubectl의 경우 한 버전 낮거나 한 버전 높아도 됨

2) Upgrade

쿠버네티스의 릴리즈는 가장 최신의 마이너 버전 3개를 제공
1.12가 최신이라면, 1.11, 1.10이 제공됨
따라서 1.13이 배포 예정이라면, 1.10이 지원되지 않게 됨
1.13이 배포 예정이고 1.10을 이용하고 있다면, 쿠버네티스를 업그레이드 하기에 좋은 시기라고 볼 수 있음
그렇다면 1.10에서 한 번에 1.13으로 업그레이드를 하면될까?
쿠버네티스는 한 개의 마이너 버전의 업그레이드를 하는 방식을 권장함
업그레이드 방법은 2단계로 나뉘는데, 1단계는 마스터 노드의 업그레이드, 2단계는 워커 노드의 업그레이드
마스터 노드의 업그레이드 중에는 마스터 노드에 위치한 Kube Scheduler와 Controller Manager의 기능을 잠시 이용할 수 없게 되는데, 그렇다고 이미 워커 노드에서 잘 운영 중인 서비스가 멈추지는 않음
** 당연히 Kube API Server도 이용할 수 없으므로 kubectl 등의 API 이용에도 제한이 있고, HA도 동작하지 않음
워커 노드의 경우 마스터와 달리 업그레이드에 여러 방법이 있음
1) 전체를 한 번에 업그레이드 하는 방식이 있는데, 이는 업그레이드 도중에 사용자가 어플리케이션 접근이 안 되는 문제가 있음
2) 다른 방법으로는 노드를 하나씩 업그레이드 하는 방식이 있음
3) 마지막 방식으로는 새로운 버전의 노드 자체를 추가하는 방식인데, 이는 클라우드에서 주로 이용하는 방식임 (새로운 노드를 프로비저닝하고, 기존의 노드를 해체하기 편리하므로)

1. Cloud

업그레이드 방법은 클러스터를 어떻게 구성했냐에 따라 달라지는데, 클라우드 서비스 제공자로부터 쿠버네티스를 이용하고 있다면 클릭 몇 번으로 업그레이드가 가능

2. Kubeadm

클러스터 구성을 kubeadm을 이용해서 했다면, 간단한 명령어로 업그레이드 가능

마스터 노드

플랜 확인 → kubeadm 업그레이드 → Controlplane 업그레이드 → kubelet & kubectl 업그레이드 → kubelet 재실행
** 현 버전과 최신 버전의 차이가 있더라도 이전에 언급된 것처럼 한 마이너 버전씩 업그레이드 해야함
kubectl drain ${NODE} kubeadm upgrade plan apt-get update apt-mark unhold kubeadm && apt-get upgrade -y kubeadm=${VERSION} && apt-mark hold kubeadm kubeadm upgrade apply ${VERSION} apt-mark unhold kubelet kubectl && apt-get upgrade -y kubelet=${VERSION} kubectl=${VERSION} && apt-mark hold kubelet kubectl systemctl daemon-reload systemctl restart kubelet kubectl uncordon ${NODE}
** upgrade plan은 업그레이드를 위한 정보들을 확인 가능
** kubeadm의 버전도 쿠버네티스 클러스터 버전과 동일하기 때문에 클러스터 버전을 업그레이드 하기 전에 kubeadm 업그레이드도 필요함
** upgrade apply는 업그레이드를 수행
** 업그레이드 후 kubectl get no로 버전을 확인해도 업그레이드 버전으로 나타나지 않는 것을 볼 수 있는데, 이는 해당 명령어의 결과가 kubelet의 버전을 나타내기 때문임
** kubeadm을 활용하여 클러스터 업그레이드를 하더라도 kubelet에 대해선 직접 업그레이드를 수행해야함

워커 노드

노드의 Pod들을 Drain → kubeadm 업그레이드 → kubelet & kubectl 업그레이드 → kubelet 재실행 → 노드의 스케줄링 방지 해제
kubectl drain ${NODE} apt-get update apt-mark unhold kubeadm && apt-get upgrade -y kubeadm=${VERSION} && apt-mark hold kubeadm apt-mark unhold kubelet kubectl && apt-get upgrade -y kubelet=${VERSION} kubectl=${VERSION} && apt-mark hold kubelet kubectl kubeadm upgrade node systemctl daemon-reload systemctl restart kubelet kubectl uncordon ${NODE}
** Drain 및 Uncordon 수행은 반드시 Controlplane에서 하고 나머지는 워커 노드에서 수행
** kubelet 업그레이드 후에 노드 설정에 kubelet 버전 값을 갱신해야함

3. Manual

클러스터 구성을 직접 했다면… 각 버전 업그레이드도 직접해야함

3) Caution

cat /etc/release를 통해 OS 버전 확인
apt-get version을 통해 apt-get 버전 확인
두 버전을 기반으로 공식 문서를 통해 업그레이드 진행을 권장