kubeletが使うコンテナランタイムをdockerからcontainerdに変更する
kubeletが使うコンテナランタイムはこれまでdockerを使っていたのだが、別のものを試してみようということでcontainerdに変更してみた。
containerdをインストールする
containerdはaptでインストールできる(パッケージ: containerd)。また、containerdが使うLow Level Runtimeであるruncも同時にインストールされる。インストールした後、以下のコマンドを実行して設定のデフォルト値を /etc/containerd/config.toml
に書き込み、systemctl start containerd
で起動する。
$ containerd config default
kubeletからcontainerdを使う
kubeletの引数に以下を追加して再起動することで、containerdを使うようになる。
--container-runtime=remote
--container-runtime-endpoint=/run/containerd/containerd.sock
CRIのおかげで、これだけでランタイムを切り替えることができてとても便利。
ノード上で動いているコンテナ一覧を見るには
これまではdocker psを実行してそのノード上で動いているコンテナの一覧を表示していた。containerdの場合はどうすればいいのかというと、2つ方法がある。
まずはcontainerdに付属しているctrコマンド。namespaceフラグでk8s.ioを指定することで、kubeletによって作成されたコンテナの一覧を見ることができる。
$ sudo ctr --namespace k8s.io containers list
CONTAINER IMAGE RUNTIME
24ff8b4bb5d6cdfdc5311aa44716a53fa7cd578da76b125e063660e8459ea96f k8s.gcr.io/metrics-server-amd64:v0.3.1 io.containerd.runtime.v1.linux
しかし、コンテナのIDとイメージ、ランタイムしか見えずトラブルシュートに使うには物足りない。そこで、もう1つの方法としてcrictlを使うことができる。
https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md
crictlはCRIに互換性のあるコンテナランタイム向けのCLIツールである。crictl psでコンテナ一覧を見ることができる。表示項目はdocker psに近く、使いやすいだろう。また、docker psコマンドでコンテナ一覧を見るとコンテナ名が長くなり読みにくいが、crictlだと素朴に名前が表示されるので視認性も高い。しかし、pauseコンテナは表示されないのでその点は注意(見えないことで困ることがあるのかはよく分からない)。
$ sudo crictl ps
CONTAINER ID IMAGE CREATED STATE NAME ATTEMPT POD ID
24ff8b4bb5d6c 61a0c90da56e7 22 hours ago Running metrics-server 0 68dfed1214a0a
crictlはexecやlogsなど、ノード内でコンテナを見るときに使うコマンドも備えているので基本的にはこれを使い、必要に応じてctrコマンドを使うのが良さそう。なお、runcにもlistコマンドがありコンテナ一覧を表示できそうだったが何も見えなかった。
containerdをkubernetesから使ってみたい方、参考になれば幸いです。