Kubernetesアップグレード備忘録

毎回クラスタのアップグレード手順を忘れるのでメモ。  
環境は以前[こちら](https://qiita.com/wancom/items/87555fcb752546d5fdef)で紹介した手順で構築したクラスタです。Ubuntu20.04でk8sのバージョンはv1.25.4でした。

手順は公式を参照しています。（というか、ほぼそのままです。）
v1.25を参照していますが、最新版も手順は同じようです。
https://v1-25.docs.kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

# 始める前に
リポジトリの公開鍵が変わったのか、以前登録した鍵が使えず再登録しました。  
その際に以前と手順が変わっていたようなので、全ノードでリポジトリの登録からやりなおしています。  
(apt-keyが非推奨になっていたのはなんとなく聞いたことがあったと思いますが、それに合わせて変わっていたようです。)
```
# 事前にディレクトリを作成しておく
sudo mkdir -p /etc/apt/keyrings
sudo curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
```

# 1台目のコントロールプレーンをアップグレードする
## 最新のバージョンを確認する
利用できるバージョンは下記のコマンドで確認できます。
今回は現在時点での`1.25`で、最新の`1.25.7`を選択しました。
```
sudo apt update
apt-cache madison kubeadm
```

## kubeadmをアップグレードする
kubeadmを使ってクラスターを管理していますので、kubeadmを使ってアップグレードします。
はじめにkubeadm自身のバージョンをアップグレードします。
```
sudo apt-mark unhold kubeadm
sudo apt install kubeadm=1.25.7-00
sudo apt-mark hold kubeadm
kubeadm version
```

## クラスタをアップグレードし、コンフィグを更新する
kubeadmのアップグレードが終わったらクラスターをアップグレードします。
最初にアップグレードができるか、アップグレード後のバージョンなどを確認してからアップグレードを行います。
```
sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.25.7
```
この後必要に応じてCNIをアップグレードしてください。

## kubeletなどをアップグレードする
最後にkubeletやkubectlをアップグレードします。
アップグレードの過程でkubeletが停止し、k8sのコントロールが効かなくなるため事前にdrainしておきます。
```
kubectl drain kube-ctrl1 --ignore-daemonsets 
```
続いてkubelet、kubectlをアップグレードします。
当然ですが、バージョンは合わせてください。
```
sudo apt-mark unhold kubelet kubectl
sudo apt install kubelet=1.25.7-00 kubectl=1.25.7-00
sudo apt-mark hold kubelet kubectl
```
アップグレードが終わったら、サービスを再起動します。
```
sudo systemctl daemon-reload
sudo systemctl restart kubelet
```
最後にuncordonして１つ目のコントロールプレーンはアップグレード完了です。
```
kubectl uncordon kube-ctrl1
```


# 2台目以降のコントロールプレーンをアップグレードする
`kubeadm upgrade`が変わったり、CNIのアップグレードが不要だったりと少し手順が変わりますが、他はほぼ同じため説明を省略します。
下記を他の全てのコントロールプレーンで行います。

## kubeadmをアップグレードする
```
sudo apt-mark unhold kubeadm
sudo apt install kubeadm=1.25.7-00
sudo apt-mark hold kubeadm
kubeadm version
```

## コンフィグを更新する
今回は2台目以降のコントロールプレーンのアップグレードのため`kubeadm upgrade apply`ではなく、`kubeadm upgrade node`を使用します。
```
sudo kubeadm upgrade node
```

## kubeletなどをアップグレードする
```
kubectl drain kube-ctrl2 --ignore-daemonsets 
```
```
sudo apt-mark unhold kubelet kubectl
sudo apt install kubelet=1.25.7-00 kubectl=1.25.7-00
sudo apt-mark hold kubelet kubectl

sudo systemctl daemon-reload
sudo systemctl restart kubelet
```
```
kubectl uncordon kube-ctrl2
```

# ワーカーノードをアップグレードする
「2台目以降のコントロールプレーンをアップグレードする」と同じ手順のため、説明を省きます。
リソースが不足しないように、1台ずつ実施してください。

## kubeadmをアップグレードする
```
sudo apt-mark unhold kubeadm
sudo apt install kubeadm=1.25.7-00
sudo apt-mark hold kubeadm
kubeadm version
```

## コンフィグを更新する
```
sudo kubeadm upgrade node
```

## kubeletなどをアップグレードする
```
kubectl drain kube-work1 --ignore-daemonsets 
```
```
sudo apt-mark unhold kubelet kubectl
sudo apt install kubelet=1.25.7-00 kubectl=1.25.7-00
sudo apt-mark hold kubelet kubectl

sudo systemctl daemon-reload
sudo systemctl restart kubelet
```
```
kubectl uncordon kube-work1
```

# あとがき
まとめてみると手順はシンプルですね。（kubeadm便利！）
備忘録なので今回はこの辺にしておきます。
誤字、脱字、間違い等があればご指摘いただければ幸いです。

# Reference
- https://v1-25.docs.kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
- https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/