Alibaba Cloud のマルチアカウント環境では、Container Service for Kubernetes (ACK) クラスターと Container Registry (ACR) Enterprise Edition インスタンスが、事業部門ごとに異なるアカウントで管理されていることがあります。 ACK クラスターが ACR Enterprise Edition インスタンスからコンテナイメージをプルしてワークロードをデプロイできるようにするには、ネットワーク接続を確保し、必要なクロスアカウント権限を付与する必要があります。 このトピックでは、aliyun-acr-credential-helper パスワードレス コンポーネントを使用して、クロスアカウントでイメージをプルする方法について説明します。
意思決定ガイド
最初に、ネットワーク接続方式とアカウントの権限付与方式を選択します。次に、選択した方式をサポートする認証情報不要コンポーネントを選択します。
詳細な手順については、「ネットワーク接続の設定」および「アカウントの権限付与と認証情報不要コンポーネントの設定」の手順に従い、その後「クロスアカウントのイメージプルの検証」を実行してください。
このトピックにおけるクロスアカウントアクセスは、Alibaba Cloud アカウント (ルートアカウント) 間のアクセスを指し、RAM ユーザー (サブアカウント) 間のアクセスは指しません。
前提条件
-
パスワードレスコンポーネントが使用する RAM ロールに、必要な権限 が付与されていること。
-
ACK クラスターがパスワードレスコンポーネントをサポートしていること。
-
aliyun-acr-credential-helper (マネージド)
バージョン 1.22 以降の ACK マネージドクラスター、ACK サーバーレスクラスター、または ACK Edge クラスター
-
aliyun-acr-credential-helper (セルフマネージド)
バージョン 1.20 以降の ACK マネージドクラスター または ACK 専用クラスター
-
-
コンテナレジストリ (ACR) インスタンスは、エンタープライズ版である必要があります。
重要パスワードレスコンポーネントは、ACR Enterprise Edition インスタンスと、2024 年 9 月 8 日以前に作成された ACR Personal Edition インスタンスのみをサポートします。パスワードレスコンポーネントを使用できない場合は、「imagePullSecrets の使用方法」をご参照ください。
手順
ステップ 1:ネットワーク接続の設定
クロスアカウントでイメージをプルする場合、イメージをプルする ACK クラスターとイメージをホストする ACR Enterprise Edition インスタンスは、それぞれ異なるアカウントの VPC 内にあり、リージョンも異なる場合があります。イメージをプルする前に、ネットワーク接続を確立し、関連するドメイン名が解決できることを確認する必要があります。次のいずれかの方法を使用できます。
-
パブリック接続: ACR Enterprise Edition インスタンスにパブリックエンドポイントを設定し、ACK クラスターのパブリックネットワークアクセスを有効にします。イメージはパブリックインターネット経由で転送されます。この方法はセキュリティが低く、Elastic IP アドレスとアウトバウンドトラフィックの両方にコストが発生します。
-
VPC ピアリング接続: VPC ピアリング接続を使用して 2 つの VPC を接続し、ACK クラスターが ACR Enterprise Edition インスタンスにアクセスできるようにします。この機能は、VPC が同じリージョンにある場合は無料ですが、異なるリージョンにある場合は課金されます。この方法では、2 つの VPC に重複しない CIDR ブロックが必要です。すでに使用されている CIDR ブロックに大幅な重複がある場合は、既存のネットワークアーキテクチャの再設計が必要になる場合があります。
-
Cloud Enterprise Network (CEN) 接続: 1 つの CEN インスタンスには、1 つ以上のトランジットルーターを含めることができます。複数のトランジットルーターは、クロスリージョン接続を介して相互接続することで、異なるリージョンおよびアカウントにまたがる VPC 間の通信を実現できます。
VPC ピアリング接続と CEN の比較については、「Cloud Enterprise Network と VPC Peering Connection の違いは何ですか?」をご参照ください。
|
比較項目 |
パブリック接続 |
VPC ピアリング接続 |
Cloud Enterprise Network (CEN) |
|
ネットワークタイプ |
パブリック |
プライベート |
プライベート |
|
課金 |
Elastic IP アドレスの課金方法に基づいて料金が発生します。 |
|
CEN の課金ルールに基づいて料金が発生します。 |
|
主な特徴 |
既存のネットワークアーキテクチャを変更する必要はありません。セキュリティのために、インバウンドルールとアウトバウンドルール、およびアクセス制御ポリシーを設定する必要があります。 |
|
|
|
設定手順 |
|
|
|
手順2:権限付与とパスワードレスコンポーネントの設定
以下の 3 つの権限付与方法を使用すると、静的認証情報を使用せずにクロスアカウントでイメージをプルできます。要件に最も適した方法を選択してください。
|
比較項目 |
RRSA |
Worker RAM ロール |
RAM ユーザーの AccessKey |
|
クラスタータイプ |
v1.22 以降の ACK Basic クラスター、ACK Pro クラスター、ACK Edge クラスター、および ACK Serverless Pro クラスターをサポートします。 |
v1.20 以降の ACK Basic クラスター、ACK Pro クラスター、および ACK dedicated クラスターをサポートします。 |
v1.20 以降の ACK Basic クラスター、ACK Pro クラスター、および ACK dedicated クラスターをサポートします。 |
|
サポートされるコンポーネント |
これらのコンポーネントの違いに関する詳細については、「パスワードレスコンポーネントの比較」をご参照ください。 |
aliyun-acr-credential-helper コンポーネント |
aliyun-acr-credential-helper コンポーネント |
|
権限の粒度 |
Pod レベル (きめ細かい) |
クラスターレベル (中程度の粒度) |
アカウントレベル (粗い粒度) |
|
セキュリティ |
高。この方法は、きめ細かい権限管理と分離を提供します。Security Token Service (STS) からの一時的な認証情報を使用し、AccessKey ペアのハードコーディングを回避します。 |
中。すべての Pod が同じ権限を共有するため、過剰な権限につながる可能性があります。 |
低。AccessKey ペアが漏洩するリスクが高いです。 |
|
適用シナリオ |
厳格な権限管理を必要とする、セキュリティに敏感なサービスや本番環境に適しています。 |
権限要件が均一なシナリオ、たとえば中程度の権限管理が必要な開発環境やテスト環境に適しています。 |
迅速なデプロイやデモ環境に適しています。 |
RRSA
アカウント A の Container Service for Kubernetes (ACK) クラスターで、特定の ServiceAccount が アカウント B の RAM ロールを引き受けるように設定します。この RAM ロールには必要な権限が付与されており、ACK クラスターは静的認証情報を使用せずに アカウント B の ACR インスタンスからプライベートイメージをプルできます。
パスワードレスコンポーネントで RAM Roles for Service Accounts (RRSA) 機能を有効にするには、まずクラスターで RRSA を有効にし、次にコンポーネントで RRSA を設定する必要があります。これらの手順を誤った順序で実行した場合、RRSA 機能を有効にするには、パスワードレスコンポーネントの Pod を削除する必要があります。
-
アカウント A で、ACK クラスターの RRSA 機能を有効にし、ロールの引き受け権限を持つ RAM ロールを作成します。
-
ACK クラスターの RRSA 機能を有効にします。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[クラスター情報] をクリックします。
-
[基本情報] タブの [セキュリティと監査] セクションで、[RRSA OIDC] の横にある [有効化] をクリックします。
-
[RRSA の有効化] ダイアログボックスで、[確認] をクリックします。クラスターのステータスが [更新中] から [実行中] に変わるまで待ちます。これで RRSA が有効になりました。
-
RRSA を有効にした後、[セキュリティと監査] セクションの [RRSA OIDC] の横にある [有効] ラベルにカーソルを合わせます。OIDC プロバイダーの URL と Alibaba Cloud リソースネーム (ARN) が表示されます。
-
OIDC ID プロバイダー用の 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] ポリシーを見つけて選択し、権限を付与 をクリックします。
-
ロールの詳細ページの 基本情報 セクションで、RAM ロールの ARN を表示して記録します。詳細な手順については、「RAM ロールの ARN を表示する方法」をご参照ください。
-
-
-
アカウント B で、プライベートイメージをプルする権限を持つ RAM ロールを作成し、アカウント A の RAM ロールが引き受けられるように設定します。
-
信頼できる Alibaba Cloud アカウント用の RAM ロールを作成します。信頼ポリシーを以下のスクリプトで編集し、アカウント A のロールによる引き受けを許可します。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "<アカウント A で作成したロールの ARN>" ] } } ], "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 クラスターにパスワードレスコンポーネントをインストールし、その設定を変更します。
以下のコンポーネントの違いに関する詳細については、「パスワードレスコンポーネントの比較」をご参照ください。
マネージドコンポーネント
-
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
アカウント B で作成した RAM ロールの ARN。
acs:ram::100XXXXXXXX9630:role/XXXX
expireDuration
クロスアカウントアクセス用の一時的な認証情報の有効期間。アカウント B で作成した RAM ロールの最大セッション期間を入力します。
3600
rrsaRoleARN
アカウント A で作成した RAM ロールの ARN。
acs:ram::128XXXXXXXXXX09011:role/XXXX
rrsaOIDCProviderRoleARN
ACK クラスターのプロバイダー ARN。アカウント A の ACK クラスターの RRSA OIDC ID プロバイダーの プロバイダー ARN を入力します。
acs:ram::128XXXXXXXXXX09011:oidc-provider/ack-rrsa-c8864XXXXXXXXXXXXXXXXXX99356a636
その他のパラメーターについては、「コンポーネント設定」をご参照ください。
aliyun-acr-credential-helper
-
ACK コンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
-
アドオン管理 ページの セキュリティ タブで、[aliyun-acr-credential-helper] コンポーネントを見つけ、インストール をクリックします。表示されるダイアログボックスで、[tokenMode] オプションを [auto] に設定し、OK をクリックします。
-
パスワードレスコンポーネントの ConfigMap を変更します。
-
左側メニューで、 を選択します。
-
ConfigMap ページで、[名前空間] ドロップダウンリストから [名前空間] を選択します。次に、[acr-configuration] を見つけ、YAML の編集 列の [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: "<アカウント A で作成したロールの ARN>" rrsaOIDCProviderRoleARN: "<アカウント A の ACK コンソールのクラスター基本情報ページにある OIDC プロバイダーの ARN>" assumeRoleARN: "<アカウント B で作成したロールの ARN>" 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] ポリシーを見つけて選択し、権限を付与 をクリックします。
-
ロールの詳細ページの 基本情報 セクションで、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": [ "<アカウント A で作成したロールの ARN>" ] } } ], "Version": "1" } -
ロールの詳細ページの 基本情報 セクションで、RAM ロールの ARN を表示して記録します。詳細な手順については、「RAM ロールの ARN を表示する方法」をご参照ください。
-
アカウント A で、ACK クラスターにパスワードレスコンポーネントをインストールし、その設定を変更します。
-
ACK コンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
-
アドオン管理 ページの セキュリティ タブで、[aliyun-acr-credential-helper] コンポーネントを見つけ、インストール をクリックします。表示されるダイアログボックスで、[tokenMode] オプションを [workerRole] に設定し、OK をクリックします。
-
パスワードレスコンポーネントの ConfigMap を変更します。
-
左側メニューで、 を選択します。
-
ConfigMap ページで、[名前空間] ドロップダウンリストから [名前空間] を選択します。次に、[acr-configuration] を見つけ、YAML の編集 列の [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: "<アカウント B で作成したロールの ARN>" expireDuration: 3600 # アカウント B の RAM ロールの最大セッション期間。デフォルト:3600。
-
-
RAM ユーザーの AccessKey
アカウント A の ACK クラスターで、パスワードレスコンポーネントが アカウント B の RAM ユーザーの AccessKey ID (AK) と AccessKey Secret (SK) を保存し、アカウント 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 ページで、[名前空間] ドロップダウンリストから [名前空間] を選択します。次に、[acr-configuration] を見つけ、YAML の編集 列の [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 -
「
イメージ "XXX" のプルに成功しました (XXX 秒)。(待機時間を含む XXX 秒)。イメージサイズ: XXX バイト。」というメッセージを含む Pod イベントは、パスワード不要のコンポーネントがアカウント間でイメージのプルに成功したことを示します。ワークロードの詳細ページの [Pods] タブで、Pod のステータスが [Running] であること、および[イメージ]列に
test332-registry.cn-hangzhou.cr.aliyuncs.com/instance/test:v1などのクロスアカウントのイメージリポジトリアドレスが表示されていることを確認します。
よくある質問
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 ドメイン名に向けることができます。