自宅クラウド用にコンテナレジストリを設置しました.
はじめに
自宅に 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 もクラスタ上で動かしてみたいと思います.
  
  
  
  


コメント