Alibaba Cloud のマルチアカウントアーキテクチャでは、Container Service for Kubernetes (ACK) クラスターと Container Registry (ACR) Enterprise Edition インスタンスが異なる Alibaba Cloud アカウントに属している場合があります。ACK クラスターが ACR インスタンスからコンテナイメージをプルしてワークロードをデプロイできるようにするには、ネットワーク接続を確立し、必要な権限を付与する必要があります。このトピックでは、aliyun-acr-credential-helper パスワードレスコンポーネントを使用してアカウント間でイメージをプルする方法について説明します。
選択ガイド
まず、ビジネス要件を満たすネットワーク接続方法とアカウント権限付与方法を選択します。次に、選択した権限付与方法をサポートするパスワードレスコンポーネントを選択します。
具体的な手順については、「ネットワーク接続の設定」、「アカウント権限付与とパスワードレスコンポーネントの設定」、および「アカウント間でのイメージプルの検証」をご参照ください。
このトピックでは、クロスアカウントとは、RAM ユーザーではなく、異なる Alibaba Cloud アカウントを指します。
前提条件
パスワードレスコンポーネントが使用する RAM ロールに必要な権限が付与されていること。
ACK クラスターがパスワードレスコンポーネントをサポートしていること。
aliyun-acr-credential-helper (マネージド)
ACK マネージドクラスター、ACK サーバーレスクラスター、および Kubernetes 1.22 以降を実行するACK Edge クラスター
aliyun-acr-credential-helper (セルフマネージド)
Kubernetes 1.20 以降を実行するACK マネージドクラスターおよびACK 専用クラスター
Container Registry (ACR) インスタンスは Enterprise Edition インスタンスです。
重要パスワードレスコンポーネントは、ACR Enterprise Edition インスタンスと 2024 年 9 月 8 日以前に作成された ACR Personal Edition インスタンスのみをサポートします。パスワードレスコンポーネントを使用できない場合は、「imagePullSecrets の使用方法」をご参照ください。
操作手順
ステップ 1: ネットワーク接続の設定
アカウント間でイメージをプルする場合、ACK クラスターと ACR Enterprise Edition インスタンスは異なる VPC にあり、異なるアカウントに属し、異なるリージョンにある可能性があります。イメージをプルする前に、ネットワーク接続が確保され、関連するドメイン名が解決できることを確認する必要があります。以下の方法が利用可能です:
パブリックネットワーク接続:ACR Enterprise Edition インスタンスにパブリックエンドポイントを設定し、ACK クラスターのパブリックネットワークアクセスを有効にします。イメージはパブリックネットワーク経由で転送されます。ただし、パブリックネットワーク経由でのデータ転送はセキュリティが低く、Elastic IP アドレス (EIP) とデータ転送に料金が発生します。
VPC ピアリング接続:VPC ピアリング接続を使用して 2 つの VPC を接続します。これにより、ACK クラスターは ACR Enterprise Edition インスタンスにアクセスできます。VPC が同じリージョンにある場合、VPC ピアリング接続は無料ですが、VPC が異なるリージョンにある場合は料金が発生します。この方法では、2 つの VPC が重複しない CIDR ブロックを持つ必要があります。この要件により、VPC で利用可能な CIDR ブロックの数が減少する可能性があります。また、2 つの VPC の CIDR ブロックが重複する場合、既存のネットワークアーキテクチャを変更する必要があります。
Cloud Enterprise Network 接続:Cloud Enterprise Network (CEN) インスタンスには 1 つ以上のトランジットルーターを含めることができます。トランジットルーターはリージョン間接続を使用して接続し、クロスリージョンおよびクロスアカウントの VPC 相互接続を実現できます。
VPC ピアリング接続と CEN 接続の比較については、「CEN と VPC ピアリング接続の違いは何ですか?
比較項目 | パブリックネットワーク接続 | VPC ピアリング接続 | Cloud Enterprise Network 接続 |
ネットワークタイプ | パブリックネットワーク | プライベートネットワーク | プライベートネットワーク |
課金 | Elastic IP アドレスの課金方法に基づいて料金が発生します。 |
| Cloud Enterprise Network の課金ルールに基づいて料金が発生します。 |
主な特徴 | 既存のネットワークアーキテクチャを変更する必要はありません。セキュリティのため、インバウンドおよびアウトバウンドルール、アクセスの制御、その他の要因を考慮する必要があります。 |
|
|
設定手順 |
|
|
|
ステップ 2: アカウント権限付与とパスワードレスコンポーネントの設定
認証情報なしでアカウント間でイメージをプルするには、次の 3 つの権限付与方法があります。ご利用のシナリオに最も適した設定を選択してください。
比較項目 | RRSA の使用 | Worker RAM ロールの権限借用を使用 | RAM ユーザーの AccessKey ペアの使用 |
クラスタータイプ | v1.22 以降のACK マネージドクラスター Basic Edition、ACK マネージドクラスター Pro Edition、ACK Edge クラスター、およびACK サーバーレスクラスター Pro Editionでサポートされています。 | v1.20 以降のACK マネージドクラスター Basic Edition、ACK マネージドクラスター Pro Edition、およびACK 専用クラスターでサポートされています。 | v1.20 以降のACK マネージドクラスター Basic Edition、ACK マネージドクラスター Pro Edition、およびACK 専用クラスターでサポートされています。 |
サポートされているコンポーネント |
コンポーネントの違いの詳細については、「パスワードレスコンポーネントの比較」をご参照ください。 | aliyun-acr-credential-helper コンポーネント | aliyun-acr-credential-helper コンポーネント |
権限の粒度 | Pod レベル (詳細) | クラスターレベル (中間) | アカウントレベル (粗い) |
セキュリティ | 高。この方法は、詳細な権限管理と隔離を提供します。ハードコードされた AccessKey ペアなしで 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 の有効化] ダイアログボックスで、[確認] をクリックします。
[基本情報] セクションで、クラスターのステータスが [更新中] から [実行中] に変わると、クラスターの RRSA 機能が有効になります。
クラスターの RRSA 機能が有効になった後、[基本情報] タブの [セキュリティと監査] セクションに移動します。マウスを [RRSA OIDC] の横にある [有効] ラベルに合わせると、OIDC プロバイダーの URL と Alibaba Cloud リソースネーム (ARN) が表示されます。

