自宅で運用しているKubernetesクラスターをv1.30からv1.31にアップグレードしました。 kubeadmを使った標準的なアップグレード手順ですが、忘れがちなので備忘録として残しておきます。
公式ドキュメント: https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
コントロールプレーンノードのアップグレード
コントロールプレーンノードから順番にアップグレードしていきます。
パッケージリポジトリの変更
まず、yumリポジトリの設定ファイルをv1.31用に変更します。
変更前(v1.30):
[kkato@nuc01 ~]$ cat /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
変更後(v1.31):
$ cat /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
参考: https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/change-package-repository/
kubeadmのアップグレード
まずkubeadmパッケージをアップグレードします。
sudo yum upgrade kubeadm --setopt=disable_excludes=kubernetes
アップグレード可能なバージョンを確認します。
sudo kubeadm upgrade plan
Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT NODE CURRENT TARGET
kubelet nuc01 v1.30.1 v1.31.14
kubelet nuc02 v1.30.1 v1.31.14
kubelet nuc03 v1.30.1 v1.31.14
kubelet nuc04 v1.30.1 v1.31.14
Upgrade to the latest stable version:
COMPONENT NODE CURRENT TARGET
kube-apiserver nuc01 v1.30.4 v1.31.14
kube-controller-manager nuc01 v1.30.4 v1.31.14
kube-scheduler nuc01 v1.30.4 v1.31.14
kube-proxy 1.30.4 v1.31.14
CoreDNS v1.11.1 v1.11.3
etcd nuc01 3.5.12-0 3.5.24-0
You can now apply the upgrade by executing the following command:
kubeadm upgrade apply v1.31.14
アップグレードを実行します。
$ sudo kubeadm upgrade apply v1.31.14
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.31.14". Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.
kubeletとkubectlのアップグレード
コントロールプレーンのkubeletとkubectlをアップグレードします。
sudo yum upgrade kubelet kubectl --setopt=disable_excludes=kubernetes
kubeletを再起動します。
sudo systemctl daemon-reload
sudo systemctl restart kubelet
ノードの確認
コントロールプレーンノードがv1.31.14にアップグレードされたことを確認します。
NAME STATUS ROLES AGE VERSION
nuc01 Ready control-plane 518d v1.31.14
nuc02 Ready <none> 518d v1.30.1
nuc03 Ready <none> 518d v1.30.1
nuc04 Ready <none> 518d v1.30.1
ワーカーノードのアップグレード
コントロールプレーンのアップグレードが完了したら、ワーカーノードを順番にアップグレードしていきます。
パッケージリポジトリの変更とkubeadm upgrade node
コントロールプレーンと同様に、まずリポジトリをv1.31に変更してから、kubeadmをアップグレードします。 その後、ワーカーノードの設定を更新します。
$ sudo kubeadm upgrade node
[upgrade] Reading configuration from the cluster...
[upgrade] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[preflight] Running pre-flight checks
[preflight] Skipping prepull. Not a control plane node.
[upgrade] Skipping phase. Not a control plane node.
[upgrade] Skipping phase. Not a control plane node.
[upgrade] Backing up kubelet config file to /etc/kubernetes/tmp/kubeadm-kubelet-config634698628/config.yaml
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[upgrade] The configuration for this node was successfully updated!
[upgrade] Now you should go ahead and upgrade the kubelet package using your package manager.
kubeletとkubectlのアップグレード
ノードをメンテナンスモードにして、Podを退避させます。
kubectl drain nuc02 --ignore-daemonsets --delete-emptydir-data
``
kubeletとkubectlをアップグレードします。
```bash
sudo yum upgrade kubelet kubectl --setopt=disable_excludes=kubernetes
kubeletを再起動します。
sudo systemctl daemon-reload
sudo systemctl restart kubelet
メンテナンスモードを解除して、ノードをスケジューリング対象に戻します。
kubectl uncordon nuc02
ノードの確認
全てのワーカーノードに対して同じ手順を繰り返します。 全ノードのアップグレードが完了したことを確認します。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
nuc01 Ready control-plane 518d v1.31.14
nuc02 Ready <none> 518d v1.31.14
nuc03 Ready <none> 518d v1.31.14
nuc04 Ready <none> 518d v1.31.14
kubectlクライアントのアップグレード
最後に、ローカルマシン(Mac)のkubectlもアップグレードします。
現在のバージョンを確認すると、クライアントがv1.30.1、サーバーがv1.31.14になっています。
$ kubectl version
Client Version: v1.30.1
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.31.14
macOS用(ARM64)のkubectlバイナリをダウンロードします。
curl -LO "https://dl.k8s.io/release/v1.31.14/bin/darwin/arm64/kubectl"
実行権限を付与して、適切な場所に配置します。
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
sudo chown root: /usr/local/bin/kubectl
クライアントとサーバーのバージョンが揃ったことを確認します。
$ kubectl version
Client Version: v1.31.14
Kustomize Version: v5.4.2
Server Version: v1.31.14
これでKubernetesクラスターのアップグレードが完了しました。