🚀

kubernetesのdocker -> containerd 切り替え

2021/08/11に公開

まえがき

環境

  • kubernetes 1.20.1
  • worker も master も同じ手順で切り替え可能。

備考

用語の定義

  • master = コントロールプレーン
  • worker = ワーカー

手順

worker / master 共通

2021/09/09 追記
この作業を行うと、そのノードに割り当てられていたPodは終了されるが、それについてkubeletは感知できない。 何が言いたいかというと、kubectl drain node をしてから作業したほうがいいですよ。(1敗)
やらかしてしまったら、Terminating で止まっているPodを一つずつkillしていくと復帰してきます。

docker 削除

docker を削除して containerd を入れる(docker をつかっているなら containerd はインストール済みなので、apt install で手動インストールフラグを建てておく)

apt install contained
apt purge docker

containerdのconfigを生成する

2021/09/18 この手順が抜けていました。これを行わないとcontainerdは起動しません
生成されたconfig.tomlは特に修正する必要はありません。

$ sudo mkdir -p /etc/containerd
$ sudo containerd config default > /etc/containerd/config.toml

/var/lib/kubelet/kubeadm-flags.env

KUBELET_KUBEADM_ARGS に追記

/var/lib/kubelet/kubeadm-flags.env
--container-runtime remote --container-runtime-endpoint unix:///run/containerd/containerd.sock

これを機に "--cgroup-driver" とかのdeprecatedなパラメタが含まれていたら削除しても良いかもしれません。

kubeletを再起動

この際なのでホスト毎再起動しても良いが、 systemctl restart kubelet でもOK

以下はmasterのみ

master で kubeadm の作業をする場合のみ

root で作業する。

共通の手順を行えば、とりあえず kubernetes クラスタは普通に稼働する。

しかし、バージョンアップ時など、kubeadm を使用しようとすると

[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-proxy:v1.21.0: output: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

このようなエラーが出てしまう。とりあえずの対処をしたがこれで正しいのかはちょっとわからない。

criSocket を指定する yaml を作る

これは、 kubeadm config print init-defaults の中から必要な行だけを切り出して作成した。

apiVersion: kubeadm.k8s.io/v1beta1
kind: InitConfiguration
nodeRegistration:
  criSocket: /run/containerd/containerd.sock

ファイル名とファイルの場所はどこでも OK。

yaml のバージョン変換

作った yaml を使用すると、それはバージョンが古いという警告がでるので変換しておく

kubeadm config migrate --old-config /etc/kubernetes/kubeadm-crisocket.yaml --new-config new.yaml

実際のコマンドを入力

kubeadm upgrade apply v1.21.0 --config=new.yaml

メモ

kubeadm はクラスタの configmap に情報を記録していて、それを読んでどうこうしているらしい。

取得の仕方は以下。

kubectl -n kube-system get cm kubeadm-config -o yaml

蛇足

  • master を切り替えるとデータどうなるんだろうと不安だったけれども特に問題はなさそう。
  • kubeadm --cri-socket=/run/containerd/containerd.sock upgrade apply v1.21.0 が通ればなんの問題もなかったのだが、upgrade コマンドは cri-socket オプションが通らないように 1.17 から変更されている。

Discussion