すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:シークレットを使用せずにContainer Registryインスタンスからイメージをプルする

最終更新日:Dec 14, 2024

Elastic Container Instanceを使用すると、シークレットを使用せずにAlibaba Cloud Container Registryインスタンスからイメージをプルし、イメージプルの効率とセキュリティを向上させることができます。 このトピックでは、シークレットを使用せずにContainer Registryインスタンスからイメージをプルする方法について説明します。

背景情報

Container Registryは、Container Registry Personal EditionインスタンスとContainer Registry Enterprise Editionインスタンスを提供します。 Container Registry Enterprise Editionは、コンテナイメージ、Helmチャート、Open container Initiative (OCI) アーティファクトなど、クラウドネイティブアプリケーションアーティファクトのライフサイクルを管理するために設計されたエンタープライズグレードのプラットフォームです。 大規模なビジネス展開シナリオに適しており、企業が配信の複雑さを軽減するのに役立ちます。 詳細については、「」をご参照ください。Container Registryとは

エラスティックコンテナインスタンスまたはイメージキャッシュを作成するときに、プルするイメージがコンテナレジストリインスタンス内のイメージである場合、シークレットを使用せずにイメージをプルするように設定することで、プロセスを簡素化し、効率を向上させ、シークレットリークのリスクを防ぐことができます。

説明

シークレットを使用せずに、Container Registryインスタンスにないイメージ (Dockerイメージなど) をプルすることはできません。

前提条件

elasticコンテナインスタンスなどのリソースに対して秘密のないイメージプルを設定する前に、次の操作が完了していることを確認してください。

  1. Container Registryインスタンスが作成され、そのインスタンスのイメージリポジトリやイメージなどの関連する設定が完了します。

  2. Container RegistryインスタンスがEnterprise Editionインスタンスの場合、インスタンスへの秘密のないアクセスが設定されます。

    デフォルトでは、新しく作成されたContainer Registry Enterprise Editionインスタンスはすべてのネットワークから切断されます。 インターネットまたは仮想プライベートクラウド (VPC) 経由でインスタンスにアクセスできるように、アクセス制御リスト (ACL) を設定する必要があります。

    • インターネット経由: Enterprise Editionインスタンスのインターネットアクセスを有効にすると、Enterprise Editionインスタンスのパブリックエンドポイントを使用して、さまざまなリージョンでEnterprise Editionインスタンスのイメージにアクセスできます。 詳細については、「インターネットアクセスの有効化」をご参照ください。

    • VPC経由: VPC経由でContainer Enterprise Editionインスタンスにアクセスするには、サービスにリンクされたロールを使用して関連する権限付与を有効にする必要があります。 詳細については、「VPC ACLの設定」をご参照ください。

設定の説明

次の表に、シークレットを使用せずにContainer Registryインスタンスからイメージをプルできるシナリオを示します。

elasticコンテナーインスタンスとcontainer Registryインスタンスなど、作成されるリソースは同じアカウントにあります

Container Registryインスタンスのエディション

秘密のない画像を引き出す

必須

  • パーソナルエディション

  • Enterprise Edition (デフォルトドメイン名を使用)

デフォルトでは、秘密のない画像プルが有効になっています。 秘密のないイメージのプルをサポートするContainer Registryインスタンスの範囲を制限するようにRAMロールを設定できます。

必須

Enterprise Edition (カスタムドメイン名を使用)

シークレットフリーのイメージプルは、デフォルトでは有効にできません。 シークレットのないイメージプルをサポートするContainer Registryインスタンスを指定する必要があります。

選択可能

  • パーソナルエディション

  • Enterprise Edition

シークレットフリーのイメージプルは、デフォルトでは有効にできません。 秘密のないイメージプルを実装するには、RAMロールを設定する必要があります。

アカウントとContainer Registryインスタンスに基づいて、次のいずれかの設定方法を選択します。

