自宅クラウド用にコンテナレジストリを設置しました.
はじめに
自宅に Kubernetes 環境を構築すると,そこで動かすコンテナイメージを格納しておくレジストリが必要になります.Docker Hub とかのサービスを利用することもできるのですが,下記の観点から自宅に構築することにしました.
- コンテナイメージの中に何らかのパスワードとかが入ってしまっても大事にならないようにしたい
- イメージサイズが数百 MB 程度のサイズになっても,ストレスなく使いたい
コンテナレジストリの選択肢
このような用途に合ったソリューションを調べたところ,現状では次の2つの選択肢があることが分かりました.
- Docker registry
- Harbor
名前になじんでいることから最初 Docker registry を選択してみたのですが,Web インターフェースがなく,とっつきにかったので,早々に Harbor に移行しました.
というわけで,以降では docker-compose を使って Harbor を動かす方法を紹介します.
Harbor のインストール
Web を検索すると既に古くなった煩雑な手順が色々出てきますが,現時点では基本的には下記の手順に従えば OK です.
準備としては設定ファイル1個を編集するだけなのでとてもお手軽です.
まず,インストール用のファイルを取得し,設定ファイルのひな型を用意します.
1 2 3 4 |
$ wget https://github.com/goharbor/harbor/releases/download/v2.4.3/harbor-online-installer-v2.4.3.tgz $ tar zxvf harbor-online-installer-v2.4.3.tgz $ cd harbor $ cp harbor.yml.tmpl harbor.yml |
編集するのは,次の2項目です.
- ホスト名の指定
- Harbor をインストールするサーバのホスト名に変更します.
- HTTPS の無効化
- 自宅クラウドの場合,HTTPS を使うのは煩雑なので,無効化します.
具体的な編集内容は下記のとおりです.「registry.green-rabbit.net」は手元の環境のものに置き換えてください(以降同様).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
@@ -1,23 +1,23 @@ # Configuration file of Harbor # The IP address or hostname to access admin UI and registry service. # DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients. -hostname: reg.mydomain.com +hostname: registry.green-rabbit.net # http related config http: # port for http, default is 80. If https enabled, this port will redirect to https port port: 80 # https related config -https: - # https port for harbor, default is 443 - port: 443 - # The path of cert and key files for nginx - certificate: /your/certificate/path - private_key: /your/private/key/path +# https: +# # https port for harbor, default is 443 +# port: 443 +# # The path of cert and key files for nginx +# certificate: /your/certificate/path +# private_key: /your/private/key/path # # Uncomment following will enable tls communication between all harbor components # internal_tls: # # set enabled to true means internal tls is enabled # enabled: true |
必要に応じてデータの置き場所である data_volume も変更します.
編集が終わったら,次のコマンドを実行すればインストール完了です.
1 |
$ sudo ./install.sh |
「hostname」で指定したアドレスにアクセスすると,Web インターフェースが表示されると思います.上記の設定ファイルで編集してなければ,ユーザ: admin,パスワード: Harbor12345 でログインできると思います.
Harbor へのコンテナイメージの登録
構築した Harbor では HTTPS ではなく,HTTP を使うようにしているので,Docker の設定が必要になります.
具体的には /etc/docker/daemon.json
に対して次の設定が必要になります.ファイルがない場合は作成します.
1 2 3 4 5 |
+{ + "insecure-registries" : [ + "registry.green-rabbit.net" + ] +} |
修正が終わったら,下記のコマンドを実行して設定を反映します.
1 |
$ sudo systemctl restart docker.service |
あとは,次のコマンドでログイン設定を行い,
1 |
$ docker login registry.green-rabbit.net |
次のようなスクリプトを実行すれば,レジストリにイメージを登録できると思います.
1 2 3 4 5 6 7 8 |
#!/usr/bin/env zsh NAME=test REGISTRY=registry.green-rabbit.net/library docker build . -t ${NAME} docker tag ${NAME} ${REGISTRY}/${NAME} docker push ${REGISTRY}/${NAME} |
Harbor にアクセスすると,下図のように登録されたイメージが確認できます.
ここまで手順を Ansible レシピにしたものを下記に置いています.
登録したイメージの使用
HTTP を使うので,Docker と同様に containerd に対しても2点の設定が必要になります.
- 認証の無効化
- TLS の認証を無効化するため,「insecure_skip_verify = true」を指定します.
- HTTP の指定
- ローカルのレジストリホストの場合は HTTP でアクセスさせるため,「endpoint = [“http://registry.green-rabbit.net”]」を指定します.
具体的には /etc/containerd/config.toml
に対して次のように追記を行います.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@@ -107,11 +107,11 @@ config_path = "" [plugins."io.containerd.grpc.v1.cri".registry.auths] [plugins."io.containerd.grpc.v1.cri".registry.configs] + [plugins."io.containerd.grpc.v1.cri".registry.configs."registry.green-rabbit.net".tls] + insecure_skip_verify = true [plugins."io.containerd.grpc.v1.cri".registry.headers] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] + [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.green-rabbit.net"] + endpoint = ["http://registry.green-rabbit.net"] [plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming] tls_cert_file = "" tls_key_file = "" |
この設定は,Harbor にアクセスすることになるすべてのサーバーで必要になります.したがって,以下のような Ansible のレシピを用意し,ノードの初期化時に自動的に設定してしまうのがお勧めです.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
- name: Setting containerd (enable cgroup, add local registry) lineinfile: path: /etc/containerd/config.toml regexp: '{{item.regexp}}' line: '{{item.line}}' insertafter: '{{item.insertafter}}' with_items: - regexp: 'endpoint = \["http://registry.green-rabbit.net"\]' line: ' endpoint = ["http://registry.green-rabbit.net"]' insertafter: '\[plugins."io.containerd.grpc.v1.cri".registry.mirrors\]' - regexp: '\[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.green-rabbit.net"\]' line: ' [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.green-rabbit.net"]' insertafter: '\[plugins."io.containerd.grpc.v1.cri".registry.mirrors\]' - regexp: 'insecure_skip_verify = true' line: ' insecure_skip_verify = true' insertafter: '\[plugins."io.containerd.grpc.v1.cri".registry.configs\]' - regexp: '\[plugins."io.containerd.grpc.v1.cri".registry.configs."registry.green-rabbit.net".tls\]' line: ' [plugins."io.containerd.grpc.v1.cri".registry.configs."registry.green-rabbit.net".tls]' insertafter: '\[plugins."io.containerd.grpc.v1.cri".registry.configs\]' |
設定が終わったら,下記のコマンドを実行して設定を反映します.
1 |
$ sudo systemctl restart containerd |
あとは,Deployment 等でコンテナイメージを指定する際に,「image: registry.green-rabbit.net/library/test:latest」のようにレジストリホスト名を記載してやれば OK です.
ヒント: latest タグでの運用
本来はイメージの更新のたびにタグを変えるようにして運用すべきですが,自宅用だとタグは「latest」に固定したくなると思います.その場合,イメージを更新されてもそれが Pod に更新されなくなってしまいます.
これを対策するには,次のようにするのがお勧めです.
まず,イメージを指定する際に「imagePullPolicy: Always」を指定するようにします.これにより,Pod が再起動する際にタグに変更がなくても毎回レジストリからイメージを取得するようになります.そのうえで,次のようなコマンドを実行すると,Pod がイメージを更新しながら再起動するようになります.
1 |
% kubectl rollout restart --namespace panel deployment |
上記の例の場合,panel ネームスペース内のすべての deployment が再起動されます.
まとめ
Harbor を使ってプライベートコンテナレジストリを設置する方法を紹介しました.
今回は Harbor を docker-compose で動かしていますが,Kubernetes に慣れてきたら Harbor もクラスタ上で動かしてみたいと思います.
コメント