自宅用プライベートコンテナレジストリの設置

サーバー
スポンサーリンク

自宅クラウド用にコンテナレジストリを設置しました.

スポンサーリンク

はじめに

自宅に Kubernetes 環境を構築すると,そこで動かすコンテナイメージを格納しておくレジストリが必要になります.Docker Hub とかのサービスを利用することもできるのですが,下記の観点から自宅に構築することにしました.

  • コンテナイメージの中に何らかのパスワードとかが入ってしまっても大事にならないようにしたい
  • イメージサイズが数百 MB 程度のサイズになっても,ストレスなく使いたい

コンテナレジストリの選択肢

このような用途に合ったソリューションを調べたところ,現状では次の2つの選択肢があることが分かりました.

  • Docker registry
  • Harbor

名前になじんでいることから最初 Docker registry を選択してみたのですが,Web インターフェースがなく,とっつきにかったので,早々に Harbor に移行しました.

というわけで,以降では docker-compose を使って Harbor を動かす方法を紹介します.

Harbor のインストール

Web を検索すると既に古くなった煩雑な手順が色々出てきますが,現時点では基本的には下記の手順に従えば OK です.

準備としては設定ファイル1個を編集するだけなのでとてもお手軽です.

Harbor – Harbor Installation and Configuration

まず,インストール用のファイルを取得し,設定ファイルのひな型を用意します.

編集するのは,次の2項目です.

ホスト名の指定
Harbor をインストールするサーバのホスト名に変更します.
HTTPS の無効化
自宅クラウドの場合,HTTPS を使うのは煩雑なので,無効化します.

具体的な編集内容は下記のとおりです.「registry.green-rabbit.net」は手元の環境のものに置き換えてください(以降同様).

必要に応じてデータの置き場所である data_volume も変更します.

編集が終わったら,次のコマンドを実行すればインストール完了です.

「hostname」で指定したアドレスにアクセスすると,Web インターフェースが表示されると思います.上記の設定ファイルで編集してなければ,ユーザ: admin,パスワード: Harbor12345 でログインできると思います.

Harbor へのコンテナイメージの登録

構築した Harbor では HTTPS ではなく,HTTP を使うようにしているので,Docker の設定が必要になります.

具体的には /etc/docker/daemon.json に対して次の設定が必要になります.ファイルがない場合は作成します.

修正が終わったら,下記のコマンドを実行して設定を反映します.

あとは,次のコマンドでログイン設定を行い,

次のようなスクリプトを実行すれば,レジストリにイメージを登録できると思います.

Harbor にアクセスすると,下図のように登録されたイメージが確認できます.

ここまで手順を Ansible レシピにしたものを下記に置いています.

server_init/main.yml at main · kimata/server_init
Contribute to kimata/server_init development by creating an account on GitHub.

登録したイメージの使用

HTTP を使うので,Docker と同様に containerd に対しても2点の設定が必要になります.

認証の無効化
TLS の認証を無効化するため,「insecure_skip_verify = true」を指定します.
HTTP の指定
ローカルのレジストリホストの場合は HTTP でアクセスさせるため,「endpoint = [“http://registry.green-rabbit.net”]」を指定します.

具体的には /etc/containerd/config.toml に対して次のように追記を行います.

この設定は,Harbor にアクセスすることになるすべてのサーバーで必要になります.したがって,以下のような Ansible のレシピを用意し,ノードの初期化時に自動的に設定してしまうのがお勧めです.

設定が終わったら,下記のコマンドを実行して設定を反映します.

あとは,Deployment 等でコンテナイメージを指定する際に,「image: registry.green-rabbit.net/library/test:latest」のようにレジストリホスト名を記載してやれば OK です.

ヒント: latest タグでの運用

本来はイメージの更新のたびにタグを変えるようにして運用すべきですが,自宅用だとタグは「latest」に固定したくなると思います.その場合,イメージを更新されてもそれが Pod に更新されなくなってしまいます.

これを対策するには,次のようにするのがお勧めです.

まず,イメージを指定する際に「imagePullPolicy: Always」を指定するようにします.これにより,Pod が再起動する際にタグに変更がなくても毎回レジストリからイメージを取得するようになります.そのうえで,次のようなコマンドを実行すると,Pod がイメージを更新しながら再起動するようになります.

上記の例の場合,panel ネームスペース内のすべての deployment が再起動されます.

まとめ

Harbor を使ってプライベートコンテナレジストリを設置する方法を紹介しました.

今回は Harbor を docker-compose で動かしていますが,Kubernetes に慣れてきたら Harbor もクラスタ上で動かしてみたいと思います.

コメント