ネットワークの都合とか、利用するイメージの都合でDocker Registoryをローカルに構築して使うというシチュエーションがあります。
KubernetesのランタイムとしてDockerを使っている場合は、Dockerのdaemon.jsonにinsecure-registries
を設定する方法があったりします(ただしこの方法は自分が作成したローカルリポジトリー でない限り、推奨される方法ではありません)。
じゃあこれを「k3sで構築したKubernetes」で行う場合はどうするかという話です(ちなみに本例はk3s 0.9.1時点での話です)。
デフォルトインストールの場合
この手順でインストールした場合、1台目のノードと2台目以降のノードがWorkerとしても稼働しています。 Workerに対してローカルのDocker Registoryを許可する設定が必要です。
許可の方法
ドキュメントは見つけられなかったのですが、次のIssueに方法が書かれていました。
k3sはデフォルトランタイムとしてcontainerdが使われ、設定のconfig.toml
は /var/lib/rancher/k3s/agent/etc/containerd/config.toml
に生成するようです。このファイルをカスタマイズするには、同じディレクトリに config.toml.tmpl
という別のファイルを作成して設定を書き加えます。k3sサービスを再起動するとテンプレートから新しい config.toml
が生成され、カスタマイズされた設定が反映されるという仕組みだそうです。
このコメントを参考に、次のようにローカルレジストリーを記述したテンプレートを作成します。
テンプレートを作成します。以下の例は k3s version v0.9.1
に含まれるcontainerd向けのテンプレートの例です。
# cat <<EOF >> /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl [plugins.opt] path = "{{ .NodeConfig.Containerd.Opt }}" [plugins.cri] stream_server_address = "{{ .NodeConfig.AgentConfig.NodeName }}" stream_server_port = "10010" [plugins.cri.cni] bin_dir = "{{ .NodeConfig.AgentConfig.CNIBinDir }}" conf_dir = "{{ .NodeConfig.AgentConfig.CNIConfDir }}" [plugins.cri.registry] [plugins.cri.registry.mirrors] [plugins.cri.registry.mirrors."10.0.0.100:5000"] endpoint = ["http://10.0.0.100:5000"] EOF
設定が反映されたことを確認
終わったら、 systemctl restart k3s
コマンドでk3sを再起動します。 k3s crictl info
コマンドを実行して、レジストリーが追加されていることを確認します。
# k3s crictl info ... "registry": { "mirrors": { "10.0.0.100:5000": { "endpoint": [ "http://10.0.0.100:5000" ←追加したレジストリーが設定されていることを確認。 ] }, ...
Docker Local Registoryのセットアップ
以下はローカルのDocker RegistoryをRaspbian 10かDebian 10、もしくはUbuntu 16.04で構築する例を示しています。
10.0.0.100:5000
でアクセスできるようにポート指定してコンテナーイメージで起動します。
# apt update && apt install docker.io # docker run -d -p 5000:5000 --restart always --name registry registry:2.6.2
イメージを登録
ローカルのDocker Registoryにイメージを登録します。以下実行例です。
# docker pull ubuntu:xenial # docker tag ubuntu:xenial 10.0.0.100:5000/ubuntu # docker push 10.0.0.100:5000/ubuntu
Kubernetesで使ってみる
次のようなYAMLを書いて...
# cat deploy.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: myubuntu spec: replicas: 1 template: metadata: labels: run: myubuntu spec: containers: - name: myubuntu image: 10.0.0.100:5000/ubuntu imagePullPolicy: Always tty: true
Podを作成します。例ではDeployment APIを利用した例です。
# kubectl apply -f deploy.yaml
しばらくすると、ローカルレジストリーのUbuntuイメージを使って、myubuntuが作成されます。
# kubectl get deployment