Ubuntu 22.04 に containerd をインストールし、Kubernetes ノードのコンテナランタイムとして使えるように設定します。containerd は Docker の代替というより、Kubernetes が CRI 経由でコンテナを実行するためのランタイムとして扱うと分かりやすいです。
この記事は、Ubuntu 22.04 の既存環境で containerd と kubelet の前提を見直すための記事です。新規構築では Ubuntu 26.04 側の記事を優先しつつ、22.04 環境の設定確認や古い Kubernetes ノードの読み替えに使ってください。
- containerd を Kubernetes の CRI runtime として扱う前提
SystemdCgroupを有効化する理由- sandbox image と Kubernetes バージョンの関係
crictlで CRI endpoint を確認する方法- kubeadm 前に見るノード側の項目
書籍
Kubernetes完全ガイド 第2版
Kubernetes の仕組み、リソース、ネットワーク、運用観点を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
containerd の位置づけ
Kubernetes ノードでは、containerd を単体のコンテナ実行ツールとしてではなく、kubelet から CRI 経由で呼び出されるランタイムとして見ます。そのため、サービスが起動しているだけでなく、kubelet と cgroup driver が一致しているかが重要です。
- Kubernetes が CRI 経由で利用するコンテナランタイムである
- Docker デーモンを前提にせずコンテナを実行できる
- Kubernetes ノードでは kubelet と連携して動作する
- 単体利用より Kubernetes のランタイムとして導入する場面が多い
- cgroup driver の整合性が重要になる
containerd をインストールする
Ubuntu 標準リポジトリから containerd を導入します。既存ノードでは、導入済みバージョンとサービス状態を先に確認します。
sudo apt update
sudo apt install -y containerd
containerd --version
systemctl status containerd.service既存環境では、Kubernetes パッケージのバージョンや kubelet の設定と合わせて確認します。containerd だけを更新すると、pause image や cgroup driver の前提がずれることがあります。
既定設定を生成する
containerd の設定ファイルを生成します。既存ファイルがある場合はバックアップしてから作業します。
sudo mkdir -p /etc/containerd
if [ -f /etc/containerd/config.toml ]; then
sudo cp /etc/containerd/config.toml /etc/containerd/config.toml.bak
fi
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null生成された /etc/containerd/config.toml を元に、Kubernetes ノード向けの設定を入れます。既存ノードでは、差分を残してから変更します。
SystemdCgroup を有効化する
Kubernetes では、kubelet と containerd の cgroup driver を揃える必要があります。Ubuntu 22.04 では systemd を使う構成が自然なので、containerd 側の SystemdCgroup を true にします。
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
grep -n 'SystemdCgroup' /etc/containerd/config.toml出力が SystemdCgroup = true になっていることを確認します。kubelet 側も systemd cgroup driver を使う前提で揃えます。
sandbox image を確認する
Kubernetes の pause image は、Kubernetes のバージョンによって推奨値が変わることがあります。containerd の既定値と kubeadm 側の期待値が違うと警告が出る場合があります。
grep -n 'sandbox_image' /etc/containerd/config.toml
kubeadm config images list警告が出る場合は、利用している Kubernetes バージョンに合わせて sandbox_image を調整します。固定値として暗記するより、対象の kubeadm が要求するイメージを確認します。
containerd を再起動する
設定を変更したら、containerd を再起動します。既存ノードでは、Pod への影響を見てから作業時間を決めます。
sudo systemctl restart containerd.service
sudo systemctl enable containerd.service
systemctl status containerd.service再起動後に kubelet 側でエラーが出る場合は、containerd の起動状態、CRI endpoint、cgroup driver、sandbox image の順に確認します。
CRI として確認する
Kubernetes から見える CRI ランタイムとして確認するには、crictl を使います。接続先のエンドポイントを明示すると、複数ランタイムがある環境でも切り分けしやすくなります。
sudo apt install -y cri-tools
sudo tee /etc/crictl.yaml >/dev/null <<'EOF'
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
sudo crictl info
sudo crictl imagescrictl info が取得できない場合は、containerd の socket、サービス状態、権限を確認します。kubeadm のエラーだけを見るより、CRI 単体で確認した方が原因を分けやすいです。
Kubernetes ノード準備との関係
containerd の設定は、Kubernetes ノードの事前準備とセットで考えます。カーネルモジュール、sysctl、swap 無効化、kubelet / kubeadm の導入が揃って、はじめて kubeadm でクラスター構築へ進めます。
- containerd が起動している
SystemdCgroup = trueになっている- CRI endpoint が
/run/containerd/containerd.sockを向いている - swap が無効化されている
- kubelet と Kubernetes パッケージのバージョンを管理している
22.04 の既存環境を見直す場合は、古い Kubernetes バージョン、containerd の設定差分、kubelet の cgroup driver、swap の状態をまとめて確認します。
まとめ
Ubuntu 22.04 で Kubernetes ノードを構築する場合、containerd は単にインストールするだけではなく、Kubernetes から使うランタイムとして設定する必要があります。特に SystemdCgroup の有効化は、kubelet との整合性という意味で重要です。
containerd の起動、設定ファイル、CRI endpoint、sandbox image を確認しておくと、kubeadm init や kubeadm join の段階でランタイム系トラブルを切り分けやすくなります。

