Contain Service for Kubernetes (ACK) のシークレットフリーコンポーネントは、イメージプルの認証プロセスを自動化し、imagePullSecrets を構成する必要性を排除します。このトピックでは、イメージプルのシークレットフリーコンポーネントのインストール、構成、使用方法、および関連する注意事項について説明します。
シークレットフリーコンポーネントの仕組み
Container Registry インスタンスで匿名ユーザーからのプルを有効にしていない場合、ACK クラスタの Container Registry インスタンスからコンテナイメージをプルするたびに、認証のためにユーザー名とパスワードを提供する必要があります。認証を容易にするために、ユーザー名とパスワードを Kubernetes シークレットに保存できます。ただし、この方法には次の問題がある可能性があります。
シークレットは Base64 でエンコードされたプレーンテキストであり、漏洩しやすい。
ワークロードのイメージをプルするたびに、
imagePullSecretsパラメーターを指定する必要がある。デフォルトでは、シークレットはシークレットの名前空間内でのみ使用できる。
前述の問題を解決するために、ACK のシークレットフリーコンポーネントを使用できます。次の手順は、コンポーネントの仕組みを説明しています。
aliyun-acr-credential-helper は、Container Registry インスタンスから一時アカウントとトークンを取得します。
aliyun-acr-credential-helper は、一時アカウントとトークンをシークレットに保存します。
aliyun-acr-credential-helper は、acr-configuration ConfigMap で指定したサービスアカウントにシークレットを関連付けます。
デフォルトでは、サービスアカウントのワークロードは、シークレットに保存されている一時アカウントとトークンを使用してイメージをプルします。
aliyun-acr-credential-helper は、複数の名前空間のサービスアカウントを同時に管理し、ConfigMap の構成に基づいてシークレットに保存されている一時アカウントとトークンを定期的に更新できます。これにより、一時アカウントとトークンの漏洩リスクが軽減されます。 aliyun-acr-credential-helper を使用すると、ワークロードに imagePullSecrets を指定する必要がなくなります。 aliyun-acr-credential-helper の使用は無料です。
2024 年 9 月 8 日以前に作成された Container Registry Personal Edition インスタンスと Container Registry Enterprise Edition インスタンスのみが aliyun-acr-credential-helper をサポートしています。
2024 年 9 月 9 日以降に作成された Container Registry Personal Edition インスタンスは、aliyun-acr-credential-helper をサポートしていません。 2024 年 9 月 8 日より後に作成された Container Registry Personal Edition インスタンスからイメージをプルする場合は、Personal Edition インスタンスへのログインに使用するユーザー名とトークンをシークレットに保存し、ワークロードの YAML ファイルの
imagePullSecretsパラメーターでシークレットを参照することをお勧めします。
シークレットフリーコンポーネントのエディション
ACK が提供するシークレットフリーコンポーネントは、マネージドエディション(managed-aliyun-acr-credential-helper)とセルフマネージドエディション(aliyun-acr-credential-helper)で利用できます。同時にインストールできるエディションは 1 つだけです。次の表は、エディションを比較したものです。
項目 | managed-aliyun-acr-credential-helper | aliyun-acr-credential-helper (セルフマネージドエディション) |
サポートされているクラスタバージョン |
|
|
デプロイ方法 | クラスターのコントロールプレーンにデプロイされます。 | ワークロードを使用して Kubernetes クラスタにデプロイされます。デフォルトでは、クラスターの kube-system 名前空間に、0.5 vCPU と 0.5 GiB のメモリを持つポッドが aliyun-acr-credential-helper (セルフマネージドエディション) 用に作成されます。 |
コンポーネントのクエリログ | サポートされていません。 | サポートされています。 |
Alibaba Cloud アカウント間で Container Registry インスタンスからイメージをプルする方法 | サービスアカウントの RAM ロール (RRSA) 機能を使用します。 | ワーカーロール、RRSA、または AccessKey ペアを使用します。 |
サポートされていません。 | サポートされています。 | |
Container Registry コンソールのカード (Container Registry コンソールのコンポーネント管理ページでコンポーネントのエディションを確認できます。) |
|
|
前提条件
お使いのクラスタバージョンは、シークレットフリーコンポーネントのエディションでサポートされています。詳細については、このトピックの前の「シークレットフリーコンポーネントのエディション」セクションの表を参照してください。
Container Registry インスタンスは、2024 年 9 月 8 日以前に作成された Personal Edition インスタンス、または Enterprise Edition インスタンスです。
シークレットフリーコンポーネントを使用する RAM ロールには、Container Registry インスタンスへのアクセス、イメージリポジトリの読み取りと書き込み、およびシークレットの管理と更新に必要な権限が付与されています。 RAM に権限が付与されていない場合は、RAM ロールに権限を付与 してください。
managed-aliyun-acr-credential-helper を使用する
コンポーネントをインストールする
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけて、その名前をクリックします。左側のウィンドウで、 を選択します。
[アドオン] ページで、[セキュリティ] タブをクリックし、セキュリティセクションで [aliyun-acr-credential-helper (マネージド)] カードを見つけ、カードの右下隅にある [インストール] をクリックします。
[aliyun-acr-credential-helper をインストール] ページには、[AcrInstanceInfo] 関連のパラメーターとその他のパラメーターが表示されます。 [AcrInstanceInfo] 関連のパラメーターは、シークレットフリーコンポーネントで管理する Container Registry インスタンスに関する情報を指定します。その他のパラメーターは、シークレットフリーコンポーネントに関する情報を指定します。次の表は、パラメーターについて説明しています。
説明シークレットフリーコンポーネントをインストールした後、AcrInstanceInfo 関連のパラメーターとその他のパラメーターを変更できます。

