Google Cloud Platformで勉強用Kubernetesクラスタを作る (2)

[前編](https://qiita.com/hsmtkk/items/96ebe4a19c4e1bb02088 "前編")でkubeadmを用いたkubeadmクラスタを作成しました。
CKAの出題範囲である、kubeadmによるクラスタのバージョンアップを試してみます。
[公式ドキュメント](https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/ "公式ドキュメント")にしたがって進めます。

# コントローラーのバージョンアップ

## kubeadmのバージョンアップ

```shell
apt-mark unhold kubeadm && \
 apt-get update && apt-get install -y kubeadm=1.26.0-00 && \
 apt-mark hold kubeadm
```

1.26.0がインストールされました。

```shell
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"26", GitVersion:"v1.26.0", GitCommit:"b46a3f887ca979b1a5d14fd39cb1af43e7e5d12d", GitTreeState:"clean", BuildDate:"2022-12-08T19:57:06Z", GoVersion:"go1.19.4", Compiler:"gc", Platform:"linux/amd64"}
```

```shell
kubeadm upgrade plan
kubeadm upgrade apply v1.26.0
```

## drain

```shell
$ kubectl drain controller --ignore-daemonsets 
node/controller already cordoned
Warning: ignoring DaemonSet-managed Pods: calico-system/calico-node-vkjq6, calico-system/csi-node-driver-5zh6x, kube-system/kube-proxy-6krvm
evicting pod calico-apiserver/calico-apiserver-64459cbbd7-vk5ld
pod/calico-apiserver-64459cbbd7-vk5ld evicted
node/controller drained
```

## kubeletのバージョンアップ

```shell
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.26.0-00 kubectl=1.26.0-00 && \
apt-mark hold kubelet kubectl
```

```shell
systemctl daemon-reload
systemctl restart kubelet
```

## CRIのバージョンアップ

CRIにCRI-Oを使用しているので、これもあわせてバージョンアップします。
公式の[手順](https://github.com/cri-o/cri-o/blob/main/install.md#apt-based-operating-systems-1
)にしたがいます。

```shell
OS=Debian_11
VERSION=1.25

# 旧バージョン用のファイルを削除する
rm /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list

VERSION=1.26

# 新バージョン用のファイルをダウンロードする
echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list

curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/Release.key | apt-key add -

apt update
apt install cri-o cri-o-runc
```

## uncordon

```shell
$ kubectl uncordon controller 
node/controller uncordoned
```

## 完了

以下のとおりコントローラーを1.26.0にバージョンアップできました。

```shell
$ kubectl get node 
NAME         STATUS   ROLES           AGE   VERSION
controller   Ready    control-plane   14h   v1.26.0
worker       Ready    <none>          13h   v1.25.0
```

# ワーカーのバージョンアップ

## kubeadmのバージョンアップ

```shell
apt-mark unhold kubeadm && \
 apt-get update && apt-get install -y kubeadm=1.26.0-00 && \
 apt-mark hold kubeadm
```

```shell
kubeadm upgrade node
```

## drain

```shell
$ kubectl drain worker --ignore-daemonsets 
node/worker already cordoned
Warning: ignoring DaemonSet-managed Pods: calico-system/calico-node-hg8b7, calico-system/csi-node-driver-ftw9b, kube-system/kube-proxy-ghnl5
evicting pod tigera-operator/tigera-operator-64db64cb98-rtpx7
evicting pod calico-system/calico-typha-88f68649f-kd2gk
evicting pod calico-apiserver/calico-apiserver-64459cbbd7-b7zpc
evicting pod calico-apiserver/calico-apiserver-64459cbbd7-xlb7q
evicting pod calico-system/calico-kube-controllers-5f9dc85578-9wkmp
evicting pod default/whoami-deploy-6d757cc7f6-srfwl
evicting pod default/whoami-deploy-6d757cc7f6-9fk6b
evicting pod kube-system/coredns-787d4945fb-7pq22
evicting pod kube-system/coredns-787d4945fb-mdffl
pod/whoami-deploy-6d757cc7f6-srfwl evicted
pod/tigera-operator-64db64cb98-rtpx7 evicted
pod/whoami-deploy-6d757cc7f6-9fk6b evicted
pod/calico-kube-controllers-5f9dc85578-9wkmp evicted
pod/calico-apiserver-64459cbbd7-xlb7q evicted
pod/calico-apiserver-64459cbbd7-b7zpc evicted
pod/coredns-787d4945fb-mdffl evicted
pod/coredns-787d4945fb-7pq22 evicted
pod/calico-typha-88f68649f-kd2gk evicted
node/worker drained
```

## kubeletのバージョンアップ

```shell
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.26.0-00 kubectl=1.26.0-00 && \
apt-mark hold kubelet kubectl
```

```shell
systemctl daemon-reload
systemctl restart kubelet
```

## CRI-Oのバージョンアップ

コントローラーと同じ。

## uncordon

```shell
$ kubectl uncordon worker
node/worker uncordoned
```

## 完了

```shell
$ kubectl get node
NAME         STATUS   ROLES           AGE   VERSION
controller   Ready    control-plane   15h   v1.26.0
worker       Ready    <none>          13h   v1.26.0
```

# おわり
以上でコントローラ、ワーカーともに1.26にバージョンアップできました。