Container Service for Kubernetes (ACK) クラスターと ACR Enterprise Edition インスタンスが異なる Alibaba Cloud アカウントによって管理されている場合、ネットワーク接続を確立し、クラスターがコンテナイメージをプルしてワークロードをデプロイできるように権限を付与する必要があります。本トピックでは、aliyun-acr-credential-helper パスワードレスコンポーネントを使用して、アカウント間でイメージをプルする方法について説明します。
選定戦略
ビジネス要件に最も適したネットワーク接続方法およびアカウント権限付与方法を選択してください。その後、選択した権限付与方法をサポートするパスワードレスコンポーネントを選択します。
詳細な手順については、「ネットワーク接続の構成」および「アカウント権限付与およびパスワードレスコンポーネントの構成」をご参照ください。その後、「クロスアカウントイメージプルの検証」を実行します。
本トピックにおける「クロスアカウント」とは、異なる Alibaba Cloud アカウント (root ユーザー) 間を指し、RAM ユーザー (サブアカウント) 間ではありません。
前提条件
-
パスワードレスコンポーネント用の RAM ロールに必要な権限が付与されています。
-
パスワードレスコンポーネントをサポートする ACK クラスターが利用可能です。
-
aliyun-acr-credential-helper (マネージド)
ACK マネージドクラスター、ACK サーバーレスクラスター、および ACK Edge クラスター(Kubernetes 1.22 以降)
-
aliyun-acr-credential-helper (セルフマネージド)
ACK マネージドクラスター および ACK 専用クラスター(Kubernetes 1.20 以降)
-
-
ACR Enterprise Edition インスタンスが利用可能です。
重要-
パスワードレスコンポーネントは、ACR Enterprise Edition インスタンスおよび 2024 年 9 月 8 日以前に作成された Personal Edition インスタンスのみをサポートします。パスワードレスコンポーネントが使用できない場合は、「imagePullSecrets の使用方法」をご参照ください。
-
操作手順
ステップ 1:ネットワーク接続の構成
アカウント間でイメージをプルする際、イメージをプルする ACK クラスターとイメージを格納する ACR Enterprise Edition インスタンスは、それぞれ別の Alibaba Cloud アカウント配下の異なる VPC に存在し、さらに異なるリージョンにある場合もあります。イメージをプルする前に、ネットワーク接続を確立し、必要なドメイン名が名前解決可能であることを確認する必要があります。以下のいずれかの方法を使用できます。
-
パブリックネットワーク接続:ACR Enterprise Edition インスタンスにパブリックエンドポイントを構成し、ACK クラスターのパブリックネットワークアクセスを有効化します。これにより、イメージはパブリックネットワーク経由で転送されます。ただし、この方法はセキュリティレベルが低く、EIP およびネットワークトラフィックに対して課金が発生します。
-
VPC ピアリング接続:VPC ピアリング接続を使用して 2 つの VPC を接続し、ACK クラスターが ACR Enterprise Edition インスタンスにアクセスできるようにします。このサービスは、VPC が同一リージョン内にある場合は無料ですが、異なるリージョンにある場合は課金が発生します。ただし、2 つの VPC の CIDR ブロックは重複してはなりません。VPC の CIDR ブロックに大きな重複がある場合は、既存のネットワークアーキテクチャを変更する必要があります。
-
Cloud Enterprise Network 接続:Cloud Enterprise Network インスタンスには 1 つ以上のトランジットルーターを含めることができます。リージョン間接続を使用して複数のトランジットルーターを接続することで、リージョン間およびアカウント間の VPC 通信を有効化できます。
VPC ピアリング接続と Cloud Enterprise Network の比較については、「Cloud Enterprise Network と VPC ピアリング接続の違い
|
項目 |
パブリックネットワーク接続 |
VPC ピアリング接続 |
Cloud Enterprise Network |
|
ネットワークタイプ |
パブリックネットワーク |
プライベートネットワーク |
プライベートネットワーク |
|
課金 |
EIP の課金に基づいて課金が発生します。 |
|
Cloud Enterprise Network の課金ルールに基づいて課金が発生します。 |
|
主な特徴 |
既存のネットワークアーキテクチャを変更する必要はありません。セキュリティのために、インバウンドおよびアウトバウンドルール、アクセス制御ポリシーを構成する必要があります。 |
|
|
|
構成手順 |
|
|
|
ステップ 2:権限付与およびパスワードレスコンポーネントの構成
以下の 3 つの権限付与方法により、アカウント間でパスワードレスイメージプルが可能になります。要件に最も適した方法を選択してください。
|
項目 |
RRSA |
Worker RAM ロール |
RAM ユーザー AccessKey |
|
サポートされるクラスタータイプ |
ACK Basic マネージドクラスター、ACK Pro マネージドクラスター、ACK Edge クラスター、および ACK Serverless Pro クラスター(Kubernetes 1.22 以降)をサポートします。 |
ACK Basic マネージドクラスター、ACK Pro マネージドクラスター、および ACK 専用クラスター(Kubernetes 1.20 以降)をサポートします。 |
ACK Basic マネージドクラスター、ACK Pro マネージドクラスター、および ACK 専用クラスター(Kubernetes 1.20 以降)をサポートします。 |
|
サポートされるコンポーネント |
これらのコンポーネントの違いについては、「パスワードレスコンポーネントの比較」をご参照ください。 |
aliyun-acr-credential-helper コンポーネント |
aliyun-acr-credential-helper コンポーネント |
|
権限の粒度 |
Pod レベル (詳細) |
クラスターレベル (中程度) |
アカウントレベル (粗い) |
|
セキュリティ |
高。詳細な権限制御と隔離を提供します。AccessKey ID および AccessKey Secret ペアをハードコーディングせず、セキュリティトークンサービス (STS) の一時的な認証情報を使用します。 |
中。すべての Pod が同じ権限を共有するため、過剰な権限のリスクがあります。 |
低。AccessKey 漏洩のリスクが高くなります。 |
|
ユースケース |
厳格な権限制御が必要なセキュリティに敏感なサービスおよび本番環境に適しています。 |
統一された権限が必要なシナリオや、中程度の権限制御が必要な開発およびテスト環境に適しています。 |
迅速なデプロイまたはデモ環境に適しています。 |
RRSA
A アカウント の ACK クラスター内で、特定の ServiceAccount を構成して B アカウント の RAM ロール(パスワードレスイメージプル権限付き)を偽装できるようにします。これにより、ACK クラスターが B アカウント のプライベートイメージにアクセスしてプルできるようになります。
パスワードレスコンポーネントで RRSA 機能を有効化するには、まずクラスターに対して RRSA を有効化し、その後パスワードレスコンポーネントに対して RRSA を構成する必要があります。手順を誤って実行した場合は、コンポーネントの Pod を削除して RRSA 機能を有効化し直す必要があります。
-
A アカウント で、ACK クラスターの RRSA 機能を有効化し、ロールを偽装する権限を持つ RAM ロールを作成します。
-
ACK クラスターの RRSA 機能を有効化します。
[ACK コンソール] にログインします。左側のナビゲーションウィンドウで、[クラスターリスト] をクリックします。
[クラスターリスト] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、[クラスター情報] をクリックします。
-
[基本情報] タブの [セキュリティと監査] セクションで、[RRSA OIDC] の横にある [有効にする] をクリックします。