関連付けられている Container Registry インスタンスに関するパラメーター
AcrInstanceInfo
説明
[インスタンス ID]
Container Registry インスタンスの ID。Container Registry コンソール で ID を取得できます。
重要Container Registry Personal Edition インスタンスを使用する場合は、このパラメーターを空のままにします。 Container Registry Enterprise Edition インスタンスを使用する場合は、このパラメーターを指定する必要があります。
[リージョン ID]
Container Registry インスタンスのリージョン ID。Container Registry コンソール でリージョン ID を取得できます。
重要リージョンをまたいでイメージをプルする場合は、このパラメーターを指定する必要があります。
[ドメイン]
シークレットフリーコンポーネントが Container Registry インスタンスにアクセスするために使用するドメイン名。デフォルトでは、Container Registry インスタンスのすべてのパブリックドメイン名と VPC ドメイン名が入力されます。特定のドメイン名を指定できます。複数のドメイン名はコンマ (,) で区切ります。
アカウントをまたいでイメージをプルする場合にのみ、これらのパラメーターを指定します
[RAM ロールの ARN を想定]
Container Registry インスタンスの所有者が想定する RAM ロールの Alibaba Cloud リソースネーム (ARN)。
[有効期限]
Alibaba Cloud アカウント間でイメージをプルするために使用されるシークレットの有効期間。有効な値: 3600 ~ 43200。デフォルト値: 3600。単位: 秒。アカウント B の RAM ロールの MaxSessionDuration を 43200 に設定します。
[RRSA ロールの ARN]
ACK クラスタの所有者が想定する RAM ロールの ARN。
[RRSA OIDC プロバイダーのロール ARN]
ACK クラスタの OIDC (OpenID Connect) IdP (ID プロバイダー) の ARN。
シークレットフリーコンポーネントに関するパラメーター
パラメーター
説明
[RRSA を有効にするかどうかを指定します]
アカウントをまたいでイメージをプルする場合は、このオプションを選択して RRSA 機能を有効にします。
[名前空間を監視]
シークレットを使用せずにイメージをプルする名前空間を指定します。デフォルト値:
default。allの値は、Container Registry インスタンスのすべての名前空間を指定します。複数の名前空間を指定できます。複数の名前空間はコンマ (,) で区切ります。このパラメーターにはビジネス名前空間を構成することをお勧めします。パラメーターをallまたはクラスターのシステムコンポーネントが格納されている名前空間に設定すると、システムコンポーネントイメージのプルに失敗する可能性があります。[サービスアカウント]
managed-aliyun-acr-credential-helper に関連付けられているサービスアカウントを指定します。デフォルト値:
Default。Defaultの値は、指定されたすべての名前空間のデフォルトのサービスアカウントを指定します。アスタリスク (*) の値は、指定された名前空間のすべてのサービスアカウントを指定します。複数のサービスアカウントを指定できます。サービスアカウントはコンマ (,) で区切ります。[有効期限のしきい値]
シークレットの有効期限が切れるまでの期間を指定します。デフォルト値:
15m。デフォルト値を使用することをお勧めします。デフォルト値は、シークレットの有効期限が切れる 15 分前にシークレットが自動的に更新されることを指定します。[通知メール]
このパラメーターを指定する必要はありません。
シークレットフリーコンポーネントの構成を更新する
シークレットフリーコンポーネントの構成を更新するには、[アドオン] ページの [aliyun-acr-credential-helper (マネージド)] カードの右下隅にある [構成] をクリックします。構成の更新に使用されるパラメーターの詳細については、前の表「関連付けられている Container Registry インスタンスに関するパラメーター」および「シークレットフリーコンポーネントに関するパラメーター」を参照してください。