スクリプトエディターを使用して信頼ポリシーを編集し、OIDC IdP の 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ポリシーをロールにアタッチして、ロールを借用する権限を付与し、その ARN を記録します。詳細については、「RAM ロールの権限を管理する」をご参照ください。ロールの詳細ページで、[権限] タブをクリックし、[権限を付与] をクリックします。
[権限を付与] パネルの [アクセスポリシー] セクションで、AliyunSTSAssumeRoleAccess アクセスポリシーを選択し、[OK] をクリックします。
ロールの詳細ページの [基本情報] セクションで、RAM ロールの ARN を表示して記録します。詳細については、「RAM ロールの ARN を表示する方法」をご参照ください。
アカウント B で、RAM ロールを作成し、プライベートイメージをプルする権限を付与し、アカウント A の RAM ロールがこのロールを借用できるようにします。
スクリプトエディターを使用して信頼ポリシーを編集し、信頼できる Alibaba Cloud アカウントの RAM ロールを作成して、アカウント A がロールを借用できるようにします。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "<ARN of the 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 ロールの ARN を記録します。
アカウント A で、ACK クラスターにパスワードレスコンポーネントをインストールし、その設定項目を変更します。
コンポーネントの違いの詳細については、「パスワードレスコンポーネントの比較」をご参照ください。
aliyun-acr-credential-helper マネージドコンポーネント
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的の クラスター を見つけてその名前をクリックします。左 ナビゲーションウィンドウで、[アドオン] をクリックします。
「アドオン」ページで、「セキュリティ」タブを選択します。「Aliyun-acr-credential-helper (管理対象)」カードを見つけ、「インストール」をクリックします。
[Aliyun-acr-credential-helper パラメーター設定] ダイアログボックスで、[RRSA が有効] チェックボックスを選択し、[追加] をクリックします。次のパラメーターを入力し、[OK] をクリックします。