-
[RRSA の有効化] ダイアログボックスで、[OK] をクリックします。
[基本情報] セクションで、クラスターのステータスが [更新中] から [実行中] に変化するまで待ちます。ステータスが [実行中] になったら、RRSA が有効化されています。
-
クラスターの RRSA が有効化されたら、[基本情報] タブの [セキュリティと監査] セクションで、RRSA OIDC の右側にある [有効] にカーソルを合わせて、OIDC プロバイダーの URL および ARN を確認します。

-
次の JSON を使用して信頼ポリシーを編集し、OIDC プロバイダー用の RAM ロールを作成します。
-
<oidc_issuer_url>を、前のステップで取得したクラスターの OIDC プロバイダー URL に置き換えます。 -
<oidc_provider_arn>を、前のステップで取得したクラスターの OIDC プロバイダー ARN に置き換えます。
{ "Statement": [ { "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "oidc:aud": "sts.aliyuncs.com", "oidc:iss": "<oidc_issuer_url>", "oidc:sub": "system:serviceaccount:kube-system:aliyun-acr-credential-helper" } }, "Effect": "Allow", "Principal": { "Federated": [ "<oidc_provider_arn>" ] } } ], "Version": "1" } -
-
AliyunSTSAssumeRoleAccessポリシーを RAM ロールにアタッチして、他のロールを偽装する権限を付与し、RAM ロールの ARN を記録します。詳細については、「RAM ロールへの権限付与」をご参照ください。-
RAM ロールの詳細ページで、[権限付与] タブをクリックし、[新規権限] をクリックします。
-
[新規権限] パネルの [ポリシー] セクションで、[AliyunSTSAssumeRoleAccess] ポリシーを検索して選択し、[Grant permissions] をクリックします。
-
RAM ロールの詳細ページで、[基本情報] セクションに移動して RAM ロールの ARN を確認し、記録します。詳細については、「RAM ロールの ARN の確認」をご参照ください。
-
-
-
B アカウント で、RAM ロールを作成し、プライベートイメージをプルする権限を付与するとともに、A アカウント の RAM ロールがこのロールを偽装できるように信頼ポリシーを構成します。
-
信頼済み Alibaba Cloud アカウント用の RAM ロールを作成し、次の JSON を使用して信頼ポリシーを編集します。これにより、A アカウント の RAM ロールがこのロールを偽装できるようになります。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "<ARN of the RAM role created in Account A>" ] } } ], "Version": "1" } -
次の内容のカスタムポリシーを作成し、RAM ロールにポリシーをアタッチして、インスタンス情報の取得およびイメージのプル権限を付与します。
{ "Version": "1", "Statement": [ { "Action": [ "cr:GetAuthorizationToken", "cr:ListInstanceEndpoint", "cr:PullRepository" ], "Resource": "*", "Effect": "Allow" } ] } -
RAM ロールの最大セッション期間を 3,600 秒~43,200 秒の範囲で設定します。デフォルト値は 3,600 秒です。
後述のコンポーネント構成の
expireDurationパラメーターと同じ値に設定することを推奨します。expireDurationの値は、最大セッション期間を超えることはできません。 -
RAM ロールの詳細ページで、[基本情報] セクションに移動して RAM ロールの ARN を確認し、記録します。
-
-
A アカウント で、ACK クラスターのパスワードレスコンポーネントをインストールし、構成を変更します。
以下のコンポーネントの違いについては、「パスワードレスコンポーネントの比較」をご参照ください。
マネージド アドオン
-
[ACK コンソール] にログインします。左側のナビゲーションウィンドウで、[クラスターリスト] をクリックします。
[クラスターリスト] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、[アドオン管理] をクリックします。
-
[アドオン管理] ページで、[セキュリティ] タブをクリックし、[aliyun-acr-credential-helper (マネージド)] カードを検索して、[インストール] をクリックします。
-
[パラメーター] ダイアログボックスで、[RRSA を有効化] を選択し、[追加] をクリックして、以下のパラメーターを入力し、[OK] をクリックします。