イメージをプルする
シークレットフリーコンポーネントをインストールして構成した後、ワークロードの作成時にシークレットフリーコンポーネントに関連付けられているサービスアカウントを指定して、シークレットを使用せずにイメージをプルできます。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
serviceAccountName: my-service-account # シークレットフリーコンポーネントに関連付けられているサービスアカウントを指定します。
containers:
- name: nginx
image: ******.cn-hangzhou.cr.aliyuncs.com/nginx/nginx:latest # Container Registry イメージのアドレスを指定します。
ports:
- containerPort: 80その他の操作
アカウントをまたいでイメージをプルする
managed-aliyun-acr-credential-helper を使用すると、サービスアカウントの RAM ロール (RRSA) を使用してアカウントをまたいでイメージをプルできます。
Kubernetes 1.22 以降を実行する ACK ベーシッククラスター、ACK Pro マネージドクラスター、および ACK Serverless Pro クラスター でのみ、RRSA を構成して Container Registry Enterprise Edition インスタンスからイメージをプルできます。
RRSA 機能を有効にした後、managed-aliyun-acr-credential-helper によって生成されたシークレットを使用して、Container Registry Personal Edition インスタンスの非公開イメージをプルすることはできません。 RRSA 機能を有効にした後、このトピックで説明されている AccessKey ペア方式などの他の認証方式を使用することはできません。
managed-aliyun-acr-credential-helper の RRSA 機能を有効にするには、ACK コンソールの [クラスタ情報] ページの [基本情報] タブでクラスタの RRSA を有効にし、managed-aliyun-acr-credential-helper の RRSA を構成する必要があります。 managed-aliyun-acr-credential-helper の RRSA を構成してからクラスタの RRSA を有効にする場合は、クラスタの RRSA を有効にした後、managed-aliyun-acr-credential-helper に対応するポッドを削除する必要があります。これにより、RRSA が有効になります。
クラスタの RRSA 機能を有効にします。詳細については、「RRSA を使用して異なるポッドに異なるクラウドサービスへのアクセスを許可する」トピックの「RRSA を有効にする」セクションを参照してください。
クラスタの RRSA 機能を有効にした後、[基本情報] タブの [セキュリティと監査] セクションに移動します。 [RRSA OIDC] の横にある [有効] ラベルにマウスポインターを合わせると、OpenID Connect (OIDC) プロバイダーの URL と Alibaba Cloud リソースネーム (ARN) が表示されます。