関連する ACR Enterprise Edition インスタンスの設定:
パラメーター
説明
例
instanceId
ACR インスタンスの ID。複数の ID を指定するには、カンマ (,) で区切ります。
cri-XXXXX
regionId
ACR インスタンスのリージョン ID。
cn-hangzhou
domains
ACR インスタンスが使用するドメイン名。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 IdP の ARN。アカウント A の ACK クラスターの RRSA OIDC IdP の ARN を入力します。
acs:ram::128XXXXXXXXXX09011:oidc-provider/ack-rrsa-c8864XXXXXXXXXXXXXXXXXX99356a636
他のパラメーターの詳細については、「コンポーネント設定」をご参照ください。
aliyun-acr-credential-helper コンポーネント
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 インスタンスの ID。 regionId: "cn-hangzhou" # ACR インスタンスのリージョン ID。 domains: "xxxxx-registry.cn-hangzhou.cr.aliyuncs.com" # ACR インスタンスのエンドポイント。 rrsaRoleARN: "<ARN of the role created in Account A>" rrsaOIDCProviderRoleARN: "<The ARN of the OIDC IdP from the basic information page of the ACK cluster in the console for Account A.>" assumeRoleARN: "<ARN of the 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 コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、クラスター情報 をクリックします。
[クラスター情報] ページで、[基本情報] タブをクリックします。[クラスターリソース] エリアで、[Worker RAM ロール] の右側にあるリンクをクリックします。
AliyunSTSAssumeRoleAccessポリシーをロールにアタッチして、ロールを借用する権限を付与し、その ARN を記録します。詳細については、「RAM ロールの権限を管理する」をご参照ください。ロールの詳細ページで、[権限] タブをクリックし、[権限を付与] をクリックします。
[権限を付与] パネルの [アクセスポリシー] セクションで、AliyunSTSAssumeRoleAccess アクセスポリシーを選択し、[OK] をクリックします。
ロールの詳細ページの [基本情報] セクションで、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 ロールの 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 role created in Account B>" expireDuration: 3600 # アカウント B の RAM ロールの最大セッション期間。デフォルト値は 3600 です。
RAM ユーザーの AccessKey ペアの使用
アカウント A の ACK クラスターでは、パスワードレスコンポーネントがアカウント B の RAM ユーザーの AccessKey ID と AccessKey Secret を使用して、アカウント B からプライベートイメージをプルします。この方法は設定が簡単ですが、AccessKey ID と AccessKey Secret がプレーンテキストで保存されるため、セキュリティリスクがあります。
アカウント 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 コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[クラスター情報] をクリックします。
ACK クラスターページで、対象のクラスターの名前をクリックします。左側のナビゲーションウィンドウで、Add-ons をクリックします。
[アプリケーション] ページで、[セキュリティ] タブをクリックします。[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 インスタンスで、必要なコンテナイメージの [パブリックエンドポイント] または [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 ブロックにあります。内部ネットワークもこの CIDR ブロックの IP アドレスを使用している場合、ACR Enterprise Edition インスタンスにアクセスする際に競合が発生する可能性があります。これらの競合を回避するには、次の手順に従ってください。
認証ドメイン名の CIDR ブロックの競合
インスタンスが認証ドメイン名を引き継ぐように設定できます。これにより、インスタンスドメイン名にアクセスするだけで済み、認証ドメイン名の CIDR ブロックとの競合が解決されます。
Container Registry コンソールにログインします。
上部のナビゲーションバーで、リージョンを選択します。
[インスタンス] ページで、管理したい Enterprise Edition インスタンスをクリックします。
インスタンス管理ページのナビゲーションウィンドウで、 を選択します。[ドメイン] ページで、[認証ドメイン名のインスタンス引き継ぎ] スイッチをオンにします。
重要インスタンスが認証ドメイン名を引き継ぐ機能を使用するには、チケットを送信して、Enterprise Edition インスタンスをホワイトリストに追加する必要があります。
[認証ドメイン名のインスタンス引き継ぎを有効にする確認] プロンプトで、[OK] をクリックします。
OSS ドメイン名の CIDR ブロックの競合
PrivateLink を使用してプライベートネットワーク経由で OSS リソースにアクセスできます。次に、元のターゲット OSS ドメイン名の CNAME レコードを PrivateLink エンドポイントにポイントします。