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
バージョンアップ前の準備
リリースノートを見て、影響を受ける変更がないか確認する。
人によっては kubectl run
で deployment
が作れなくなったのが大きいかも。自分は 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のバージョンアップ
こちらを見て、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で一気に回したい気持ちはある。
Share