シークレットのないイメージプルをサポートするContainer Registryインスタンスの範囲を制限するRAMロールを指定する

エラスティックコンテナインスタンスとcontainer Registryインスタンスなどの作成するリソースが同じAlibaba Cloudアカウントに属し、Container Registryインスタンスがデフォルトのドメイン名を使用するEnterprise EditionインスタンスまたはPersonal Editionインスタンスである場合、Container Registryインスタンスではデフォルトで秘密のないイメージプルが有効になります。 この場合、ビジネス要件に基づいてRAMロールを構成し、シークレットのないイメージのプルをサポートするContainer Registryインスタンスの範囲を制限できます。 たとえば、シークレットのないイメージのプルをサポートするContainer Registryインスタンスを1つだけ指定できます。

説明

デフォルトでは、Elastic Container InstanceはサービスにリンクされたロールAliyunServiceRoleForECIを使用して、Elastic Container Instanceリソースの作成に必要な他のAlibaba Cloudサービスへのアクセスを取得します。 AliyunServiceRoleForECIには、Container Registryインスタンスからイメージをプルする権限があります。 上記のContainer Registryインスタンスには、デフォルトドメイン名を使用するすべてのEnterprise Editionインスタンス、またはElastic Container Instanceリソースと同じAlibaba Cloudアカウント内のすべてのPersonal Editionインスタンスが含まれます。 サービスにリンクされたロールを使用して、きめ細かい権限制御を実装することはできません。

手順:

手順1: RAMロールの作成とRAMロールへの権限付与

  1. 信頼できるAlibaba CloudサービスのRAMロールを作成します。 詳細については、「信頼できるAlibaba CloudサービスのRAMロールの作成」をご参照ください。

    次のパラメータに注意してください。

    • 信頼できるエンティティ: Alibaba Cloudサービスを選択します。

    • ロールタイプ: 通常のサービスロール。

    • RAMロール名: 例: acr-test.

    • 信頼できるサービス: ECIを選択します。

  2. カスタム権限ポリシーを作成します。 詳細については、「カスタムポリシーの作成」をご参照ください。

    次の例は、指定されたContainer Registryインスタンス内のイメージのみをプルできることを示すポリシーの内容を示しています。 ポリシーの記述方法の詳細については、「ポリシー要素」をご参照ください。

    {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "cr:Get*",
                    "cr:List*"
                ],
                "Resource": "*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "cr:Pull*"
                ],
                "Resource": [
                    "acs:cr:cn-hangzhou:1609982529******:instance/cri-nwj395hgf6f3****"
                ]
            }
        ]
    }
  3. カスタムポリシーをRAMロールにアタッチします。 詳細については、「RAMロールへの権限の付与」をご参照ください。

  4. 作成したacr-testロールを見つけます。 ロール名をクリックして詳細ページに移動します。 権限を確認し、RAMロールのAlibaba Cloudリソース名 (ARN) を取得します。

    ACR-RAM0.png

ステップ2: ステップ1で作成したRAMロールを指定してリソースを作成する

Elastic Container Instanceポッドまたはイメージキャッシュを作成するときに、k8s.aliyun.com/acr-service-arnsアノテーションを追加して、リソースの作成に使用するRAMロールを指定できます。

次のYAMLファイルは、アノテーションを追加してポッドを作成する方法を示しています。

重要
  • ポッドの構成ファイルのメタデータに注釈を追加する必要があります。 たとえば、配置を作成するときは、spec.template.metadataセクションに注釈を追加する必要があります。

  • Elastic Container Instanceの機能を使用するには、Elastic Container Instanceベースのポッドを作成する場合にのみアノテーションを追加できます。 ポッドを更新するときにアノテーションを追加または変更しても、これらのアノテーションは有効になりません。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
  labels:
    app: test
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      name: nginx-test
      labels:
        app: nginx
        alibabacloud.com/eci: "true" 
      annotations:                  
        k8s.aliyun.com/acr-service-arns: "acs:ram::1609982529******:role/acr-test" # Specifies the RAM role that is used to create the resource.
    spec:
      containers:
      - name: nginx
        image: test****-registry.cn-hangzhou.cr.aliyuncs.com/eci_test/nginx:1.0   # Specifies an image in a Container Registry instance from which the RAM role is allowed to pull images.
        ports:
        - containerPort: 80