クラスタ所有者の RAM ユーザーに、アカウントをまたいで Container Registry リソースにアクセスするために必要な権限を付与します。
クラスタの RRSA 機能を有効にした後、次の操作を実行して、クラスタ所有者の RAM ユーザーに権限を付与する必要があります。たとえば、現在のクラスタがアカウント A にあり、Container Registry インスタンスがアカウント B にあるとします。 Container Registry インスタンスからイメージをプルする場合は、アカウント A のクラスタにアカウント B の Container Registry リソースにアクセスするための権限を付与する必要があります。
アカウント A の RAM ロールを構成します。
アカウント A に RAM ロールを作成し、AliyunSTSAssumeRoleAccess ポリシーを RAM ロールにアタッチします。このポリシーは、RAM ロールに他の RAM ロールを想定する権限を付与します。次のコードに示すように、RAM ロールの信頼ポリシーを変更します。
例の
<oidc_issuer_url>を、手順 1 で記録したクラスタの OIDC IdP URL に置き換えます。例の
<oidc_provider_arn>を、手順 1 で記録したクラスタの OIDC IdP 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"}アカウント B の RAM ロールを構成します。
アカウント B に cr.* 権限を持つ RAM ロールを作成します。 RAM ロールの名前をクリックします。 [信頼ポリシー] タブで、信頼ポリシーのプリンシパルフィールドにアカウント A の RAM ロールの ARN を入力します。アカウント B の RAM ロールに次のポリシーをアタッチします。このポリシーは、アカウント B の RAM ロールに、Container Registry インスタンスに関する情報を取得し、インスタンスからイメージをプルする権限を付与します。
{ "Version": "1", "Statement": [ { "Action": [ "cr:GetAuthorizationToken", "cr:ListInstanceEndpoint", "cr:PullRepository" ], "Resource": "*", "Effect": "Allow" } ] }RAM ロールの MaxSessionDuration パラメーターを指定できます。このパラメーターの有効な値の範囲は 3600 ~ 43200 秒です。 managed-aliyun-acr-credential-helper を構成する際には、次の手順 7 で [有効期限] パラメーターを指定する必要があります。詳細については、RAM ロールの最大セッション期間を指定する を参照してください。 MaxSessionDuration と [有効期限] に同じ値を指定することをお勧めします。 [有効期限] の値は、MaxSessionDuration の値以下にすることができます。
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけて、その名前をクリックします。左側のウィンドウで、[クラスタ情報] をクリックします。
左側のナビゲーションウィンドウで、 を選択します。
[アドオン] ページで、[セキュリティ] タブをクリックし、セキュリティ セクションで [aliyun-acr-credential-helper] (マネージド) カードを見つけ、カードの右下隅にある [構成] をクリックします。 [aliyun-acr-credential-helper パラメーター] ダイアログボックスで、[追加] をクリックし、アカウント B の Container Registry インスタンス情報を使用して [AcrInstanceInfo] セクションのパラメーターを構成します。 [OK] をクリックします。その後、ユーザーはアカウント B の Container Registry インスタンスからイメージをプルできます。
aliyun-acr-credential-helper を使用する
コンポーネントをインストールする
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけて、その名前をクリックします。左側のウィンドウで、 を選択します。
[アドオン] ページで、[セキュリティ] タブをクリックし、セキュリティセクションで [aliyun-acr-credential-helper] カードを見つけ、カードの右下隅にある [インストール] をクリックします。
[aliyun-acr-credential-helper をインストール] ダイアログボックスで、[tokenMode] ドロップダウンリストからコンポーネントが使用する権限モードを選択し、[OK] をクリックします。次の表は、コンポーネントで使用できる権限モードについて説明しています。コンポーネントをインストールした後、シークレットを使用せずにイメージをプルするためにコンポーネントを使用する前に、コンポーネントを構成する必要があります。コンポーネントの構成方法については、シークレットフリーコンポーネントの構成を更新する を参照してください。
tokenMode
説明
[自動]
(推奨) コンポーネントは、クラスタがいつ作成されたかを検出し、コンポーネントが使用する権限モードを自動的に決定します。クラスタが 2023 年 4 月 3 日より前に作成された場合、コンポーネントは workerRole 権限モードを使用します。クラスタが 2023 年 4 月 3 日以降に作成された場合、コンポーネントは managedRole 権限モードを使用します。
重要2023 年 4 月 3 日以降にリリースされた aliyun-acr-credential-helper のバージョンでは、コンポーネントが依存する RAM ロールを指定できる構成項目が提供されています。詳細については、[製品の変更] aliyun-acr-credential-helper が依存する権限を取り消す を参照してください。
[マネージドロール]
コンポーネントは、前提条件 で特定の権限が付与されている AliyunCSManagedAcrRole ロールを使用して権限を取得します。
[ワーカーロール]
コンポーネントは、クラスタのワーカーロールを使用して権限を取得します。このモードを使用するには、クラスタのワーカーロールに特定の権限を付与する必要があります。詳細については、aliyun-acr-credential-helper が workerRole 権限モードを使用する を参照してください。
重要ロールの想定によってアカウントをまたいでイメージをプルする場合は、このモードを選択します。
シークレットフリーコンポーネントの構成を更新する
aliyun-acr-credential-helper コンポーネントをインストールした後、イメージをプルする前に、ACK コンソールまたは kubectl を使用して [acr-configuration] ConfigMap を構成する必要があります。
ACK コンソール
[クラスタ] ページで、変更するクラスタの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[ConfigMap] ページの上部で、[名前空間] ドロップダウンリストから [kube-system] を選択します。次に、[acr-configuration ConfigMap] を見つけてパラメーターを構成します。次の表は、パラメーターについて説明しています。
キー
説明
[名前空間を監視]
シークレットを使用せずにイメージをプルする名前空間。デフォルト値: [default]。[all] の値は、Container Registry インスタンスのすべての名前空間を指定します。複数の名前空間はコンマ (,) で区切ります。このパラメーターにはビジネス名前空間を構成することをお勧めします。パラメーターを
allまたはクラスターのシステムコンポーネントが格納されている名前空間に設定すると、システムコンポーネントイメージのプルに失敗する可能性があります。[acr-api-version]
デフォルト値を使用します。
[有効期限のしきい値]
シークレットの有効期限が切れるまでの期間。デフォルト値:
15m。デフォルト値を使用することをお勧めします。デフォルト値は、シークレットの有効期限が切れる 15 分前にシークレットが自動的に更新されることを指定します。acr-registry-info
Container Registry インスタンスに関する情報。各インスタンスは、YAML ファイルの文字列型の 3 つのパラメーターで指定できます。
instanceId: Container Registry インスタンスの ID。Container Registry コンソール で ID を取得できます。重要Container Registry Personal Edition インスタンスを使用する場合は、このパラメーターを空のままにします。 Container Registry Enterprise Edition インスタンスを使用する場合は、このパラメーターを指定する必要があります。
regionId: Container Registry インスタンスのリージョン ID。Container Registry コンソール でリージョン ID を取得できます。重要リージョンをまたいでイメージをプルする場合は、このパラメーターを指定する必要があります。次の構成例を参照してください。
domains: シークレットフリーコンポーネントが Container Registry インスタンスにアクセスするために使用するドメイン名。デフォルトでは、instanceIdの ACR インスタンスのすべてのドメイン名が入力されます。特定のドメイン名を指定できます。複数のドメイン名はコンマ (,) で区切ります。
[サービスアカウント]
aliyun-acr-credential-helper に関連付けられているサービスアカウント。複数のサービスアカウントはコンマ (,) で区切ります。 [default] の値は、watch-namespace で指定されたすべての名前空間のデフォルトのサービスアカウントを指定します。アスタリスク (
*) の値は、指定された名前空間のすべてのサービスアカウントを指定します。
kubectl
次のコマンドを実行して、次の情報に基づいて
acr-configurationConfigMap を変更します。kubectl edit cm acr-configuration -n kube-systemキー
説明
値
service-account
aliyun-acr-credential-helper コンポーネントがイメージをプルするために使用するサービスアカウント。
デフォルト値: [default]。
説明複数のサービスアカウントはコンマ (,) で区切ります。アスタリスク (
*) は、すべての名前空間のすべてのサービスアカウントを指定します。acr-registry-info
Container Registry インスタンスに関する情報。各インスタンスは、YAML ファイルの文字列型の 3 つのパラメーターで指定できます。
説明インスタンスを指定するためのパラメーター:
instanceId: Container Registry インスタンスの ID。このフィールドは、Container Registry Enterprise Edition インスタンスに必要です。
regionId: Container Registry インスタンスが存在するリージョンの ID。このパラメーターはオプションです。デフォルト値は、ACK クラスタが存在するリージョンです。
domains: Container Registry インスタンスのドメイン名。このパラメーターはオプションです。デフォルトでは、インスタンスのすべてのドメイン名が指定されます。複数のドメイン名はコンマ (,) で区切ります。
Container Registry Enterprise Edition インスタンスのサンプル構成:
- instanceId: <cri-instanceId> regionId: "cn-hangzhou" domains: "xxx.com,yyy.com"watch-namespace
シークレットを使用せずにイメージをプルする名前空間。
デフォルト値: [default]。[all] の値は、Container Registry インスタンスのすべての名前空間を指定します。複数の名前空間はコンマ (,) で区切ります。
説明値を本番環境の名前空間に設定することをお勧めします。値を [all] またはクラスタのシステムコンポーネントの名前空間に設定すると、名前空間のイメージのプルに失敗する可能性があります。
expiring-threshold
キャッシュされたシークレットの有効期限が切れるまでの期間。
デフォルト値: [15m]。
説明デフォルト値を使用することをお勧めします。デフォルト値は、キャッシュされたシークレットの有効期限が切れる 15 分前にシークレットが更新されることを指定します。
イメージをプルする
シークレットフリーコンポーネントをインストールして構成した後、ワークロードの作成時にシークレットフリーコンポーネントに関連付けられているサービスアカウントを指定して、シークレットを使用せずにイメージをプルできます。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
serviceAccountName: my-service-account # シークレットフリーコンポーネントに関連付けられているサービスアカウントを指定します。
containers:
- name: nginx
image: ******.cn-hangzhou.cr.aliyuncs.com/nginx/nginx:latest # Container Registry イメージのアドレスを指定します。
ports:
- containerPort: 80注意事項
Container Registry Personal Edition インスタンスを使用する
Container Registry Personal Edition インスタンスからイメージをプルする場合は、instanceId を空のままにします。
data:
service-account: default
watch-namespace: all
expiring-threshold: 15m
notify-email: c*@example.com
acr-registry-info: |
- instanceId: "" # Container Registry Personal Edition インスタンスからイメージをプルする場合は、このパラメーターを空のままにします。
regionId: cn-xxxxaliyun-acr-credential-helper が workerRole 権限モードを使用する
aliyun-acr-credential-helper が使用する権限モードとして workerRole を選択した場合は、クラスタのワーカーロールに次の権限が必要です。
{
"Version": "1",
"Statement": [
{
"Action": [
"cr:GetAuthorizationToken",
"cr:ListInstanceEndpoint",
"cr:PullRepository"
],
"Resource": "*",
"Effect": "Allow"
}
]
}その他の操作
アカウントをまたいでイメージをプルする
aliyun-acr-credential-helper を使用すると、次の方法でアカウントをまたいで Container Registry インスタンスからイメージをプルできます。
RRSA を使用する: アカウント A のクラスタのサービスアカウントは、アカウント B のロールを想定します。サービスアカウントを使用するポッドは、アカウント B の非公開イメージをプルできます。
ワーカーロールを使用する: アカウント A のワーカーロールは、cr.* 権限を持つアカウント B の RAM ロールを想定します。次に、aliyun-acr-credential-helper はワーカーロールを使用してアカウント B の非公開イメージをプルします。この方法を使用するには、aliyun-acr-credential-helper の workerRole 権限モードを選択する必要があります。
Container Registry インスタンス所有者の RAM ユーザーの AccessKey ペアを使用する: アカウント A の aliyun-acr-credential-helper は、アカウント B の RAM ユーザーの AccessKey ペアを使用してアカウント B の非公開イメージをプルします。この方法は使いやすいですが、アカウント B の RAM ユーザーの AccessKey ペアはプレーンテキストで保存されるため、漏洩する可能性があります。
RRSA を使用する
Kubernetes 1.22 以降を実行する ACK ベーシッククラスター、ACK Pro マネージドクラスター、および ACK Serverless Pro クラスター でのみ、RRSA を構成して Container Registry Enterprise Edition インスタンスからイメージをプルできます。
RRSA 機能を有効にするには、aliyun-acr-credential-helper を v23.02.06.1-74e2172-aliyun 以降に更新する必要があります。
managed-aliyun-acr-credential-helper の RRSA 機能を有効にするには、ACK コンソールの [クラスタ情報] ページの [基本情報] タブでクラスタの RRSA を有効にし、managed-aliyun-acr-credential-helper の RRSA を構成する必要があります。 aliyun-acr-credential-helper の RRSA を構成してからクラスタの RRSA を有効にする場合は、クラスタの RRSA を有効にした後、aliyun-acr-credential-helper に対応するポッドを削除する必要があります。これにより、RRSA が有効になります。
クラスタの RRSA 機能を有効にします。詳細については、RRSA を有効にする を参照してください。
クラスタの RRSA 機能を有効にした後、クラスタ情報ページの [基本情報] タブの [セキュリティと監査] セクションで、RRSA OIDC の横にある [有効] にポインターを移動して、OIDC IdP の URL と ARN を表示し、記録します。