関連付けられた ACR Enterprise Edition インスタンスの構成:
パラメーター
説明
例
instanceId
ACR Enterprise Edition インスタンスの ID です。複数の ID を指定する場合は、カンマ (,) で区切ります。
cri-XXXXX
regionId
ACR Enterprise Edition インスタンスのリージョン ID です。
cn-hangzhou
domains
ACR インスタンスのアクセスドメイン名(パブリックおよび VPC)です。複数のドメイン名を指定する場合は、カンマ (,) で区切ります。
XXXXX-registry.cn-hangzhou.cr.aliyuncs.com
assumeRoleARN
ACR インスタンスの所有者に属する RAM ロールの ARN です。B アカウント で作成した RAM ロールの ARN を入力します。
acs:ram::100XXXXXXXX9630:role/XXXX
expireDuration
クロスアカウントアクセスの一時認証情報の有効期間です。B アカウント で作成した RAM ロールの最大セッション期間を入力します。
3600
rrsaRoleARN
ACK クラスターの所有者に属する RAM ロールの ARN です。A アカウント で作成した RAM ロールの ARN を入力します。
acs:ram::128XXXXXXXXXX09011:role/XXXX
rrsaOIDCProviderRoleARN
ACK クラスターの OIDC プロバイダーの ARN です。A アカウント の ACK クラスターの RRSA 機能の OIDC プロバイダー ARN を入力します。
acs:ram::128XXXXXXXXXX09011:oidc-provider/ack-rrsa-c8864XXXXXXXXXXXXXXXXXX99356a636
その他のパラメーターについては、「コンポーネント構成」をご参照ください。
コンポーネント
-
[ACK コンソール] にログインします。左側のナビゲーションウィンドウで、[クラスターリスト] をクリックします。
[クラスターリスト] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、[アドオン管理] をクリックします。
-
[アドオン管理] ページで、[セキュリティ] タブをクリックし、[aliyun-acr-credential-helper] コンポーネントを検索して、[インストール] をクリックします。表示されたダイアログボックスで、tokenMode を auto に設定し、[OK] をクリックします。

