Kubernetes Upgradeメモ【v1.28→v1.29】
Table of Contents
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にアップグレードしていく。
![](https://4nm1tsu.com/kubernetes-horizontal-color_7534258791961665428_hu999cd8b4a0602898549f5ade1550b92a_32166_200x200_fit_q100_h2_box_3.webp)
Upgrading kubeadm clusters
以下のコミュニティのパッケージリポジトリは2024年3月4日に削除されたので、それ以前から利用していた場合はリポジトリの変更が必要。
- apt.kubernetes.io
- yum.kubernetes.io
- packages.cloud.google.com
事前に以下のようにリポジトリを変更しておく。
# 既存のリポジトリ削除
$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のアップグレード
以下を参考に
![](https://4nm1tsu.com/kubernetes-horizontal-color_7534258791961665428_hu999cd8b4a0602898549f5ade1550b92a_32166_200x200_fit_q100_h2_box_3.webp)
Upgrading Linux nodes
また、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
やったぜ
Read other posts