シークレットのないイメージプルをサポートするContainer Registry Enterprise Editionインスタンスの指定

Container Registry Enterprise Editionインスタンスと作成するポッドが同じAlibaba Cloudアカウントに属し、Enterprise Editionインスタンスがカスタムドメイン名を使用している場合は、シークレットのないイメージプルをサポートするEnterprise Editionインスタンスを指定する必要があります。 Enterprise Editionインスタンスを指定するには、k8s.aliyun.com/acr-instance-idsアノテーションを追加して、Enterprise EditionインスタンスのIDを指定します。

説明

Container Registry Enterprise Editionインスタンスは、複数のリージョンで使用できます。 ポッドのリージョンとは異なるリージョンにあるEnterprise Editionインスタンスを指定できます。 この場合、リージョンIDのプレフィックスにEnterprise EditionインスタンスのIDを付ける必要があります。 例: cn-beijing:cri-j36zhodptmyq ****

ポッドの作成

ポッドを作成するときに、k8s.aliyun.com/acr-instance-ids注釈をポッドのメタデータセクションに追加して、Container Registryインスタンスを指定できます。

重要
  • ポッドの構成ファイルのメタデータに注釈を追加する必要があります。 たとえば、配置を作成するときは、spec.template.metadataセクションに注釈を追加する必要があります。

  • Elastic Container Instanceの機能を使用するには、Elastic Container Instanceベースのポッドを作成する場合にのみアノテーションを追加できます。 ポッドを更新するときにアノテーションを追加または変更しても、これらのアノテーションは有効になりません。

例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
  labels:
    app: test
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      name: nginx-test
      labels:
        app: nginx
        alibabacloud.com/eci: "true" 
      annotations:
        k8s.aliyun.com/acr-instance-ids: "cri-j36zhodptmyq****"      # Specifies IDs of Container Registry instances.
    spec:
      containers:
      - name: nginx
        image: test****-registry.example.com/eci_test/nginx:1.0   # Specifies an image in a Container Registry Enterprise Edition instance that uses a custom domain name.
        ports:
        - containerPort: 80

イメージキャッシュの作成

イメージキャッシュを作成するときに、イメージキャッシュのメタデータセクションにk8s.aliyun.com/acr-instance-idsアノテーションを追加して、Container Registryインスタンスを指定できます。 例:

apiVersion: eci.alibabacloud.com/v1
kind: ImageCache
メタデータ:
  名前: imagecache-sample
  アノテーション:
    k8s.aliyun.com/acr-instance-ids: "cri-j36zhodptmyq ****"# Container RegistryインスタンスのIDを指定します。
仕様:
  画像: 
  -test **** -registry.example.com/eci_test/nginx:1.0# カスタムドメイン名を使用するContainer Registry Enterprise Editionインスタンスのイメージを指定します。
  imagePullSecrets:
  -デフォルト: secret1
  -default:secret2
  -kube-system:secret3
  imageCacheSize:
   25
  retentionDays:
   7 

RAMロールに権限を付与してアカウント間でイメージプルを構成する

Container Registryインスタンスと作成するポッドが異なるAlibaba Cloudアカウントに属している場合、2つのアカウントにRAMロールを設定し、シークレットなしのイメージプルを実装するためにRAMロールに権限を付与する必要があります。

手順:

