環境
- Ubuntu 20.04
- containerd v1.6.6
Dockerコマンドの代わりにnerdctlを使いたい
自宅サーバーにUbuntuを入れてKubernetesを構築しているのだが、現状Kubernetesとdocker-ceのパッケージの相性悪い。
いや、Kubernetesがすでにcontainerdに切り替えているのでDockerの影響を受けないはずなんだけど、 それでもdocker-ceを入れているとistio関連のデプロイに失敗する場合がある(これが余計に面倒
docker-ceを入れてVS-codeのリモートデバッグをしようと思っていたがここは諦めて いっそのこと既存のcontainerdを活用してnerdctlに乗り換えることにした
nerdctlとは
「Docker-compatible CLI for containerd」要はcontainerdをバックグラウンドにしてdockerコマンドっぽくコンテナの操作ができますよって感じ
インストール
nerdctl自体のインストールは一発 今回はv0.22.0を使用したが、containerd/nerdctlのReleaseから最新版のバージョンに差し替えて実行すること。
# curl -sSL https://github.com/containerd/nerdctl/releases/download/v0.22.0/nerdctl-full-0.22.0-linux-amd64.tar.gz | tar Cxzv /usr/local/
これだけでコンテナを起動できる 確認
# nerdctl run --rm -p 8000:80 nginx
が、これだとパフォーマンスに問題があったり、root以外で実行できないと諸問題があるので色々やってく
rootlessのインストール
rootじゃないと実行できないのは微妙なので、一般ユーザーでも使えるようにする
基本的には公式サイトのとおりに実行していけばおk
nerdctl/rootless.md at master · containerd/nerdctl
事前準備
# apt install uidmap
rootless本体のインストール
$ containerd-rootless-setuptool.sh install
エラーになったらslirp4netnsをインストールする
[rootlesskit:parent] error: exec: "slirp4netns": executable file not found in $PATH [ERROR] RootlessKit failed, see the error messages and https://rootlesscontaine.rs/getting-started/common/ .
slirp4netnsのインストール
# curl -o /usr/local/bin/slirp4netns --fail -L https://github.com/rootless-containers/slirp4netns/releases/download/v1.2.0/slirp4netns-$(uname -m) # chmod +x /usr/local/bin/slirp4netns
再度実行すると成功するはず
自動起動するようにする
thr3aは適宜
$ sudo loginctl enable-linger thr3a
BuildKitの有効化
デフォルトではBuildKitが使えないので使えるようにする
$ containerd-rootless-setuptool.sh install-buildkit $ containerd-rootless-setuptool.sh install-buildkit-containerd
Stargz Snapshotterの有効化
イメージPullの高速化ができる「Stargz Snapshotter」というプラグインをインストールする
$ containerd-rootless-setuptool.sh install-stargz
~/.config/containerd/config.toml を新規作成して以下
[proxy_plugins] [proxy_plugins."stargz"] type = "snapshot" # NOTE: replace "1000" with your actual UID address = "/run/user/1000/containerd-stargz-grpc/containerd-stargz-grpc.sock"
UIDは自分で調べて置き換えること
$ id -u thr3a 1000
containerdを再起動しないと反映されないので注意
$ systemctl --user restart containerd.service
確認
nerdctl run -it --rm ghcr.io/stargz-containers/alpine:3.10.2-esgz
インストールに失敗しているとpullに失敗するはず
FATA[0002] failed to stat snapshot sha256:9e0573c62127729a89b3e728371ebe4bd4a77996ea57c8f06bf8760bac3cf16d: snapshotter not loaded: stargz: invalid argument
普通のイメージに対しても nerdctl run --snapshotter=stargz xxxx
をつけてpullすると高速になる。
または環境変数で
export CONTAINERD_SNAPSHOTTER=stargz
をセットしておけばデフォルトで --snapshotter=stargz
相当になる
bypass4netns
rootlessを使うとネットワークのオーバーヘッドが大きくなってしまう問題がある。それをバイパスして解決してくれるのが「bypass4netns」
$ containerd-rootless-setuptool.sh install-bypass4netnsd
実行するときに --label nerdctl/bypass4netns=true
をつける必要がある
$ nerdctl run -it --rm -p 8080:80 --label nerdctl/bypass4netns=true alpine