kubernetes clusterのUpgradeをしたので作業メモ


経緯

RMAに出していたworkerのSSDが先日返ってきたので、v1.30のk8sでセットアップしてclusterに参加しようとしたら以下のエラーが

control planeが1.29.0以降でないと参加できない旨のエラー
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
error execution phase preflight: unable to fetch the kubeadm-config ConfigMap: this version of kubeadm only supports deploying clusters with the control plane version >= 1.29.0. Current version: v1.28.3
To see the stack trace of this error execute with --v=5 or higher

どこかのタイミングでアップグレードしないととは思っていたので、これを機にv1.28のノードをすべてアップグレードすることにした。

現状のcluster構成は以下の通り。

NAME      STATUS                        ROLES           AGE    VERSION
ubuntu1   Ready                         control-plane   175d   v1.28.2
ubuntu2   NotReady,SchedulingDisabled   worker          175d   v1.28.2→1.30.0 # 今回新たにセットアップしたもの
ubuntu3   Ready                         worker          175d   v1.28.2
ubuntu4   Ready                         worker          146d   v1.28.2

公式の手順に従ってノード1,3,4をv1.29にアップグレードしていく。

Upgrading kubeadm clusters

This page explains how to upgrade a Kubernetes cluster created with kubeadm from version 1.28.x to version 1.29.x, and from version 1.29.x to 1.29.y (where y > x). Skipping MINOR versions when upgrading is unsupported. For more details, please visit Version Skew Policy.To see information about upgrading clusters created using older versions of kubeadm, please refer to following pages instead:Upgrading a kubeadm cluster from 1.27 to 1.28 Upgrading a kubeadm cluster from 1.

v1-29.docs.kubernetes.io favicon image v1-29.docs.kubernetes.io

以下のコミュニティのパッケージリポジトリは2024年3月4日に削除されたので、それ以前から利用していた場合はリポジトリの変更が必要。

  • apt.kubernetes.io
  • yum.kubernetes.io
  • packages.cloud.google.com

参考:https://github.com/kubernetes/release/issues/3485

事前に以下のようにリポジトリを変更しておく。

# 既存のリポジトリ削除
$sudo apt-add-repository --remove "deb http://apt.kubernetes.io/ kubernetes-xenial main"

# kubernetesパッケージリポジトリの公開署名をダウンロード(バージョンはこのままで良い)
$curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# リポジトリ追加(今回はv1.29なので)
$echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

手順

利用可能バージョン確認

今回は1.29.4にアップグレードする。

$sudo apt-cache madison kubeadm
   kubeadm | 1.29.4-2.1 | https://pkgs.k8s.io/core:/stable:/v1.29/deb  Packages
   kubeadm | 1.29.3-1.1 | https://pkgs.k8s.io/core:/stable:/v1.29/deb  Packages
   kubeadm | 1.29.2-1.1 | https://pkgs.k8s.io/core:/stable:/v1.29/deb  Packages
   kubeadm | 1.29.1-1.1 | https://pkgs.k8s.io/core:/stable:/v1.29/deb  Packages
   kubeadm | 1.29.0-1.1 | https://pkgs.k8s.io/core:/stable:/v1.29/deb  Packages

control planeのアップグレード

kubeadm

$sudo apt-mark unhold kubeadm && \
 sudo apt-get update && sudo apt-get install -y kubeadm='1.29.4-2.1' && \
 sudo apt-mark hold kubeadm

# 期待通りのバージョンであることを確認
$kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"29", GitVersion:"v1.29.4", GitCommit:"55019c83b0fd51ef4ced8c29eec2c4847f896e74", GitTreeState:"clean", BuildDate:"2024-04-16T15:05:51Z", GoVersion:"go1.21.9", Compiler:"gc", Platform:"linux/arm64"}

# アップグレード計画を確認
$sudo kubeadm upgrade plan

# アップグレード
$sudo kubeadm upgrade apply v1.29.4
[upgrade/config] Making sure the configuration is correct:
[upgrade/config] Reading configuration from the cluster...
[upgrade/config] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[preflight] Running pre-flight checks.
[upgrade] Running cluster health checks
[upgrade/version] You have chosen to change the cluster version to "v1.29.4"
[upgrade/versions] Cluster version: v1.28.3
[upgrade/versions] kubeadm version: v1.29.4
[upgrade] Are you sure you want to proceed? [y/N]: y # yでconfirm
...
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.29.4". Enjoy!

[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.

CNIのアップグレード

flannelを使っているので、以下を実行

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

kubeletとkubectl

# ノードのドレイン
$kubectl drain --ignore-daemonsets  ubuntu1

# upgrade
$sudo apt-mark unhold kubelet kubectl && sudo apt-get update && sudo apt-get install -y kubelet='1.29.4-2.1' kubectl='1.29.4-2.1' && sudo apt-mark hold kubelet kubectl

# kubeletを再起動
$sudo systemctl daemon-reload
$sudo systemctl restart kubelet

# ノードをスケジュール可能に
$kubectl uncordon ubuntu1

workerのアップグレード

以下を参考に

Upgrading Linux nodes

This page explains how to upgrade a Linux Worker Nodes created with kubeadm.Before you begin You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. It is recommended to run this tutorial on a cluster with at least two nodes that are not acting as control plane hosts. If you do not already have a cluster, you can create one by using minikube or you can use one of these Kubernetes playgrounds:

v1-29.docs.kubernetes.io favicon image v1-29.docs.kubernetes.io

また、control planeと同様に、事前にリポジトリのアップデートは済ませておく。

kubeadmのアップグレード

$sudo apt-mark unhold kubeadm && \
 sudo apt-get update && sudo apt-get install -y kubeadm='1.29.4-2.1' && \
 sudo apt-mark hold kubeadm

$sudo kubeadm upgrade node

kubeletとkubectlのアップグレード

# ノードのドレイン(control planeで実行)
# empty-dirを利用している場合--delete-emptydir-dataオプションが必要
# 単体でpodを起動している場合--forceオプションが必要
$kubectl drain --ignore-daemonsets --delete-emptydir-data --force ubuntu3

# upgrade
$sudo apt-mark unhold kubelet kubectl && \
sudo apt-get update && sudo apt-get install -y kubelet='1.29.4-2.1' kubectl='1.29.4-2.1' && \
sudo apt-mark hold kubelet kubectl

# kubeletを再起動
$sudo systemctl daemon-reload
$sudo systemctl restart kubelet

# ノードをスケジュール可能に(control planeで実行)
$kubectl uncordon ubuntu3

動作確認

kubectl get pods -A

ドレインする際に単体で起動していたpodはupgrade後自動で起きてこないので、手動でデプロイする。

無事upgrade前と同様の状態になればおしまい。

おわりに

思っていたよりも簡単にupgradeが終わってよかった。

これが古いapiVersionの廃止を含むバージョン間のupgradeとかになると、途端に面倒になるのかな〜などと考えたり。

$kubectl get nodes
NAME      STATUS   ROLES           AGE    VERSION
ubuntu1   Ready    control-plane   175d   v1.29.4
ubuntu2   Ready    worker          175d   v1.30.0
ubuntu3   Ready    worker          175d   v1.29.4
ubuntu4   Ready    worker          147d   v1.29.4

やったぜ