ネットワークの都合とか、利用するイメージの都合で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