클러스터 업그레이드

kubeadm 기반 Kubernetes 클러스터의 무중단 업그레이드 절차


kubeadm 기반 Kubernetes 클러스터의 무중단 업그레이드 절차

목표: 프로덕션 환경에서 안전하게 업그레이드할 수 있는 수준


🔄 업그레이드 전략

버전 정책

  • Kubernetes: 마이너 버전 1개씩 (1.28 → 1.29)
  • 컴포넌트: kubelet은 API Server보다 최대 2버전 낮을 수 있음
  • 순서: Control Plane → Worker Node

업그레이드 순서

[백업] ──> [CP 1] ──> [CP 2,3] ──> [Workers]
   │         │           │            │
   │         ▼           ▼            ▼
   │      drain      uncordon      drain
   │      upgrade    upgrade       upgrade
   │      uncordon   uncordon      uncordon

   └──> etcd, 설정, 인증서

📋 사전 준비

백업

# 1. etcd 백업
sudo ETCDCTL_API=3 etcdctl snapshot save etcd-backup-$(date +%Y%m%d).db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

# 2. 설정 백업
sudo cp -r /etc/kubernetes /etc/kubernetes.backup

# 3. 현재 버전 확인
kubectl version
kubeadm version

업그레이드 계획

# 업그레이드 가능한 버전 확인
sudo kubeadm upgrade plan

# 출력 예시:
# Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
# COMPONENT   CURRENT       AVAILABLE
# kubelet     1.28.2        1.29.0
# 
# Upgrade to the latest stable version:
# COMPONENT                 CURRENT   AVAILABLE
# kube-apiserver            1.28.2    1.29.0
# kube-controller-manager   1.28.2    1.29.0
# kube-scheduler            1.28.2    1.29.0
# kube-proxy                1.28.2    1.29.0

🎛️ Control Plane 업그레이드

1단계: 첫 번째 Control Plane

# 1. drain
kubectl drain cp-1 --ignore-daemonsets --delete-emptydir-data

# 2. 패키지 업데이트
sudo apt-mark unhold kubeadm kubectl && \
sudo apt-get update && \
sudo apt-get install -y kubeadm=1.29.0-00 kubectl=1.29.0-00 && \
sudo apt-mark hold kubeadm kubectl

# 3. 업그레이드 적용
sudo kubeadm upgrade apply v1.29.0

# 4. kubelet 업그레이드
sudo apt-mark unhold kubelet && \
sudo apt-get update && \
sudo apt-get install -y kubelet=1.29.0-00 && \
sudo apt-mark hold kubelet

sudo systemctl daemon-reload
sudo systemctl restart kubelet

# 5. uncordon
kubectl uncordon cp-1

2단계: 추가 Control Plane (HA)

# 1. drain
kubectl drain cp-2 --ignore-daemonsets --delete-emptydir-data

# 2. 패키지 업데이트
sudo apt-mark unhold kubeadm kubectl kubelet && \
sudo apt-get update && \
sudo apt-get install -y kubeadm=1.29.0-00 kubectl=1.29.0-00 kubelet=1.29.0-00 && \
sudo apt-mark hold kubeadm kubectl kubelet

# 3. node 업그레이드
sudo kubeadm upgrade node

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

# 5. uncordon
kubectl uncordon cp-2

👷 Worker Node 업그레이드

# 1. drain
kubectl drain worker-1 --ignore-daemonsets --delete-emptydir-data

# 2. SSH 접속
ssh worker-1

# 3. 패키지 업데이트
sudo apt-mark unhold kubeadm kubectl kubelet && \
sudo apt-get update && \
sudo apt-get install -y kubeadm=1.29.0-00 kubectl=1.29.0-00 kubelet=1.29.0-00 && \
sudo apt-mark hold kubeadm kubectl kubelet

# 4. node 업그레이드
sudo kubeadm upgrade node

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

# 6. uncordon
exit
kubectl uncordon worker-1

✅ 업그레이드 확인

# 버전 확인
kubectl version
kubectl get nodes

# 컴포넌트 확인
kubectl get pods -n kube-system

# 기능 테스트
kubectl run test --image=nginx
kubectl get pod test
kubectl delete pod test

🐛 문제 해결

업그레이드 실패

# kubeadm 상태 확인
sudo kubeadm upgrade plan

# 로그 확인
sudo journalctl -u kubelet -f

# 인증서 문제
sudo kubeadm certs check-expiration
sudo kubeadm certs renew all

# 되돌리기 (백업에서)
sudo cp -r /etc/kubernetes.backup /etc/kubernetes
sudo systemctl restart kubelet

📋 체크리스트

  • etcd 백업
  • 업그레이드 계획 확인
  • Control Plane 순차 업그레이드
  • Worker Node 순차 업그레이드
  • 버전 확인
  • 기능 테스트

🔗 관련 노트

  • 02-01-kubeadm-클러스터-설치 — 초기 설치
  • 02-12-클러스터-장애-복구 — 장애 대응
  • CKA-기출문제 — 시험 문제

마지막 업데이트: 2026-06-01