kubernetesを1.17から1.18にバージョンアップする


CRI-O + Kata containers + Weavenetでkubernetesをインストールする で作成したクラスタが 当時はUbuntu向けのCRI-Oのパッケージが1.17までしか用意されてなかったのでk8sも1.17で作成した。 最近見たら1.19.0まで作成されていたので、まずは1.18にバージョンアップしてみる。

どういう制約があるのかわかってないけど、CRI-Oはkubernetesのバージョンと1対1対応しているので それに合わせたバージョンを入れなければならない。

https://github.com/cri-o/cri-o#compatibility-matrix-cri-o--kubernetes

ちなみにバージョンアップ前の状態はこんな感じ。

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.8", GitCommit:"35dc4cdc26cfcb6614059c4c6e836e5f0dc61dee", GitTreeState:"clean", BuildDate:"2020-06-26T03:43:27Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.8", GitCommit:"35dc4cdc26cfcb6614059c4c6e836e5f0dc61dee", GitTreeState:"clean", BuildDate:"2020-06-26T03:36:03Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}

$ kubectl get node -o wide
NAME     STATUS   ROLES    AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
master   Ready    master   88d   v1.17.8   192.168.2.241   <none>        Ubuntu 18.04.4 LTS   4.15.0-109-generic   cri-o://1.17.4
node1    Ready    <none>   88d   v1.17.8   192.168.2.242   <none>        Ubuntu 18.04.4 LTS   4.15.0-109-generic   cri-o://1.17.4
node2    Ready    <none>   88d   v1.17.8   192.168.2.243   <none>        Ubuntu 18.04.4 LTS   4.15.0-109-generic   cri-o://1.17.4
node3    Ready    <none>   88d   v1.17.8   192.168.2.244   <none>        Ubuntu 18.04.4 LTS   4.15.0-109-generic   cri-o://1.17.4

バージョンアップ前の準備

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md#urgent-upgrade-notes-1

リリースノートを見て、影響を受ける変更がないか確認する。

人によっては kubectl rundeployment が作れなくなったのが大きいかも。自分は kubectl create を使ってるので影響なし。 いくつかのkindのバージョン指定も使えなくなるので、そこも注意。ツールがやっちゃってる場合以外は影響なさそう。

kubeadmのバージョンアップ

apt-cache madison で、現在利用できるバージョンの一覧を取得することができる。 パッケージが提供されないことはまずなく、kubernetesのバージョンと一致してるのだから、そこから調べてもいいんだけど。

$ apt-cache madison kubeadm
   kubeadm |  1.19.2-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
   kubeadm |  1.19.1-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
   kubeadm |  1.19.0-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
   kubeadm |  1.18.9-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
   kubeadm |  1.18.8-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
   kubeadm |  1.18.6-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
(後略)

1.18系の最新マイナーが、 1.18.9-00 であることがわかるので、これをインストールする。

sudo apt-mark unhold kubeadm && apt update && apt install -y kubeadm=1.18.9-00 && apt-mark hold kubeadm

コントロールプレーンのバージョンアップ

普通に、drainして可能なバージョンアップ先を確認して、実行するだけ。

kubectl drain master --ignore-daemonsets
sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.18.9
kubectl uncordon master

再度 kubectl version を実行すると、1.18.9に上がっていることが確認できる。

kubectl version
Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.8", GitCommit:"35dc4cdc26cfcb6614059c4c6e836e5f0dc61dee", GitTreeState:"clean", BuildDate:"2020-06-26T03:43:27Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.9", GitCommit:"94f372e501c973a7fa9eb40ec9ebd2fe7ca69848", GitTreeState:"clean", BuildDate:"2020-09-16T13:47:43Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}

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

https://cri-o.io/

こちらを見て、1.18.3をインストールした。これまでの1.17は削除しておく。

apt purge -y cri-o-1.17
export OS=xUbuntu_18.04
export VERSION=1.18
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
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 -
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | apt-key add -

apt update
apt install -y cri-o cri-o-runc

crioのバージョンを見て、1.18であることを確認。

crio version
Version:       1.18.3
GitCommit:     8ccff67ade1f1eb14952db799512bb2581d4ba39
GitTreeState:  dirty
BuildDate:     2020-08-04T01:56:09Z
GoVersion:     go1.14.4
Compiler:      gc
Platform:      linux/amd64
Linkmode:      dynamic

kubelet, kubectlのバージョンアップ

これもドキュメント通りなので、特筆事項はなし。

sudo apt-mark unhold kubelet kubectl && apt update && apt install kubelet=1.18.9-00 kubectl=1.18.9-00 && apt-mark hold kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet

これで、ノードのバージョンも1.18に上がったことが確認できる。

kubectl get node
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   90d   v1.18.9
node1    Ready    <none>   90d   v1.17.8
node2    Ready    <none>   90d   v1.17.8
node3    Ready    <none>   90d   v1.17.8

ノードのバージョンアップ

各サーバについて kubeadm upgrade apply する代わりに、 kubeadm upgrade node すること以外は変わらない。

まとめ

CKAの勉強をしているときにkubeadmを使ってクラスタをバージョンアップする方法も学んだので今回やってみた。 EKSなどのマネージドなものに比べると多少面倒ではあるが、意外と簡単だし詰まりポイントも少ない印象を受けた。

とはいえ、4台構成だからまだやっていけるけど、これが多くなるようだと単純に面倒なので kubespray とか使ってansibleで一気に回したい気持ちはある。


関連記事