クラスタ所有者の RAM ユーザーに、アカウントをまたいで Container Registry リソースにアクセスするために必要な権限を付与します。
クラスタの RRSA 機能を有効にした後、次の操作を実行して、クラスタ所有者の RAM ユーザーに権限を付与する必要があります。たとえば、現在のクラスタがアカウント A にあり、Container Registry インスタンスがアカウント B にあるとします。 Container Registry インスタンスからイメージをプルする場合は、アカウント A のクラスタにアカウント B の Container Registry リソースにアクセスするための権限を付与する必要があります。
アカウント A に RAM ロールを作成し、AliyunSTSAssumeRoleAccess ポリシーを RAM ロールにアタッチします。このポリシーは、RAM ロールに他の RAM ロールを想定する権限を付与します。次のコードに示すように、RAM ロールの信頼ポリシーを変更します。
例の
<oidc_issuer_url>を、手順 1 で記録したクラスタの OIDC IdP URL に置き換えます。例の
<oidc_provider_arn>を、手順 1 で記録したクラスタの OIDC IdP 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" }アカウント B に cr.* 権限を持つ RAM ロールを作成します。 [信頼ポリシー] タブで、信頼ポリシーのプリンシパルフィールドにアカウント A の RAM ロールの ARN を入力します。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ <アカウント A に作成した RAM ロールの ARN> ] } } ], "Version": "1" }アカウント B の RAM ロールに次のポリシーをアタッチします。ポリシーは、アカウント B の RAM ロールに、Container Registry インスタンスに関する情報を取得し、インスタンスからイメージをプルする権限を付与します。
{ "Version": "1", "Statement": [ { "Action": [ "cr:GetAuthorizationToken", "cr:ListInstanceEndpoint", "cr:PullRepository" ], "Resource": "*", "Effect": "Allow" } ] }RAM ロールの [MaxSessionDuration] パラメーターを指定できます。このパラメーターの有効な値の範囲は 3600 ~ 43200 秒です。 acr-configuration ConfigMap を構成する際には、次の手順 3 で
expireDurationパラメーターを指定する必要があります。 MaxSessionDuration とexpireDurationに同じ値を指定することをお勧めします。expireDurationの値は、MaxSessionDuration の値以下にすることができます。
acr-configuration ConfigMap を構成する
次の情報に基づいて acr-configuration ConfigMap を変更します。
data: service-account: "default" watch-namespace: "all" expiring-threshold: "15m" notify-email: "c*@example.com" acr-registry-info: | - instanceId: "cri-xxx" regionId: "cn-hangzhou" domains: "instance.default.domain.com,instance.custom.domain.com" rrsaRoleARN: aUserRoleARN rrsaOIDCProviderRoleARN: aUserClusterOIDCProviderRoleARN assumeRoleARN: bUserRoleARN expireDuration: 3600 rrsa: | enable: trueパラメーター
説明
例
rrsaRoleARNアカウント A に作成した RAM ロールの ARN。
acs:ram::aaa
rrsaOIDCProviderRoleARNACK コンソールの [クラスタ情報] ページの [基本情報] タブで取得した OIDC IdP の ARN。
acs:ram::bbb
assumeRoleARNアカウント B に作成した RAM ロールの ARN。
acs:ram::ccc
expireDurationアカウント B に作成した RAM ロールのセッション期間。セッション期間は、aliyun-acr-credential-helper によって生成されるシークレットの有効期間と同じです。
重要expireDuration の値は、アカウント B の RAM ロールの MaxSessionDuration 値より大きくすることはできません。
デフォルト値: 3600。有効な値: 3600 ~ 43200。単位: 秒。
ワーカーロールを使用する
aliyun-acr-credential-helper の workerRole 権限モードを選択する必要があります。
アカウント B の RAM ロールには、Container Registry インスタンスの指定された非公開リポジトリから非公開イメージをプルするための [cr.*] 権限が必要です。
アカウント B は、アカウント A の ACK クラスタのワーカーロールがアカウント B の RAM ロールを想定することを許可します。このルールでは、アカウント B の RAM ロールの信頼ポリシーを変更する必要があります。
アカウント A の ACK クラスタのワーカーロールには、アカウント B の RAM ロールを想定する権限が必要です。このルールでは、アカウント A のワーカーロールに AliyunAssumeRoleAccess ポリシーをアタッチする必要があります。
アカウント B の RAM ロールを作成します。RAM ロールの信頼できるエンティティとして [クラウドアカウント] を指定します。 RAM ロールに、アカウント B の Container Registry インスタンスから非公開イメージをプルするために必要な権限が付与されていることを確認します。詳細については、信頼できる Alibaba Cloud アカウントの RAM ロールを作成する を参照してください。
{ "Version": "1", "Statement": [ { "Action": [ "cr:GetAuthorizationToken", "cr:ListInstanceEndpoint", "cr:PullRepository" ], "Resource": "*", "Effect": "Allow" } ] }アカウント B の RAM ロールの信頼ポリシーを変更して、アカウント A の ACK クラスタのワーカーロールがアカウント B の RAM ロールを想定できるようにします。
ACK クラスタのワーカーロールの ARN を取得します。
RAM ロールの ARN を取得する方法については、RAM ロールの ARN を表示する方法 を参照してください。
アカウント B の RAM ロールの信頼ポリシーを変更します。
RAM コンソール にログインします。左側のナビゲーションウィンドウで、[ロール] をクリックします。 [ロール] ページで、アカウント B の RAM ロールを見つけて、ロール名をクリックします。
RAM ロールの詳細ページで、[信頼ポリシー] タブをクリックし、信頼ポリシーのプリンシパルフィールドにアカウント A のワーカーロールの ARN を入力します。

