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にアップグレードしていく。

リンク先を取得できませんでした

リンク先を取得できませんでした

TLS証明書の検証に失敗しました

v1-29.docs.kubernetes.io favicon 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のアップグレード

以下を参考に

リンク先を取得できませんでした

リンク先を取得できませんでした

TLS証明書の検証に失敗しました

v1-29.docs.kubernetes.io favicon 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

やったぜ