このトピックでは、image-syncer を使用して、自作 Harbor から Container Registry Enterprise Edition にイメージを同期する方法について説明します。

始める前に

  • Container Registry サービスが有効である必要があります。

    Container Registry コンソールにログインし、 Container Registry サービスを有効化します。

  • Container Registry Enterprise Edition インスタンスが作成されます。

このタスクについて

Container Registry Enterprise Edition は、コンテナイメージと Helm グラフを管理するためのエンタープライズクラスの安全なサービスを提供します。 エンタープライズクラスのセキュリティ機能を提供し、最大 1,000 ノードまで同時にイメージを配信し、世界中のリージョン間でイメージを同期できます。 また、クラウドネイティブのアプリケーション配信チェーンを作成して、複数のシナリオでソースコードが変更されたときに自動的にイメージをグローバルに配信することもできます。 Container Registry Enterprise Edition は、セキュリティ要件が高く、複数のリージョンにサービスを展開中で、多数のノードを持つコンテナークラスターを使用する法人向けに設計されています。
Container Registry Enterprise Edition は現在公開プレビュー中です。 使用をご希望の場合は、チケットを起票してサポートセンターにお問い合わせください。

名前空間の作成

名前空間を使用すると、リポジトリのアクセス権限やリポジトリの属性など、リポジトリのコレクションを効果的にに管理できます。 名前空間用の [リポジトリの自動作成] を有効にできます。 docker push コマンドを実行して、名前空間に存在しないリポジトリにイメージをプッシュすると、リポジトリが自動的に作成されます。
docker pushコマンドを使用して作成された対象のリポジトリは、名前空間のデフォルトリポジトリタイプの設定に基づいて、パブリックまたはプライベートにすることができます。
  1. Container Registry コンソールにログインします。
  2. 左側のナビゲーションウィンドウで、[デフォルトインスタンス] > [名前空間]の順に選択します。
  3. 名前空間ページで、右上隅にある[名前空間の作成]をクリックします。
  4. 名前空間の作成ダイアログボックスで名前空間をカスタマイズし、[確定] をクリックします。
名前空間が作成された後、 名前空間ページに表示されます。 [名前空間] ページで名前空間を管理することもできます。
[リポジトリの自動作成] をオンにする必要があります。

RAM ユーザーへの権限付与

Resource Access Management (RAM) ユーザーとして後続の操作を実行する場合、RAM ユーザーを作成し、RAM ユーザーにアクセス権限を付与する必要があります。 Alibaba Cloud アカウントを使用して後続の操作を実行する場合は、このセクションをスキップしてください。

  1. RAM ユーザーを作成します。 詳細については、「RAM ユーザーとしての Container Service コンソールの使用」をご参照ください。
  2. RAM ユーザーにアクセス権限を付与します。 詳細については、「カスタム権限ポリシーの作成」をご参照ください。
    この例では、RAM ユーザーに作成、更新、プッシュ、およびプルの権限のみを付与し、アクセス可能なリソースを image-syncer 名前空間に設定します。
    {
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "cr:CreateRepository",
                    "cr:UpdateRepository",
                    "cr:PushRepository",
                    "cr:PullRepository"
                ],
                "Resource": [
                    "acs:cr:*:*:repository/image-syncer/*"
                ]
            }
        ],
        "Version": "1"
    }

パブリックネットワークへのアクセスの設定

デフォルトでは、Container Registry Enterprise Edition インスタンスはパブリックネットワークにアクセスできません。 したがって、パブリックネットワークのアクセス制御ポリシーを設定する前に、パブリックネットワークへのアクセスを有効にする必要があります。

  1. Container Registry コンソールにログインします。 上部ナビゲーションバーで、対象のリージョンを選択します。
  2. 左側のナビゲーションウィンドウで、[エンタープライズインスタンス] > [インスタンス] の順にクリックします。
  3. [インスタンス] ページで、設定する Container Registry Enterprise Edition インスタンスをクリックします。
  4. 左側ナビゲーションウィンドウで [リポジトリ] > [アクセス制御] の順にクリックします。
    Helm グラフのアクセス制御を設定したい場合、 [Helm Char] > [アクセス制御]を選択します。
  5. [インターネット] のタブで、[インターネットホワイトリストの追加] をクリックします。
  6. [インターネットホワイトリストの追加] ダイアログボックスで、Container Registry Enterprise Edition インスタンスとその説明へのアクセスが許可されている Classless Inter-Domain Routing (CIDR) ブロックを入力します。
  7. [OK] をクリックします。
    CIDR ブロックが追加された後、CIDR ブロック内の Elastic Compute Service (ECS) インスタンスは Container Registry Enterprise Edition インスタンスにアクセスできます。
    重要 パブリックネットワーク上のすべての ECS インスタンスが Container Registry Enterprise Edition インスタンスにアクセスできるようにする場合は、パブリックネットワークへのアクセスを有効にし、ホワイトリストからすべてのアイテムを削除します。 これを行うと、Container Registry Enterprise Edition インスタンスがパブリックネットワークに完全に公開され、攻撃される可能性があります。 慎重に操作を実行する必要があります。

