/ 3 min read
自宅にプライベートなDocker Registryを構築してオンプレKubernetesから利用
今利用しているGCP projectの費用の一番大きなコストになっているのがArtifact Registryである。Kubernetersで動かすdocker imageをホストしているが特にストレージコストとNetwork Internet Egressが支配的という状態。
そこで自宅のNASのサーバーにDocker registryを構築して、Kubernetesのコンテナイメージもここからpullするような機構にすることで脱Artifact Registryを目指す。
Synology NASでregistryを起動
公開されているregistryのimageをNAS上で起動してdocker imageのストレージとして利用する。
まず、事前にNASの決められたパス(e.g., /docker/registry/config.yml )にregistryの設定ファイルを配備しておく。
version: 0.1log: fields: service: registrystorage: delete: enabled: true cache: blobdescriptor: inmemory filesystem: rootdirectory: /var/lib/registryhealth: storagedriver: enabled: true interval: 10s threshold: 3その後、Container Managerからimageをダウンロードし、各種コンテナの設定を行う。
- volumeの設定
- 設定ファイル:
/docker/registry/config.yml:/etc/docker/registry/config.yml - imageを配備するディレクトリ:
/docker/registry/images/:/var/lib/registry
- 設定ファイル:
- Portの設定:
<お好きなport>:5000
マシンからregistryにimageをpush
今回はTLSの設定をしないのでこの状態でregistryにpushしようとすると以下のようなエラーが出る。
$ docker push <your-registry-endpoint>/nginxUsing default tag: latestGet https://<your-registry-endpoint>/v2/: http: server gave HTTP response to HTTPS clienthttpでアクセスするためにクライアントの設定が必要となる。
macでの設定(Docker Desktop)
Docker DesktopのPreference -> Docker Engineからjson内のinsecure-registriesを記述する。
{ "builder": { ... }, "debug": true, "experimental": false, "insecure-registries": [ "<your-registry-endpoint>" ]}設定後、適用とdockerの再起動をすると無事にpushできる。
Ubuntu serverでの設定
macと同様に/etc/docker/daemon.jsonのjsonに同じ内容を追記する。その後dockerを再起動。
$ cat /etc/docker/daemon.json{ "insecure-registries" : ["<your-registry-endpoint>"]}
$ sudo systemctl restart docker # Restartcontainerdの設定
Kubernetesでも同様にregistryがhttps前提となっている。各ノードに配備されているcontainerdの設定ファイル(/etc/containerd/config.toml)を書き換えることで対応する。具体的には以下を追記して、containerdを再起動。
[plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."<your-registry-endpoint>".tls] insecure_skip_verify = true [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."<your-registry-endpoint>"] endpoint = ["http://<your-registry-endpoint>"]これによって自前で構築したregistryからimage pullしてアプリを起動できる。以下はnginxのマニフェスト例。
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deploymentspec: selector: matchLabels: app: nginx replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: <your-registry-endpoint>/nginx ports: - containerPort: 80脱Artifact Registry!