-
パスワードレスコンポーネントの ConfigMap を変更します。
-
左側のナビゲーションウィンドウで、[] を選択します。
-
[ConfigMap] ページの上部にある [名前空間] ドロップダウンリストで [kube-system] を選択します。次に、[acr-configuration] を検索して、[操作] 列の [YAML の編集] をクリックします。以下の例に基づいて構成を変更します。
data: service-account: "default" watch-namespace: "all" expiring-threshold: "15m" notify-email: "c*@example.com" acr-registry-info: | - instanceId: "cri-xxx" # ACR Enterprise Edition インスタンスの ID。 regionId: "cn-hangzhou" # ACR Enterprise Edition インスタンスのリージョン ID。 domains: "xxxxx-registry.cn-hangzhou.cr.aliyuncs.com" # ACR Enterprise Edition インスタンスのアクセスドメイン名。 rrsaRoleARN: "<ARN of the RAM role created in Account A>" rrsaOIDCProviderRoleARN: "<OIDC provider ARN from the Basic Information page of the cluster in the ACK console for Account A>" assumeRoleARN: "<ARN of the RAM role created in Account B>" expireDuration: 3600 # B アカウントの RAM ロールの最大セッション期間。デフォルト値は 3600 です。 rrsa: | enable: true # パスワードレスコンポーネントの RRSA 機能を有効化します。
-
-
Worker RAM ロール
A アカウント の ACK クラスター内で、クラスターのデフォルト Worker RAM ロールを構成して B アカウント の RAM ロール(パスワードレスイメージプル権限付き)を偽装できるようにします。これにより、ACK クラスターが B アカウント のプライベートイメージにアクセスしてプルできるようになります。
-
A アカウント で、クラスターの Worker RAM ロールを確認し、他のロールを偽装する権限を付与します。
[ACK コンソール] にログインします。左側のナビゲーションウィンドウで、[クラスターリスト] をクリックします。
-
[クラスターリスト] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、[クラスター情報] をクリックします。
-
[Cluster Information] ページで、[基本情報] タブをクリックします。[クラスターリソース] セクションで、[Worker RAM ロール] の右側にあるリンクをクリックします。
-
AliyunSTSAssumeRoleAccessポリシーを RAM ロールにアタッチして、他のロールを偽装する権限を付与し、RAM ロールの ARN を記録します。詳細については、「RAM ロールへの権限付与」をご参照ください。-
RAM ロールの詳細ページで、[権限付与] タブをクリックし、[新規権限] をクリックします。
-
[新規権限] パネルの [ポリシー] セクションで、[AliyunSTSAssumeRoleAccess] ポリシーを検索して選択し、[Grant permissions] をクリックします。
-
RAM ロールの詳細ページで、[基本情報] セクションに移動して RAM ロールの ARN を確認し、記録します。詳細については、「RAM ロールの ARN の確認」をご参照ください。
-
-
B アカウント で、RAM ロールを作成し、プライベートイメージをプルする権限を付与するとともに、A アカウント の ACK クラスターの Worker RAM ロールがこのロールを偽装できるように信頼ポリシーを構成します。
-
次の内容のカスタムポリシーを作成し、RAM ロールにポリシーをアタッチして、インスタンス情報の取得およびイメージのプル権限を付与します。
{ "Version": "1", "Statement": [ { "Action": [ "cr:GetAuthorizationToken", "cr:ListInstanceEndpoint", "cr:PullRepository" ], "Resource": "*", "Effect": "Allow" } ] } -
RAM ロールの詳細ページで、[トラスト規則] タブをクリックし、次の内容で [編集トラスト規則] を実行します。これにより、A アカウント の ACK クラスターの Worker RAM ロールが B アカウント の RAM ロールを偽装できるようになります。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "<ARN of the role created in Account A>" ] } } ], "Version": "1" } -
RAM ロールの詳細ページで、[基本情報] セクションに移動して RAM ロールの ARN を確認し、記録します。詳細については、「RAM ロールの ARN の確認」をご参照ください。
-
A アカウント で、ACK クラスターのパスワードレスコンポーネントをインストールし、構成を変更します。
-
[ACK コンソール] にログインします。左側のナビゲーションウィンドウで、[クラスターリスト] をクリックします。
[クラスターリスト] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、[アドオン管理] をクリックします。
-
[アドオン管理] ページで、[セキュリティ] タブをクリックし、[aliyun-acr-credential-helper] コンポーネントを検索して、[インストール] をクリックします。表示されたダイアログボックスで、tokenMode を workerRole に設定し、[OK] をクリックします。

