k8sノードのコンテナランタイムをcontainerdに変更した

なぜ変更するのか

k8sが1.20からdockerをランタイムとして使うことを非推奨にする発表が2020/12/2にあった。

Don’t Panic: Kubernetes and Docker –
https://kubernetes.io/blog/2020/12/02/dont-panic-kubernetes-and-docker/

めちゃくちゃざっくり説明するとこれはdockerがCRI(ContainerRuntimeInterface)に準拠していなくて、kubernetes側でdockershismってラッパーみたいなのを作って対応している状態が続いている。という事実があり、メンテしんどいしやめてええか?みたいなことだった。(斜め読みしただけなので違ってたり補足あれば教えてください)

Dockershim Deprecation FAQ –
https://kubernetes.io/blog/2020/12/02/dockershim-faq/

containerdのインストール

dockerの代わりとして使うのにcontainerdがとてもちょうど良さそうだったのでcontainerdにすることにした。
(詳細は割愛。)

https://kubernetes.io/ja/docs/setup/production-environment/container-runtimes/#containerd
これ見ながらcontainerdをインストールする。
containerd.ioはなんかパッケージ見つからんのでcontainerdをインストールする。
動いてるのでヨシ!

ただ、インストールするだけだとcrictlが動かなかったので、/etc/crictl.yamlを作る必要があるぽい
[Question] ctr fails to pull images from insecure-registry. #2758 –
https://github.com/containerd/containerd/issues/2758#issuecomment-437226055

echo "runtime-endpoint: unix:///run/containerd/containerd.sock" > /etc/crictl.yaml

kubeletで使うランタイムの切り替え

オプションを付け加えてリスタートする。

オプションの一覧をみると–container-runtimeでdockerかそうでないか、–container-runtime-endpointでソケットの場所を指定する
https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/

実際には
/etc/systemd/system/kubelet.service.d/10-kubeadm.confのEnvironmentを以下のように編集する

- Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
+ Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --container-runtime=remote --container-runtime-endpoint=/run/containerd/containerd.sock"

上のように編集した後

systemctl daemon-reload
systemctl restart kubelet

で使うランタイムが切り替わる
ここまでやると一通り切り替わってpodが新しくスケジュールされて動いたりしている。
ノードで使われているランタイムの確認は以下のコマンドで出来る

kubectl get node k8s-0 -o jsonpath='{.status.nodeInfo.containerRuntimeVersion}{"\n"}'