仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

ローカルのDocker Registoryをk3sで構築したKubernetesで利用する方法

ネットワークの都合とか、利用するイメージの都合でDocker Registoryをローカルに構築して使うというシチュエーションがあります。 KubernetesのランタイムとしてDockerを使っている場合は、Dockerのdaemon.jsonにinsecure-registriesを設定する方法があったりします(ただしこの方法は自分が作成したローカルリポジトリー でない限り、推奨される方法ではありません)。

じゃあこれを「k3sで構築したKubernetes」で行う場合はどうするかという話です(ちなみに本例はk3s 0.9.1時点での話です)。

デフォルトインストールの場合

この手順でインストールした場合、1台目のノードと2台目以降のノードがWorkerとしても稼働しています。 Workerに対してローカルのDocker Registoryを許可する設定が必要です。

rancher.com

許可の方法

ドキュメントは見つけられなかったのですが、次のIssueに方法が書かれていました。

github.com

k3sはデフォルトランタイムとしてcontainerdが使われ、設定のconfig.toml/var/lib/rancher/k3s/agent/etc/containerd/config.toml に生成するようです。このファイルをカスタマイズするには、同じディレクトリに config.toml.tmpl という別のファイルを作成して設定を書き加えます。k3sサービスを再起動するとテンプレートから新しい config.toml が生成され、カスタマイズされた設定が反映されるという仕組みだそうです。

このコメントを参考に、次のようにローカルレジストリーを記述したテンプレートを作成します。

github.com

テンプレートを作成します。以下の例は 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