-
パスワードレスコンポーネントの ConfigMap を変更します。
-
左側のナビゲーションウィンドウで、[] を選択します。
-
[ConfigMap] ページの上部にある [名前空間] ドロップダウンリストで [kube-system] を選択します。次に、[acr-configuration] を検索して、[操作] 列の [YAML の編集] をクリックします。以下の例に基づいて構成を変更します。
data: service-account: "default" watch-namespace: "all" expiring-threshold: "15m" notify-email: "c*@example.com" acr-registry-info: | - instanceId: "cri-xxx" # ACR Enterprise Edition インスタンスの ID。 regionId: "cn-hangzhou" # ACR Enterprise Edition インスタンスのリージョン ID。 domains: "xxxxx-registry.cn-hangzhou.cr.aliyuncs.com" # ACR Enterprise Edition インスタンスのアクセスドメイン名。 assumeRoleARN: "<ARN of the RAM role created in Account B>" expireDuration: 3600 # B アカウントの RAM ロールの最大セッション期間。デフォルト値は 3600 です。
-
-
RAM ユーザー AccessKey
A アカウント の ACK クラスター内で、パスワードレスコンポーネントに B アカウント の RAM ユーザーの AccessKey ID および AccessKey Secret を保存して、B アカウント のプライベートイメージをプルします。この方法は構成が簡単ですが、AccessKey ペアがプレーンテキストで保存されるため、認証情報漏洩のセキュリティリスクがあります。
-
B アカウント で、RAM ユーザーを作成し、必要な cr.* 権限が付与されていることを確認します。
-
RAM ユーザーの作成を行います。
-
次の内容のカスタムポリシーを作成し、RAM ユーザーにポリシーをアタッチして、インスタンス情報の取得およびイメージのプル権限を付与します。
{ "Version": "1", "Statement": [ { "Action": [ "cr:GetAuthorizationToken", "cr:ListInstanceEndpoint", "cr:PullRepository" ], "Resource": "*", "Effect": "Allow" } ] } -
AccessKey ペアを作成し、AccessKey ID および AccessKey Secret を記録します。
-
-
A アカウント で、ACK クラスターのパスワードレスコンポーネントをインストールし、構成を変更します。
-
[ACK コンソール] にログインします。左側のナビゲーションウィンドウで、[クラスターリスト] をクリックします。
[クラスターリスト] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、[クラスター情報] をクリックします。
[クラスターリスト] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、[アドオン管理] をクリックします。
-
[アドオン管理] ページで、[セキュリティ] タブをクリックし、[aliyun-acr-credential-helper] コンポーネントを検索して、[インストール] をクリックします。表示されたダイアログボックスで、tokenMode を auto に設定し、[OK] をクリックします。

