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

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

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

スポンサーリンク

はじめに

自宅に 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 レシピにしたものを下記に置いています.

Build software better, together
GitHub is where people build software. More than 100 million people use GitHub to discover, fork, and contribute to over 330 million projects.

登録したイメージの使用

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 もクラスタ上で動かしてみたいと思います.

コメント