kubernetesのdocker -> containerd 切り替え
まえがき
環境
- 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 に追記
--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