アクセス資格情報の設定

プライベートイメージをプルするか、イメージをアップロードする前に、docker login コマンドを実行して、アクセス資格情報を使用してレジストリにログインする必要があります。 以下の手順に従って、アクセス資格情報を設定します。

  1. 左側ナビゲーションウィンドウで、[デフォルトインスタンス] > [アクセス資格情報]をクリックします。
  2. アクセス資格情報ページで [パスワードの設定] をクリックします。
  3. [パスワードの設定] ダイアログボックスで [パスワード][パスワードの確認] を設定し、[OK] をクリックします。

image-syncer の設定

アクセス資格情報のパスワードを使用して、image-syncer を設定します。

Container Registry Default Instance Edition とは異なり、各 Container Registry Enterprise Edition インスタンスには独自のエンドポイントと名前空間があります。 異なる Container Registry Enterprise Edition インスタンスの名前空間は、互いに分離されています。
各 Container Registry Enterprise Edition インスタンスには、パブリックネットワーク用と仮想プライベートクラウド (VPC) 用の 2 つのエンドポイントがあります。
  • image-syncer がパブリックネットワーク上のサーバーで実行されている場合、パブリックネットワークのエンドポイントを使用して Container Registry Enterprise Edition インスタンスにアクセスする必要があります。
  • image-syncer が VPC の ECS インスタンスで実行されている場合、VPC のエンドポイントを使用して Container Registry Enterprise Edition インスタンスにアクセスする必要があります。 さらに、ECS インスタンスが存在する VPC から見えるようにエンドポイントを設定する必要があります。
この例では、自作 Harbor レジストリの library/nginx リポジトリ内のイメージを Container Registry Enterprise Edition インスタンスの image-syncer 名前空間に同期します。 同期元リポジトリの名前 (nginx) は、同期先リポジトリの名前として使用されます。 設定ファイルは次のとおりです。
{
    "auth": {
        "harbor.myk8s.paas.com:32080": {
            "username": "admin",
            "password": "xxxxxxxxx",
            "insecure": true
        },
        "ruohe-test-registry.cn-shanghai.cr.aliyuncs.com": {
            "username": "ruohehhy",
            "password": "xxxxxxxx"
        }
    },
    "images": {
        "harbor.myk8s.paas.com:32080/library/nginx": ""
    }
}
  • harbor.myk8s.paas.com:32080: 自作 Harbor レジストリのエンドポイント。 実際の値に置き換える必要があります。
    • username : 自作 Harbor レジストリのユーザー名。 この例では、値は admin です。
    • password: 自作 Harbor レジストリのパスワード。
    • insecure: このパラメーターを true に設定します。
  • ruohe-test-registry.cn-shanghai.cr.aliyuncs.com: パブリックネットワークの Container Registry Enterprise Edition インスタンスのエンドポイント。
    • username : アクセス資格情報のユーザー名。
    • password: アクセス資格情報のパスワード。
  • "harbor.myk8s.paas.com:32080/library/nginx": "": harbour.myk8s.paas.com:32080 にある library/nginx リポジトリにアクセスします。

image-syncer を使用したイメージ同期

  1. image-syncer の最新のインストールパッケージをダウンロードします。
    現在、Linux AMD64 バージョンのみがサポートされています。
  2. image-syncer をインストールして設定します。
    詳細については、 GitHub のガイドラインをご参照ください。
  3. 次のコマンドを実行し、イメージを同期します。
    #デフォルトの同期先レジストリを registry.cn-beijing.aliyuncs.com に設定し、デフォルトの同期先名前空間を image-syncer に設定します。
    #同時に同期できるイメージの数と最大再試行回数の両方を 10 に設定します。
    #./log ファイルにログを記録します。 ファイルが存在しない場合は自動的に作成されます。 ログファイルが指定されていない場合、image-syncer はデフォルトで Stderr にログを表示します。
    #設定ファイルとして harbor-to-acr.json を指定します。 その内容は前途のセクションで説明のとおりです。
    ./image-syncer --proc=10 --config=./harbor-to-acr.json --registry=registry.cn-beijing.aliyuncs.com --namespace=image-syncer --retries=10 --log=./log

同期結果

イメージを同期するとき、image-syncer は同期タスクを生成し、同期タスクを実行し、失敗したタスクを再試行します。 失敗したタスクには、実行に失敗した同期タスクと、生成に失敗した同期タスクが含まれます。 各同期タスクは、指定されたタグでイメージを同期します。 設定ファイルのイメージ同期ルールでタグが指定されていない場合、image-syncer は元のタグをすべて保持することにより、このルールに基づいて同期タスクを生成します。

  • イメージが正常に同期されると、次の図に示すメッセージが表示されます。成功結果
  • たとえば、ユーザー名またはパスワードが正しくないためにイメージの同期に失敗すると、次の図に示すメッセージが表示されます。失敗結果
  • 次の図に示すように、実行中に image-syncer はログ情報を表示します。ログ情報