手順1: RAMロールの作成とRAMロールへの権限付与

  1. エラスティックコンテナインスタンスなど、作成するリソースが属するアカウントaにRAMロールを作成し、そのRAMロールに権限を付与します。

    1. 信頼できるAlibaba CloudサービスのRAMロールを作成します。 詳細については、「信頼できるAlibaba CloudサービスのRAMロールの作成」をご参照ください。

      次のパラメータに注意してください。

      • 信頼できるエンティティ: Alibaba Cloudサービスを選択します。

      • ロールタイプ: 通常のサービスロール。

      • RAMロール名: example: Role-assume.

      • 信頼できるサービス: ECIを選択します。

    2. role-assumeロールに、Security Token Service (STS) のAssumeRole APIを呼び出す権限を付与します。 詳細については、RAMロールへの権限の付与トピックの「方法2: ロールページの入力とアタッチをクリックしてRAMロールに権限を付与する」セクションを参照してください。

      ポリシータイプをシステムポリシーに設定し、ポリシー名をAliyunSTSAssumeRoleAccessに設定します。

    3. 作成したrole-assumeロールを見つけます。 ロール名をクリックして詳細ページに移動します。 権限と信頼ポリシーを確認し、role-assumeのARNを取得します。

      • 権限とARN

        免密拉取ACR-RAM1.png

      • 信頼ポリシー

        免密拉取ACR-RAM2.png

  2. Container Registryインスタンスが属するアカウントBにRAMロールを作成し、RAMロールに権限を付与します。

    1. 信頼できるAlibaba CloudアカウントのRAMロールを作成します。 詳細については、「信頼できるAlibaba CloudアカウントのRAMロールの作成」をご参照ください。

      次のパラメータに注意してください。

      • 信頼できるエンティティ: Alibaba Cloudアカウントを選択します。

      • RAMロール名: 例: Role-acr.

      • 信頼できるAlibaba Cloudアカウント: その他のAlibaba Cloudアカウントを選択します。 エラスティックコンテナインスタンスなど、作成するリソースが属するアカウントAを入力します。

    2. role-acrロールに、Container Registryインスタンスからイメージをプルする権限を付与します。 詳細については、RAMロールへの権限の付与トピックの「方法2: ロールページの入力とアタッチをクリックしてRAMロールに権限を付与する」セクションを参照してください。

      ポリシータイプをシステムポリシーに設定し、ポリシー名をAliyunContainerRegistryFullAccessに設定します。

    3. role-assumeによってrole-acrが信頼されるように、信頼ポリシーを編集します。 詳細については、「RAMロールの信頼ポリシーの編集」をご参照ください。

      デフォルトでは、role-acrロールはアカウントAのすべてのRAMユーザーとRAMロールが引き受けることができます。信頼ポリシーを編集して、アカウントAの必要なRAMユーザーとRAMロールにのみ権限を付与することを推奨します。

      Principal要素で、RAMフィールドの値をrole-assumeのARNに変更します。 これは、role-acrロールはrole-assumeによってのみ引き受けることができることを示しています。 例:

      "Principal": {
      	"RAM": [
      		"acs:ram::1609982529******:role/role-assume"
      	]
      }
    4. 権限と信頼ポリシーを確認し、role-acrのARNを取得します。

      • 権限とARN

        免密拉取ACR-RAM3.png

      • 信頼ポリシー

        免密拉取ACR-RAM4.png

ステップ2: ステップ1で作成したRAMロールを指定してリソースを作成する

