Skip to main content

k8s 버전 업그레이드

  • kubeadm: 클러스터를 부트스트랩하는 명령
  • kubelet: Pod와 Container 시작과 같은 작업을 수행하는 컴포넌트
  • kubectl: 클러스터와 통신하기 위한 커맨드 라인 유틸리티

기존 kubeadm, kubelet, kubectl 버전 1.26.0에서 1.26.1로 업그레이드하기

  • 업그레이드 순서: 마스터 노드 -> 워커 노드

마스터노드 kubeadm 업그레이드


# 업그레이드할 수 있는 버전 찾기
apt update
apt-cache madison kubeadm

# 1.26.1 버전으로 업그레이드
sudo -i
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=1.26.1-00 && \
apt-mark hold kubeadm

# 버전 확인
kubeadm version

# 업그레이드 계획
kubeadm upgrade plan

# 선택한 패치 버전으로 업그레이드
kubeadm upgrade apply v1.26.1
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.26.1". Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.

마스터노드 kubelet, kubectl 업그레이드

note

k8s는 워커 노드의 장애가 발생하더라도 정상적 혹은 부분적으로 기능을 수행할 수 있도록 결함 감내(fault tolerant) 시스템으로 디자인되어 있습니다. k8s의 마스터 노드는 가상 머신과 같은 인프라의 상태를 주기적으로 워커 노드로부터 수신하며, 어떠한 이유로 인해 문제가 발생한 경우에는 이를 복구하도록 동작합니다. 그러나 모든 경우의 문제를 해결하는데는 한계가 있으며, 노드의 유지보수를 위해 개발자가 특정 워커 노드 상에 운영 중이던 파드(pod)의 우아한 종료(gracefully shutting down)을 위한 개입이 필요할 수 있습니다.

충분한 자원이 있다면 k8s는 문제가 있는 노드의 모든 파드를 다른 노드로 재스케쥴링할 것이므로, 워커 노드에 발생할 수 있는 문제에 대해 걱정할 필요가 없습니다. 또한 필요 시 Cluster AutoScaler가 새로운 워커노드를 추가할 것이므로, 애플리케이션 및 클러스터에 대한 운영은 문제없이 지속될 수 있다.

위에 기술된 내용은 k8s 운영에 대한 흔한 오해 중 하나입니다. k8s 마스터 노드의 kube-controller-manager는 특정 워커 노드의 컨디션에 문제를 감지하였더라도, 파드 축출(eviction) 조건이 충족된 경우에 재스케줄링을 수행합니다.

동작 중인 워커 노드를 강제로 재시작하는 경우에는 앞서 언급한 조건이 충족되지 않는 경우, 일정 시간 동안 해당 워커 노드에 스케줄된 파드의 정지(downtime)를 유발합니다. 특정 워커 노드의 재시작 전 kubectl drain 명령어를 사용해 구동 중이던 파드를 다른 워커 노드로 축출하는 우아한 종료(gracefully shutting down pods)과정을 통해 안정적으로 서비스를 운영할 수 있습니다.

# 노드 드레인
# 스케줄 불가능으로 표시하고 워크로드를 축출하여 유지 보수할 노드를 준비
sudo kubectl drain master --ignore-daemonsets

# kubectl, kubelet 업그레이드
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.26.1-00 kubectl=1.26.1-00 && \
apt-mark hold kubelet kubectl

# kubelet을 다시 시작
sudo systemctl daemon-reload
sudo systemctl restart kubelet

# 노드 uncordon
kubectl uncordon master

# 노드 상태 확인
kubectl get nodes

워커노드 kubeadm 업그레이드

  • 각 워커노드마다 접속하여 아래 과정을 진행합니다.
  • node1부터 node2까지 순차적으로 진행합니다.
# worker node
# kubeadm v1.26.1 업그레이드
sudo -i
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=1.26.1-00 && \
apt-mark hold kubeadm

kubeadm upgrade node

# master node에서 실행
# 노드 드레인
kubectl drain node1 --ignore-daemonsets
kubectl drain node2 --ignore-daemonsets

워커노드 kubelet, kubectl 업그레이드

sudo -i
# worker node
# kubelet, kubectl 업그레이드
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.26.1-00 kubectl=1.26.1-00 && \
apt-mark hold kubelet kubectl

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

# master node
# 노드 uncordon
kubectl uncordon node1
kubectl uncordon node2

# kubectl get nodes
# node1 업그레이드
NAME STATUS ROLES AGE VERSION
master Ready control-plane 21h v1.26.1
node1 Ready <none> 21h v1.26.1
node2 Ready <none> 21h v1.26.0

# k get nodes
# node2 업그레이드
NAME STATUS ROLES AGE VERSION
master Ready control-plane 22h v1.26.1
node1 Ready <none> 21h v1.26.1
node2 Ready <none> 21h v1.26.1