Kubernetes ノードに docker と containerd の両方がインストールされています。CI パイプラインとビルドを実行するには、ノードに docker が必要です。Kubernetes で docker ではなく推奨されている containerd を使用するようにするにはどうすればよいですか? 既存のドキュメントでは、システムから docker を削除することを推奨していますが、これは私のケースでは望ましくありません。
両方がインストールされている場合、Kubernetes でコンテナ ランタイムとして docker ではなく containerd を使用するように強制する方法はありますか?
答え1
Kubeletはノード上のコンテナアクションを担当するプロセスであり、コマンドラインフラグのセットリモート コンテナ管理プロバイダーを使用するように指示します (私の知る限り、containerd と cri-o はどちらも同じように使用されます)。
[Service]
ExecStart=/usr/local/bin/kubelet --container-runtime=remote --container-runtime-endpoint=unix:///var/run/dockershim.sock
(containerd が同じdockershim.sock
パスをリッスンしていると仮定)
マニュアルには、コンテナを作成するときに特定の仮定を行うため、既存のノード登録でこれらのフラグを切り替えないようにすることが明記されています。したがって、dockerを使用しているノードがすでにある場合は、理想的にはkubeletを停止し、それらのコンテナを消去し、kubectl delete node $the_node_name
kubeletを正しい構成で再登録します。
答え2
Ubunut 20.04 でテストしたところ、containerd ランタイムを有効にするシンプルでクリーンな方法は、次のコンテンツを追加することでした/etc/systemd/system/kubelet.service.d/20-use-containerd.conf
:
Environment="KUBELET_EXTRA_ARGS=--container-runtime remote --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock"
これにより、デフォルトで docker-shim に依存するのではなく、containerd を有効にするために、kubelet サービスにいくつかの追加引数が追加されます。
単純な kubelet の再起動では、コンテナがまだ docker を使用して実行されている間に containerd 経由でコンテナを実行しようとするため、ノードを再起動するか、少なくともスイッチの kubelet、docker、containerd を停止することをお勧めします。