ポッドまたはイメージキャッシュを作成するときに、アノテーションを追加して、イメージをプルするために作成するリソースのアカウントとは異なるAlibaba CloudアカウントにContainer Registryインスタンスを指定できます。 以下の点にご注意ください。

  • Container Registryインスタンスと作成するリソースが異なるAlibaba Cloudアカウントに属している場合、権限設定のRAMロールを指定するために、k8s.aliyun.com/acr-service-arnsk8s.aliyun.com/acr-user-arnsの注釈を追加する必要があります。

    • Elastic Container Instanceリソースが属するAlibaba CloudアカウントのRAMロールのAlibaba Cloudリソース名 (ARN) を指定します。

    • k8s.aliyun.com/acr-user-arns: Container Registryインスタンスが属するAlibaba CloudアカウントのRAMロールのARNを指定します。

  • Container Registryインスタンスがカスタムドメイン名を使用するEnterprise Editionインスタンスの場合、Container Registryインスタンスを指定するためにk8s.aliyun.com/acr-instance-ids注釈を追加する必要があります。

    説明

    Container Registry Enterprise Editionインスタンスは、複数のリージョンで使用できます。 ポッドのリージョンとは異なるリージョンにあるEnterprise Editionインスタンスを指定できます。 この場合、リージョンIDのプレフィックスにEnterprise EditionインスタンスのIDを付ける必要があります。 例: cn-beijing:cri-j36zhodptmyq ****

ポッドの作成

ポッドを作成するときに、ポッドのメタデータセクションに次の注釈を追加して、別のAlibaba CloudアカウントのContainer Registryインスタンスを指定できます。

annotations:
    k8s.aliyun.com/acr-instance-ids: "cri-j36zhodptmyq****" 
    k8s.aliyun.com/acr-service-arns: "acs:ram::1609982529******:role/role-assume"
    k8s.aliyun.com/acr-user-arns: "acs:ram::1298452580******:role/role-acr"
重要
  • ポッドの構成ファイルのメタデータに注釈を追加する必要があります。 たとえば、配置を作成するときは、spec.template.metadataセクションに注釈を追加する必要があります。

  • Elastic Container Instanceの機能を使用するには、Elastic Container Instanceベースのポッドを作成する場合にのみアノテーションを追加できます。 ポッドを更新するときにアノテーションを追加または変更しても、これらのアノテーションは有効になりません。

サンプルYAMLファイル。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
  labels:
    app: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      name: nginx-test
      labels:
        app: nginx
        alibabacloud.com/eci: "true" 
      annotations:
        k8s.aliyun.com/acr-instance-ids: "cri-j36zhodptmyq****"                        
        k8s.aliyun.com/acr-service-arns: "acs:ram::1609982529******:role/role-assume"
        k8s.aliyun.com/acr-user-arns: "acs:ram::1298452580******:role/role-acr"
    spec:
      containers:
      - name: nginx
        image: test****-registry.example.com/eci_test/nginx:1.0   # Specifies an image in a Container Registry Enterprise Edition instance that uses a custom domain name.
        ports:
        - containerPort: 80

イメージキャッシュの作成

イメージキャッシュを作成するときに、イメージキャッシュのメタデータセクションに次の注釈を追加して、別のAlibaba CloudアカウントのContainer Registryインスタンスを指定できます。

注釈:
    k8s.aliyun.com/acr-instance-ids: 「cri-j36zhodptmyq **** 」
    k8s.aliyun.com/acr-service-arns: "acs:ram::1609982529 ******:role/role-assume"
    k8s.aliyun.com/acr-user-arns: "acs:ram::1298452580 ******:role/role-acr" 

サンプルYAMLファイル。

apiVersion: eci.alibabacloud.com/v1
kind: ImageCache
メタデータ:
  名前: imagecache-sample
  アノテーション:
    k8s.aliyun.com/acr-instance-ids: 「cri-j36zhodptmyq **** 」
    k8s.aliyun.com/acr-service-arns: "acs:ram::1609982529 ******:role/role-assume"
    k8s.aliyun.com/acr-user-arns: "acs:ram::1298452580 ******:role/role-acr"
spec:
  画像: 
  -test **** -registry.example.com/eci_test/nginx:1.0# カスタムドメイン名を使用するContainer Registry Enterprise Editionインスタンスのイメージを指定します。
  imagePullSecrets:
  -デフォルト: secret1
  -default:secret2
  -kube-system:secret3
  imageCacheSize:
   25
  retentionDays:
   7