はじめまして、事業推進本部SE部の横田です。 普段はセールスエンジニアとしてIDCフロンティア サービスのご提案や導入支援などを行っています。
今回は「IDCFクラウド コンテナ」環境内に、カタログ(Helm Chart)を利用したプライベートレジストリ構築についてご紹介したいと思います。
背景と目的
コンテナイメージの保管場所としてDocker Hubなど、クラウドサービスを利用されるのが一般的です。
一方で以下のように会社のポリシーや実際の使い方によりプライベートレジストリを求める場合もあります。
- 国外クラウドにコンテナイメージを保管できない
- デプロイ時に多量のトラフィックが発生する
- コンテナイメージのサイズが大きい
- ノード数が多い場合、デプロイ数が多くなる
- コンテナ学習用にプライベート環境を自由度の高い環境で利用したい
上記のような場合にも「IDCFクラウド コンテナ」サービスでは、簡単にプライベートレジストリを作成することが可能となっています。
前提条件
「IDCFクラウド コンテナ」で作成した kubernetes クラスタでは、レジストリ参照のデフォルトプロトコルはHTTPSです。
そのため作成するプライベートレジストリへはHTTPSで接続を行えるようにする必要があります。
今回はインフィニットLBをイングレスとしてSSL終端を行います。*1
また、以下の条件を満たしている物とします
- クラスタは作成済み
- 自由に検証できる独自ドメインがある
- SSL証明書を取得している *2
- docker が利用できる環境
本稿の画像イメージでは所々にモザイクが入っていますが、そこには独自ドメインを設定しています。
構成イメージ
今回の構成イメージはこのような形です
docker-registry の起動
カタログの追加
プライベートレジストリを構築するクラスタを開き、「ツール」-「カタログ」を開きます。
新たに「カタログの追加」を行います。
名前:任意の名前
URL:https://git.rancher.io/charts
を入力し「作成」をクリックします。
docker-registry の起動
次に追加したカタログから docker-registry を起動します。
クラスタから docker-registry を構築したい名前空間を指定します。
画面上部の「Apps」-「起動」を開きます。
作成したカタログ名のブロックから「docker-registry」を選択します。
docker-registry に認証設定を行います。
認証設定を行わない場合、URLを知っていれば誰にでもアクセス可能となります。
今回、認証設定に必要な htpasswd の生成については以下の docker を利用して生成します。
# docker run --entrypoint htpasswd registry:2.7.0 -Bbn USER PASSWORD
docker-registry が Active になったことを確認します。
イングレスの作成準備
インフィニットLBを利用してイングレスを作成する手順は以下のとおりです。
IDCFクラウド コンテナで設定する項目
- SSL証明書の登録
インフィニットLBで設定する項目
- SSLポリシー
- Firewallグループ ※任意設定。今回は設定しません
SSL証明書のアップロード
「リソース」-「シークレット」を開き、「証明書を追加」を開きます。
名前:任意の名称
プライベートキー:暗号鍵
証明書:証明書情報 & 中間証明書
を入力し「保存」します。
注意:証明書情報には中間証明書の情報も併せて登録します。
SSLポリシーの作成
次に「SSLポリシー」を作成します。
クラウドコンソールから「ILB」を開き、「SSLポリシー」-「SSLポリシー作成」を開きます。
ポリシー名:任意の名称
アルゴリズム:利用する暗号スイートを選択
「作成する」を開きます。
作成したSSLポリシーを開きます。
SSLポリシーID が表示されるので、こちらをコピーしておきます。
(SSLポリシーID はイングレス作成時にアノテーションで指定を行う際に必要となります)
イングレス作成
プライベートレジストリを構築したい名前空間(ここではDefaultで作成します)のワークロードを開きます。
ワークロードが開いたら「ロードバランサー」を選択し、「イングレスを追加」を開きます。
名前:任意の名称
名前空間:docker-registry を作成した名前空間を指定
リクエストホスト:アクセスするドメイン名
ターゲットには、既定で「ワークロード」が選択された状態になるため「-」をクリックし、行を削除します。
ターゲットバックエンドから「サービス」を選択し、ターゲットにサービスを選択できる状態にします。
※インフィニットLBがワークロードに対応していないため、サービスで指定する必要があります。
ターゲットに docker-registry を作成した名前空間を選択します。
ポートは自動的にアサインされるため、ここでは特に変更しません。
「SSL/TLS 証明書」を展開し、証明書追加を選択します。
「証明書を選択」を選択し、先ほど登録したSSL証明書を選択します。
「ホスト」にはSSL証明書のドメイン名を入力します。
ラベル & アノテーション から「アノテーションを追加」します。
アノテーションキー:ilb.idcfcloud.com/sslpolicy-id
値:先ほど調べたSSLポリシーID
を入力し、最後に「保存」します
イングレスが作成されました。
アクセスドメインのDNS設定
プライベートレジストリにDNS設定を行います。
クラウドコンソールを開き、ILBから先ほど作成されたインフィニットLBを確認、FQDNをコピーします。
DNS設定でCNAMEを選択し、値には前項でコピーしたFQDNを張り付け「登録する」をクリックします。
※IDCFクラウドDNSで設定した場合のイメージ図となります。
※下図では元々設定があり、変更を掛けているため「変更する」となっています。
レジストリ認証設定
「IDCFクラウド コンテナ」から、「リソース」-「シークレット」を開きます。
「レジストリ認証」から「レジストリ追加」を選択します。
名前:任意の名称
アドレス:カスタム(アクセスするドメイン名を入力します)
ユーザー名:ベーシック認証 生成時のユーザー名 *3
パスワード:ベーシック認証 生成時のパスワード *4
プライベートレジストリへのアクセス
プライベートレジストリにアクセスする準備が整いました。
それでは実際にコンテナイメージをプライベートレジストリに Push したり、ワークロードにデプロイを行っていきます。
コンテナイメージの準備
適当に nginx のコンテナイメージを pull してきます。
適当な名前で起動させます。
テスト用のHTMLファイルをコンテナイメージに配置します。
変更されたコンテナイメージをコミットします。
コミット時にはレジストリも含めてコミットします。
プライベートレジストリにログイン
手元の docker 環境からプライベートレジストリにログインします。
プライベートレジストリにコンテナイメージを push します。
プライベートレジストリからデプロイ
IDCFクラウド コンテナ に戻り、ワークロードから「デプロイ」します。
名前:任意の名称
Docker イメージ:プライベートレジストリに Push したコンテナイメージを指定
ポートマッピング:下図を参考に入力
最後に「起動」します。
無事デプロイが完了しました。
デプロイされた結果確認のため「80/TCP」を開きます。
テスト用に作成されたページが表示されていることを確認します。
最後に
「IDCFクラウド コンテナ」で作る、プライベートレジストリでした。
本来の目的であればデプロイ時には内部通信で完結させたい所ですが、今回はインフィニットLBを活用した形となります。
次回は NGINX イングレスを利用した内部通信で完結させる方法などをご紹介したいと思います。