[CKA] Kubernetes 버전과 클러스터 업그레이드
Kubernetes 버전과 클러스터 업그레이드의 핵심 개념과 구성 방법, 실습 풀이를 정리합니다.
kubectl get nodes 를 사용하면 쿠버네티스의 버전을 확인할 수 있습니다.
Major, Minor, Patch로 나뉘며 항상 업데이트되며 표준 소프트웨어 릴리스 버전 관리 절차를 따릅니다.
Version number
컨트롤 플레인의 모든 구성요소는 버전 번호가 다른 구성 요소들이 있을 수 있다는 것을 알아야합니다.
특히 etcd와 CoreDNS는 각 다른 프로젝트로 고유 버전을 가지고 있습니다.
버전 업그레이드 방법
Kubernetes 구성 요소는 공식 version skew 범위 안에서 서로 다른 마이너 버전을 사용할 수 있습니다.
kube-controller-manager와kube-scheduler:kube-apiserver보다 높을 수 없으며 최대 1 마이너 버전 낮을 수 있음kubelet:kube-apiserver보다 높을 수 없으며 최대 3 마이너 버전 낮을 수 있음kubectl:kube-apiserver보다 1 마이너 버전 높거나 낮을 수 있음
API 서버가 여러 개인 고가용성 클러스터에서는 API 서버 간 skew 조건도 함께 확인해야 합니다.
또한 업그레이드에 있어서 한 번에 마이너 버전 하나씩 업그레이드하는 것을 권장하며, 업그레이드 프로세스는 모두 클러스터 설정에 있습니다
다른 kubernetes provider를 사용한다면 클릭 몇번으로 쉽게 업그레이드 할 수 있지만 kubeadm으로 배포했다면 다양한 구성 요소를 직접 업그레이드 해야합니다.
업그레이드 단계
kubeadm으로 설치한 경우를 가정합니다.
- 마스터 노드 업그레이드
- 마스터가 업그레이드 되는 동안 각 구성 요소는 잠시 다운되지만 마스터가 다운 되었다고 하여 클러스터 상의 워커들과 앱이 영향을 받진 않습니다.
- 단 kubectl이나 다른 k8s api를 통해 클러스터에 엑세스, 배포, 삭제, 수정 및 고가용성이 동작하지 않습니다.
- 다시 복구 된다면 정상적으로 동작합니다.
- 워커 노드 업그레이드
- 작업자 노드 업그레이드에는 다양한 전략이 사용됩니다.
- 한 번에 업그레이드 되는 경우 파드가 다운되며 앱 접속에 문제가 발생합니다.
- 노드 하나씩 업그레이드 하면 마스터가 업그레이드 되길 기다린 후 각 노드가 하나씩 업그레이드 되며 노드에 속한 파드는 다른 파드로 이동합니다.
- 새로운 버전을 가진 노드를 추가하여 새로운 노드를 빠르게 프로비저닝한 뒤 새 노드로 옮길 수 있습니다.
- 작업자 노드 업그레이드에는 다양한 전략이 사용됩니다.
kubeadm upgrade plan 을 통해 많은 정보를 얻어 cotrollplane, apiserver를 확인할 수 있습니다. 또한 어떤 버전으로 업그레이드 되어야하는지 확인할 수 있습니다.
주의해야할 점은 kubeadm은 kubelet을 설치하거나 업그레이드 하지 않습니다.
따라서 업데이트되었다고 했을 때 kubectl get nodes 를 한다고 하여 바로 확인되지 않습니다. kubelet을 따라가기 때문이며 마지막으로 kubelet 업그레이드를 진행해야합니다.
master node → kubelet → worker node
작업자 노드에서 drain하여 노드의 스케줄을 조정할 때 작업자 노드에서도 각 kubeadm과 kubelet 패키지 업데잍를 진행해야합니다.
마찬가지로 kubeadm과 kubelet 패키지를 업데이트 하고 다시 시작합니다.
uncordon을 빼먹지 않고 설정해야 파드와 deployment 서비스가 문제없이 동작할 수 있습니다.
Upgrading kubeadm clusters
Upgrading kubeadm clusters
Changing The Kubernetes Package Repository
문서를 계속 읽어보면 진행할 수 있습니다.
반드시 패키지 리포지토리 변경 사항을 추적해야합니다.
Kubernetes 클러스터 업그레이드의 일반적인 순서는 다음과 같습니다:
- kubeadm
- 클러스터 (Control Plane 컴포넌트)
- 마스터 노드 (Control Plane 노드)
- kubectl
- 워커 노드
이 순서를 더 상세히 설명하겠습니다: - kubeadm: 클러스터 관리 도구를 먼저 업그레이드합니다.
- kubernetes 패키지 저장소를 업데이트 해야합니다.
- ubuntu/debian 환경에서 apt 형식으로 변경되었습니다.
- 각 Kubernetes 버전은 특정 저장소에서 관리됩니다.
- 새로운 버전으로 업그레이드하려면 해당 버전의 패키지에 접근해야 합니다.
vim /etc/apt/sources.list.d/kubernetes.listdeb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg]https://pkgs.k8s.io/core:/stable:/v1.30/deb//apt updateapt-cache madison kubeadmapt-get install kubeadm=1.30.0-1.1- 패키지의 빌드버전 확인
- CoreDNS, kube-proxy 또한 마찬가지로 즉시 업데이트 됩니다.
kubeadm upgrade plankubeadm upgrade apply v1.xx.x
- kubernetes 패키지 저장소를 업데이트 해야합니다.
- 클러스터: Control Plane 컴포넌트(예: API 서버, 컨트롤러 매니저, 스케줄러)를 업그레이드합니다.
- 이는
kubeadm upgrade apply과정 중 자동으로 수행됩니다.
- 이는
- 마스터 노드: Control Plane 노드의 kubelet과 기타 컴포넌트를 업그레이드합니다.
apt-get install kubelet=1.30.0-1.1systemctl restart kubelet- kubelet과 kubectl 패키지 업그레이드
- kubelet 서비스 재시작
- 모든 파드가 종료되므로 영향을 받지 않기 위해선 다른 controlplane 노드로 옮겨야합니다.
kubectl uncordon controlplane
- kubectl: 관리 도구인 kubectl을 업그레이드합니다.
- 패키지 매니저를 통해 업그레이드
- 워커 노드: 마지막으로 각 워커 노드를 업그레이드합니다.
- 작업 노드의 업그레이드 수행 전 모든 노드를 drain해야합니다.
- ssh node01
- k8s apt 리포지토리 변경
vim /etc/apt/sources.list.d/kubernetes.listdeb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg]https://pkgs.k8s.io/core:/stable:/v1.30/deb//
- 업그레이드 가능한 최신 버전의 패키지 정보 조회
apt updateapt-cache madison kubeadm
- kubeadm 패키지 업그레이드
apt-get install kubeadm=1.30.0-1.1kubeadm upgrade node
- kubelet 패키지 업그레이드 및 재시작
apt-get install kubelet=1.30.0-1.1systemctl daemon-reloadsystemctl restart kubelet
- 노드 스케줄 등록
kubectl uncordon node1
- 작업 노드의 업그레이드 수행 전 모든 노드를 drain해야합니다.
정리하면 다음과 같습니다.
마스터 노드 (Control Plane) 업그레이드:
- 마스터 노드 drain
- 마스터 노드의 kubeadm 업그레이드
- kubeadm upgrade apply 실행 (Control Plane 컴포넌트 업그레이드)
- 마스터 노드의 kubelet, kubectl 업그레이드
- kubelet 재시작
- 마스터 노드 uncordon
워커 노드 업그레이드:
- 워커 노드 drain
- 워커 노드의 kubeadm 업그레이드
- kubeadm upgrade node 실행
- 워커 노드의 kubelet 업그레이드 (kubectl은 선택적)
- kubelet 재시작
- 워커 노드 uncordon