なぜ変更するのか
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"}'