-
パスワードレスコンポーネントの ConfigMap を変更します。
-
左側のナビゲーションウィンドウで、[] を選択します。
-
[ConfigMap] ページの上部にある [名前空間] ドロップダウンリストで [kube-system] を選択します。次に、[acr-configuration] を検索して、[操作] 列の [YAML の編集] をクリックします。以下の例に基づいて構成を変更します。
data: service-account: "default" watch-namespace: "all" expiring-threshold: "15m" notify-email: "c*@example.com" acr-registry-info: | - instanceId: "" # ACR Enterprise Edition インスタンスの ID。 regionId: "cn-hangzhou" # ACR Enterprise Edition インスタンスのリージョン ID。 customAccessKey: "xxxxx" # B アカウントの RAM ユーザーの AccessKey ID。 customAccessKeySecret: "xxxxxx" # B アカウントの RAM ユーザーの AccessKey Secret。 -
-
ステップ 3:クロスアカウントイメージプルの検証
-
B アカウント の ACR Enterprise Edition インスタンスで、必要に応じてコンテナイメージの [インターネット] または [VPC] アドレスを取得します。

-
A アカウント の ACK クラスターで、[] を選択し、コンテナイメージを使用してワークロードを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-basic labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: ******.cn-hangzhou.cr.aliyuncs.com/instance/instancetest:v1 # B アカウントの ACR イメージのアドレスを指定します。 ports: - containerPort: 80 -
ワークロードの Pod イベントに、
Successfully pulled image "XXX" in XXXs (XXXs including waiting). Image size: XXX bytes.に類似したメッセージが含まれている場合、パスワードレスコンポーネントがアカウント間でイメージを正常にプルできたことを示します。
よくある質問
100.0.0.0/8 CIDR ブロックの IP 競合
認証および OSS ドメインの IP アドレスは 100.0.0.0/8 CIDR ブロックに解決されます。内部ネットワークでもこの範囲を使用している場合、IP アドレスの競合が発生します。
認証ドメイン名の競合
認証ドメインのインスタンス取り込み機能を有効化することで、認証ドメインの競合を解消できます。これにより、インスタンスドメイン名のみを使用してサービスにアクセスできるようになります。
[Container Registry コンソール] にログインします。
上部のナビゲーションバーで、リージョンを選択します。
[インスタンス] ページで、管理対象の Enterprise Edition インスタンスをクリックします。
-
インスタンス管理ページの左側ナビゲーションウィンドウで、[] を選択します。[ドメイン] ページで、[認証ドメイン名をインスタンスに引き継ぐ] スイッチをオンにします。
重要認証ドメインのインスタンス取り込み機能を使用するには、Enterprise Edition インスタンスをホワイトリストに追加するために、チケットを送信する必要があります。
-
[認証ドメイン名のインスタンスへの引き継ぎを有効にする] ダイアログボックスで、[OK] をクリックします。
OSS ドメイン名の競合
PrivateLink を使用してプライベートネットワーク経由で OSS リソースにアクセスし、CNAME レコードを使用して OSS ドメイン名を PrivateLink ドメイン名にポイントできます。