Container Service for Kubernetes (ACK) クラスターのaliyun-acr-credential-helperコンポーネントを設定して、ACKクラスターのContainer Registry Enterprise Editionインスタンスからプライベートイメージをプルするときに自動的にシークレットを取得できます。 これにより、ユーザー名と秘密を手動で提供する必要がなくなります。
前提条件
ACK管理クラスターが作成されます。 詳細については、「ACK管理クラスターの作成」または「ACK専用クラスターの作成」をご参照ください。
クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターを接続します。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
使用上の注意
aliyun-acr-credential-helperコンポーネントは、ACKクラスターのkube-system名前空間のacr-configuration ConfigMapから設定を読み取り、プライベートイメージをプルします。 aliyun-acr-credential-helperコンポーネントを設定すると、このコンポーネントはクラスターにシークレットを生成し、そのシークレットをacr-configuration ConfigMapで指定したサービスアカウントに関連付けます。 既定では、このサービスアカウントを使用するすべてのポッドは、コンポーネントによって生成されたシークレットを使用してイメージをプルします。 これにより、画像をプルするときに他のシークレットを使用する必要がなくなります。
Helmグラフなどのアプリケーションをデプロイするためのサービスアカウントを作成する場合、サービスアカウントはaliyun-acr-credential-helperによって生成されるシークレットに関連付けられる期間を必要とします。 画像を取得する前に、webhook機能を使用してサービスアカウントにシークレットを挿入することをお勧めします。 詳細については、このトピックの「FAQ」セクションを参照してください。
次の表では、aliyun-acr-credential-helperコンポーネントを使用してシークレットを使用せずにプライベートイメージをプルする場合の制限について説明します。
項目 | 使用状況ノート |
ミラーリング |
|
クラスタータイプとバージョン |
|
注意事項
項目 | 注意 |
imagePullSecrets |
|
ServiceAccount |
|
リージョン | プルするプライベートイメージがACKクラスターのリージョンにあるかどうかを確認します。 デフォルトでは、ACKクラスターのリージョンにあるContainer Registryインスタンスからのみプライベートイメージをプルできます。 リージョン間で画像をプルする場合は、このトピックの「シナリオ2: リージョン間で画像をプルする」を参照してください。 |
YAML 形式 | kube-system名前空間のacr-configuration ConfigMapを変更する場合は、このトピックの例と同じインデントを使用するようにしてください。 このトピックで提供されているYAMLコンテンツをエディターに貼り付け、対応する値を置き換えてから、設定を適用することをお勧めします。 これにより、ConfigMapの形式が有効になります。 |
手順1: aliyun-acr-credential-helperコンポーネントのインストール
aliyun-acr-credential-helperコンポーネントをインストールした場合は、そのコンポーネントが最新バージョンであることを確認してください。 それ以外の場合は、コンポーネントを更新します。 コンポーネントを更新してもビジネスには影響しません。 詳細については、「コンポーネントの管理」をご参照ください。 aliyun-acr-credential-helperコンポーネントの詳細については、「aliyun-acr-credential-helper」をご参照ください。
aliyun-acr-credential-helperコンポーネントが最新バージョンに更新されると、コンポーネントが依存するRAMロールが変更されます。 コンポーネントは、コンポーネントが依存するRAMロールを指定できるように、tokenModeパラメーターを提供します。 コンポーネントが依存するRAMロールの変更による影響の詳細については、「 [製品の変更] aliyun-acr-credential-helperが依存するアクセス許可の取り消し」をご参照ください。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
アドオンページをクリックし、セキュリティタブ、検索aliyun-acr-credential-helperをクリックし、インストール.
[パラメーター] ページで、tokenModeパラメーターのデフォルト値autoを使用し、[OK] をクリックします。
ACK管理クラスターを最新バージョンに更新すると、aliyun-acr-credential-helperコンポーネントがtokenModeパラメーターを提供します。 コンポーネントのインストール後にパラメーターを変更できます。 コンポーネントが変更されると、システムはコンポーネントのポッドを再作成します。 表に記載されている古いクラスタは、2023年4月3日より前に作成されたクラスタを指し、新しいクラスタは、2023年4月3日以降に作成されたクラスタを指す。 次の表に、tokenModeパラメーターの有効な値を示します。
tokenMode
説明
auto
デフォルト値であるmanagedRoleモードを使用するかどうかを自動的に決定します。 新しいクラスターにはmanagedRoleモードを、古いクラスターにはworkerRoleモードを使用します。
managedRole
managedRoleモードを使用します。
workerRole
workerRoleモードを使用します。
ステップ2: 設定の変更
Container Registry Enterprise Editionインスタンスの設定を変更するには、次の操作を実行します。 Container Registry Personal Editionインスタンスの設定を変更する方法については、このトピックの「Container Registry Personal Editionインスタンスからプライベートイメージをプルする方法」を参照してください。
aliyun-acr-credential-helperコンポーネントをインストールした後、イメージをプルする前にacr-configuration ConfigMapを設定する必要があります。
ACKコンソールの使用
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 表示されるページの左側のナビゲーションウィンドウで、[設定] > [設定] を選択します。
ConfigMapページの上部で、名前空間ドロップダウンリストからkube-systemを選択します。 次に、acr-configurationを見つけて値を設定します。
acr-configuration ConfigMapが存在しない場合は、acr-configurationという名前のConfigMapを作成します。 詳細については、「ConfigMapsの管理」トピックの「ConfigMapの作成」セクションをご参照ください。 ConfigMapsの更新方法については、「ConfigMapsの管理」をご参照ください。
ConfigMapのキーと値を設定するには、[操作] 列の [編集] をクリックします。
ConfigMapのキーと値を設定するには、[操作] 列の [YAMLの編集] をクリックします。
kubectlの使用
次のコマンドを実行して、acr-configuration ConfigMapの編集ページに移動します。
kubectl edit cm acr-configuration -n kube-system
要件に基づいて、acr-configuration ConfigMapのパラメーターを設定します。
次の表に、acr-configuration ConfigMapのキーと値を示します。
キー
説明
値
service-account
aliyun-acr-credential-helperコンポーネントがイメージをプルするために使用するサービスアカウント。
デフォルト値: Default。
説明複数のサービスアカウントをコンマ (,) で区切ります。 アスタリスク (
*
) は、すべての名前空間内のすべてのサービスアカウントを指定します。acr-registry-info
Container Registryインスタンスに関する情報。 各インスタンスは、YAMLファイルのstring型の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インスタンスのすべての名前空間を指定します。 複数の名前空間は、コンマ (,) で区切ります。
説明値を本番の名前空間に設定することを推奨します。 値をクラスターのシステムコンポーネントのすべてまたは名前空間に設定すると、名前空間内のイメージがプルされない場合があります。
expiring-threshold
キャッシュされたシークレットが期限切れになるまでの期間。
デフォルト値: 15m。
説明デフォルト値を使用することを推奨します。 デフォルト値は、キャッシュされたシークレットの有効期限が切れる15分前にシークレットが更新されることを指定します。
ステップ3: さまざまなシナリオで画像をプルする
プライベートイメージをプルするために必要なアクセス許可は、シナリオによって異なります。
シナリオ | 説明 | |
同じアカウント内で画像を取得したい場合。 デフォルトでは、aliyun-acr-credential-helperコンポーネントは同じアカウント内のプライベートイメージを取得します。 | ||
リージョン間で画像を取得したい場合。 | ||
サービスアカウント (RRSA) のRAMロールを設定して、アカウント間でイメージをプルする | アカウント間で画像をプルしたい。 | |
アカウント間でイメージをプルするRAMロールを想定する |
| |
RAMユーザーのAccessKey IDとAccessKey secretを使用して、アカウント間でイメージをプルする | アカウント間で画像をプルしたい。 RAMユーザーのAccessKey IDとAccessKeyシークレットを使用してイメージをプルする場合は、acr-configuration ConfigMapでAccessKeyペアを指定する必要があります。 この場合、AccessKeyペアが漏洩する可能性があります。 データのセキュリティを確保するために、AccessKeyペアが属するRAMロールにイメージをプルする権限のみが付与されていることを確認します。 他の2つの方法を使用して、アカウント間で画像をプルすることを推奨します。 |
次のシナリオに基づいて、必要な権限を設定します。
シナリオ1: 同じアカウント内の画像をプルする
カスタムポリシーを作成し、次の内容をポリシーに追加します。 詳細については、[製品の変更] ACK管理クラスターのワーカーRAMロールの権限が取り消されるトピックの「ステップ1: カスタムポリシーの作成」セクションをご参照ください。
{ "Version": "1", "Statement": [ { "Action": [ "cr:GetAuthorizationToken", "cr:ListInstanceEndpoint", "cr:PullRepository" ], "Resource": "*", "Effect": "Allow" } ] }
クラスターのワーカーRAMロールにカスタムポリシーをアタッチします。 詳細については、「 [製品の変更] ACK管理クラスターのワーカーRAMロールの権限が取り消される」の「ステップ2: カスタムポリシーをワーカーRAMロールにアタッチする」をご参照ください。
Container Registry Enterprise Editionインスタンスからプライベートイメージをプルするには、次のサンプルコードに基づいてacr-configuration ConfigMapを変更します。
data: service-account: "default" watch-namespace: "all" expiring-threshold: "15m" notify-email:"c*@aliyuncs.com" acr-registry-info:| - instanceId: "cri-instanceId" regionId: "cn-hangzhou" domains: "instance.default.domain.com,instance.custom.domain.com"
シナリオ2: リージョン間で画像をプルする
ACKクラスターとは異なるリージョンにあるContainer Registryインスタンスからイメージをプルする場合は、acr-configuration ConfigMapを変更する必要があります。
クロスリージョンイメージプルを有効にすると、aliyun-acr-credential-helperコンポーネントはインターネット経由でターゲットリージョンにAPIリクエストを送信します。 クラスターのインターネットアクセスを有効にする必要があります。
たとえば、中国 (北京) と中国 (杭州) のリージョンにあるContainer Registryインスタンスからイメージをプルする場合は、次のサンプルコードに基づいてacr-configuration ConfigMapを変更します。
data:
service-account: "default"
watch-namespace: "all"
expiring-threshold: "15m"
notify-email:"c*@aliyuncs.com"
acr-registry-info: |
- instanceId: "cri-instanceId"
regionId: "cn-beijing"
- instanceId: "cri-instanceId"
regionId: "cn-hangzhou"
シナリオ3: アカウント間で画像をプルする
次のいずれかの方法を使用して、アカウント間で画像をプルできます。
RRSAを設定してアカウント間でイメージをプルする: アカウントAはアカウントBのRAMロールを引き受け、アカウントBのContainer Registryインスタンスからプライベートイメージをプルします。
RAMロールを引き受けてアカウント間でイメージをプルする: アカウントaはアカウントBのRAMロールを引き受け、アカウントBのContainer Registryインスタンスからプライベートイメージをプルします。
RAMユーザーのAccessKeyペアを使用してアカウント間でイメージをプルする: アカウントaは、アカウントBのAccessKeyペアを使用して、アカウントBのContainer Registryインスタンスからプライベートイメージをプルします。
RRSAを設定してアカウント間でイメージをプル
RRSA機能を使用して、クラスター内のポッドでアクセス制御を実行できます。
v1.22以降のクラスターでのみ、Container Registry Enterprise Editionインスタンス (Basic EditionおよびAdvanced Editionインスタンスを含む) からイメージをプルするようにRRSAを設定できます。 v1.22以降のクラスターには、ACK Basicクラスター、ACK Proクラスター、ACK Serverless Basicクラスター、ACK Serverless Proクラスターが含まれます。
RRSA機能を有効にするには、aliyun-acr-credential-helperコンポーネントをv23.02.06.1-74e2172-aliyun以降に更新する必要があります。
aliyun-acr-credential-helperのRRSA機能を有効にするには、ACKコンソールの [クラスター情報] ページの [基本情報] タブでRRSAを有効にしてから、aliyun-acr-credential-helperのRRSAを設定する必要があります。 aliyun-acr-credential-helperにRRSAを設定し、ACKコンソールの [クラスター情報] ページの [基本情報] タブでRRSAを有効にする場合、RRSAの設定後にaliyun-acr-credential-helperに対応するポッドを削除する必要があります。 これにより、RRSAが有効になります。
クラスターのRRSA機能を有効にします。 詳細については、「RRSAを使用して異なるポッドに異なるクラウドサービスへのアクセスを許可する」トピックの「RRSAの有効化」セクションをご参照ください。
アカウント間でContainer Registryリソースにアクセスするために必要な権限を付与します。
クラスターでRRSA機能を有効にした後、次の手順を実行して、RRSA for aliyun-acr-credential-helperを有効にする必要があります。 たとえば、現在のクラスターはアカウントAにあり、Container RegistryインスタンスはアカウントBにあります。Container Registryインスタンスからイメージを取得する場合は、アカウントAのクラスターにアカウントBのContainer Registryリソースにアクセスする権限を付与する必要があります。
アカウントaのRAMロールの設定
アカウントaでRAMロールを作成し、AliyunSTSAssumeRoleAccessポリシーをRAMロールに関連付けます。 このポリシーは、アカウントAのロールを引き受ける権限をRAMロールに付与します。RAMロールの信頼ポリシーを変更します。
例の <oidc_issuer_url> を、クラスターのOpenID Connect (OIDC) プロバイダーのURLに置き換えます。 URLは、ACKコンソールの [クラスター情報] ページの [基本情報] タブで取得できます。
例の <oidc_provider_arn> を、クラスターのOIDCプロバイダーのAlibaba Cloud Resource Name (ARN) に置き換えます。 ARNは、ACKコンソールの [クラスター情報] ページの [基本情報] タブで取得できます。
{ "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にContainer Registry関連の権限を持つRAMロールを作成します。[信頼ポリシー管理] タブで、信頼ポリシーの [プリンシパル] フィールドにアカウントaのRAMロールのARNを入力します。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ <ARN of the RAM role that you created for Account A> ] } } ], "Version": "1" }
ユーザーがContainer Registryインスタンスの情報を取得し、インスタンスからアカウントBのRAMロールにイメージをプルできるようにするポリシーをアタッチします。
{ "Version": "1", "Statement": [ { "Action": [ "cr:GetAuthorizationToken", "cr:ListInstanceEndpoint", "cr:PullRepository" ], "Resource": "*", "Effect": "Allow" } ] }
RAMロールのMaxSessionDurationパラメーターを設定できます。 このパラメーターの有効値は3600〜43200秒です。 手順3でacr-configuration ConfigMapを設定するときは、expireDurationパラメーターを設定する必要があります。 MaxSessionDurationとexpireDurationに同じ値を指定することを推奨します。 expireDurationの値は、MaxSessionDurationの値以下とすることができる。
acr-configuration ConfigMapの設定
次の情報に基づいて、acr-configuration ConfigMapを変更します。
data: service-account: "default" watch-namespace: "all" expiring-threshold: "15m" notify-email: "c*@aliyuncs.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
rrsaOIDCProviderRoleARN
ACKコンソールの [クラスター情報] ページの [基本情報] タブで取得したOIDCプロバイダーの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 です。 単位は秒です。
アカウントBのRAMロールのMaxSessionDurationを43200に設定します。
RAMロールを引き受けてアカウント間でイメージをプル
RAMユーザーのAccessKeyペアを使用してアカウント間でイメージをプルする
よくある質問
Container Registry Personal Editionインスタンスからプライベートイメージをプルするにはどうすればよいですか。
Container Registry Personal EditionインスタンスからEnterprise Editionインスタンスにイメージを移行する場合、Enterprise EditionインスタンスおよびPersonal Editionインスタンスからプライベートイメージをプルすることができます。 この場合、次のサンプル設定に基づいてacr-configuration
ConfigMapを変更する必要があります。 Container Registry Personalインスタンスにイメージをプッシュする方法と、Container Registry Personalインスタンスからイメージをプルする方法については、「Container Registry Personalインスタンスにイメージをプッシュする方法と、Container Registry Personalインスタンスからイメージをプルする方法」をご参照ください。
acr-configuration ConfigMapを変更する前に、#-instanceId
から#
を削除します。
data:
service-account: "default"
watch-namespace: "all"
expiring-threshold: "15m"
notify-email:"cs@aliyuncs.com"
acr-registry-info: |
- instanceId: ""
regionId: cn-xxxx
webhook機能を有効にするにはどうすればよいですか?
webhook機能を有効にすると、Secretsはすぐに新しく作成されたサービスアカウントに挿入されます。 この機能は、Helmグラフを使用してサービスアカウントと一緒にサービスアカウントを作成するシナリオなど、遅滞なくサービスアカウントにSecretsを挿入するシナリオに適用されます。 他のシナリオでは、この機能を無効にすることを推奨します。
webhook機能を有効にするには、aliyun-acr-credential-helperコンポーネントをv23.02.06.1-74e2172-aliyun以降に更新する必要があります。
コンポーネントを最新バージョンに更新した後、次の情報に基づいてacr-configuration ConfigMapを変更する必要があります。
data:
webhook-configuration: |
enable: true
failure-policy: Ignore
timeout-seconds: 10
表 1. キーと値
キー | 説明 | 値 |
enable | webhook機能を有効にするかどうかを指定します。 | 有効な値は、true および false です。 デフォルト値:false |
失敗ポリシー | webhook機能が期待どおりに機能しない場合の障害処理ポリシー。 | 有効な値: IgnoreとFail。
クラスターAPIサーバーの制限により、timeout-secondsが15に設定され、Fail-policyがfailに設定され、1秒間に10個のサービスアカウントが作成されると、タイムアウトエラーによりサービスアカウントの作成に失敗する可能性があります。 |
timeout-秒 | サービスアカウントの作成要求のタイムアウト期間。 failure-policyは、サービスアカウントの作成要求がタイムアウトしたときに適用されます。 | デフォルト値は 10 です。 単位は秒です。 ユニットを指定する必要はありません。 |