アカウント A の ACK クラスタのワーカーロールに AssumeRole 権限が付与されているかどうかを確認します。詳細については、ポリシーに関する情報を表示する を参照してください。

acr-configuration ConfigMap に assumeRoleARN パラメーターを追加します。
assumeRoleARN パラメーターの値を、アカウント B の RAM ロールの ARN に設定します。 RAM ロールの ARN を取得する方法については、RAM ロールの ARN を表示する方法 を参照してください。次の JSON ファイルは、acr-configuration のサンプル構成を示しています。
data: service-account: "default" watch-namespace: "all" expiring-threshold: "15m" notify-email:"c*@example.com" acr-registry-info: | - instanceId: "" regionId: "cn-beijing" domains: "registry.cn-beijing.aliyuncs.com" assumeRoleARN: "acs:ram::.*:role/kubernetesworkerrole-test" expireDuration: 3600
Container Registry インスタンス所有者の RAM ユーザーの AccessKey ペアを使用する
サービスアカウントのインスタント使用を確実にするために Webhook 機能を有効にする
Webhook 機能を有効にするには、aliyun-acr-credential-helper を v23.02.06.1-74e2172-aliyun 以降に更新する必要があります。
Webhook 機能を有効にすると、シークレットフリーコンポーネントは Webhook 機能を使用して、クラスタ内のサービスアカウントの変更を監視します。サービスアカウントが作成されると、シークレットフリーコンポーネントはすぐにシークレットをサービスアカウントに挿入します。サービスアカウントの作成直後にサービスアカウントを使用する場合 (たとえば、Helm チャートを使用してサービスアカウントとデプロイメントを作成する場合) は、Webhook 機能を有効にできます。 Webhook 機能は、シークレットフリーコンポーネントのパフォーマンスに影響を与える可能性があります。他のシナリオでは、Webhook 機能を有効にしないことをお勧めします。
Webhook 機能を使用するには、[acr-configuration] ConfigMap に次のパラメーターを追加する必要があります。
data:
webhook-configuration: |
enable: true
failure-policy: Ignore
timeout-seconds: 10パラメーター | 説明 |
| Webhook 機能を有効にするかどうかを指定します。
|
| Webhook 機能が期待どおりに動作しない場合にサービスアカウントを処理する方法を指定します。
重要 クラスタ API サーバー の制限により、 |
| サービスアカウントを作成するリクエストのタイムアウト期間。サービスアカウントを作成するリクエストがタイムアウトすると、システムは |
参考資料
aliyun-acr-credential-helper のリリースノートについては、aliyun-acr-credential-helper を参照してください。

