背景
containerdをCNIとして動作させるKubernetesクラスタをオフラインで構築・使用する際、イメージをロードするところで少しハマったので共有します。
インターネット接続できる環境ならスムーズにいくと思うのですが、自分の場合はプロキシ経由のためイメージがpullできず、一旦別PCでローカルにイメージを落とし、それをロードすることにしています。
前提として、Kubernetesで使用するイメージ(kube-apiserverなど)は、
# crictl images
で見えるようになっている必要があります。
(crictlはkubeadmとかのインストール時に同時に入ってきます)
しかし、containerd付属の管理ツールであるctrでそのままロード(import)しても出てきません。
# ctr images import kube-apiserver.tar.gz
unpacking k8s.gcr.io/kube-apiserver:v1.22.1 (省略) ...done
# crictl images
IMAGE TAG IMAGE ID SIZE
対処法
namespaceにk8s.ioを指定してロードします。
# ctr -n k8s.io images import kube-apiserver.tar
...
# crictl images
IMAGE TAG IMAGE ID SIZE
k8s.gcr.io/kube-apiserver v1.22.1 f30469a2491a5 130MB
ローカルでビルドしたイメージをロード(import)してk8sで使いたい場合も同様で、ネームスペースを指定してやればk8sで使えます。
crictlでイメージをロードできるようにしてくれれば使いやすいのですが、イメージロードはCRIが持つべき機能ではない、ということで実装されていないようです。