Back

/ 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.1
log:
fields:
service: registry
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
health:
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しようとすると以下のようなエラーが出る。

Terminal window
$ docker push <your-registry-endpoint>/nginx
Using default tag: latest
Get https://<your-registry-endpoint>/v2/: http: server gave HTTP response to HTTPS client

httpでアクセスするためにクライアントの設定が必要となる。

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を再起動。

Terminal window
$ cat /etc/docker/daemon.json
{
"insecure-registries" : ["<your-registry-endpoint>"]
}
$ sudo systemctl restart docker # Restart

containerdの設定

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/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
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!