Container Compute Service (ACS)では、Container Registry (ACR) からシークレットを使用せずにイメージをプルすることができ、イメージプルの効率とセキュリティを向上させることができます。このトピックでは、ACS クラスタ内のコンテナレジストリインスタンスからシークレットを使用せずにイメージをプルする方法について説明します。
背景情報
Container Registry (ACR) は、さまざまな標準クラウドネイティブアーティファクトの安全なホスティングと効率的な配信サービスを提供します。コンテナレジストリは、個人版インスタンスとエンタープライズ版インスタンスを提供します。詳細については、コンテナレジストリとは を参照してください。コンテナレジストリインスタンスのさまざまなバージョンに対して、ACS はシークレットを使用せずにイメージをプルするための統一された構成方法を提供します。
ACS クラスタのシークレットフリーサービスを構成すると、ACS クラスタの作成時に、ACS クラスタはコンテナレジストリインスタンスのイメージに認証情報を自動的に挿入します。これにより、インスタンスの作成プロセスを簡素化し、パスワードの漏洩を防ぎ、セキュリティを強化できます。
イメージがコンテナレジストリインスタンスに保存されていない場合 (Docker イメージや自己管理リポジトリのイメージなど)、シークレットを使用せずにイメージをプルすることはできません。
前提条件
開始する前に、以下のタスクが完了していることを確認してください。
ACS クラスタが作成されていること。詳細については、ACS クラスタの作成 を参照してください。
コンテナレジストリインスタンスが作成され、イメージリポジトリやイメージなどの関連設定がインスタンスに対して完了していること。
コンテナレジストリ個人版インスタンスの構成方法の詳細については、コンテナレジストリ個人版インスタンスを使用してイメージをプッシュおよびプルする を参照してください。
コンテナレジストリエンタープライズ版インスタンスの構成方法の詳細については、コンテナレジストリエンタープライズ版インスタンスを使用してイメージをプッシュおよびプルする を参照してください。
コンテナレジストリインスタンスがエンタープライズ版インスタンスの場合、インスタンスのアクセス方法が構成されている必要があります。
デフォルトでは、新しく作成されたコンテナレジストリエンタープライズ版インスタンスはすべてのネットワークから切断されています。インターネットまたは仮想プライベートクラウド (VPC) 経由でインスタンスへのアクセスを許可するには、アクセス制御リスト (ACL) を構成する必要があります。
インターネット経由: エンタープライズ版インスタンスのインターネットアクセスを有効にすると、エンタープライズ版インスタンスのパブリックエンドポイントを使用して、リージョンをまたがってエンタープライズ版インスタンスのイメージにアクセスできます。詳細については、インターネットアクセスの有効化 を参照してください。
VPC 経由: VPC 経由でコンテナエンタープライズ版インスタンスにアクセスするには、関連する承認を有効にする必要があります。詳細については、VPC ACL の構成 を参照してください。
使用上の注意
プライベートイメージをプルするには、aliyun-acr-credential-helper コンポーネントがコンソールで設定を読み取る必要があります。aliyun-acr-credential-helper コンポーネントを構成すると、コンポーネントはクラスタ内にシークレットを生成し、acr-configuration ConfigMap で指定したサービスアカウントにシークレットを関連付けます。デフォルトでは、このサービスアカウントを使用するすべての Pod は、生成されたシークレットを使用してパスワードなしでイメージをプルします。
aliyun-acr-credential-helper コンポーネントのインストールと構成
ACS コンソール にログオンします。左側のナビゲーションペインで、クラスタ をクリックします。
クラスタ ページで、管理するクラスタを見つけ、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、操作 > アドオン を選択します。
アドオン ページで、セキュリティ タブをクリックし、Aliyun-acr-credential-helper (マネージド) カードを見つけ、カードの右下隅にある インストール をクリックします。
Aliyun-acr-credential-helper のインストール ページで、AcrInstanceInfo の横にある + 追加 をクリックして、複数のコンテナレジストリインスタンスを追加します。aliyun-acr-credential-helper コンポーネントを構成し、OK をクリックします。次の表にパラメータを示します。
AcrInstanceInfo の横にある + 追加 をクリックします。
説明以下の内容は、デフォルトのシナリオでの構成方法について説明しています。
コンテナレジストリ個人版インスタンスからイメージをプルする場合、AcrInstanceInfo セクションのデフォルトパラメータを使用できます。
コンテナレジストリエンタープライズ版インスタンスからイメージをプルする場合、instanceID パラメータを指定し、AcrInstanceInfo セクションの他のパラメータにはデフォルト値を使用する必要があります。
パラメータ
説明
値
instanceID
コンテナレジストリインスタンスの ID。
コンテナレジストリ で作成したインスタンスを見つけます。
エンタープライズ版: インスタンス セクションの インスタンス ID を表示します。値は
cri-
で始まる文字列です。個人版: シークレットを使用せずにコンテナレジストリ個人版インスタンスからイメージをプルする場合は、このパラメータを空のままにします。
デフォルトでは、このパラメータは空のままになっており、コンテナレジストリ個人版インスタンスが選択されていることを示します。
regionID
コンテナレジストリインスタンスのリージョン ID。
リージョン ID (例: インスタンスが中国 (杭州) リージョンにある場合は
cn-hangzhou
)。デフォルトでは、ACS クラスタのリージョンが選択されています。コンテナレジストリインスタンスが ACS クラスタと同じリージョンにある場合は、このパラメータを空のままにします。
domains
コンテナレジストリインスタンスのドメイン名。
複数のドメイン名はカンマ (,) で区切ります。
デフォルトでは、コンテナレジストリインスタンスの インスタンス ID に対応するすべてのドメイン名 (registry.* (パブリックドメイン名)、registry-vpc.* (VPC ドメイン名)、registry-internal.* (プライベートドメイン名) など) が指定されます。
assumeRoleARN
イメージリポジトリオーナーがアシュームする RAM ロールの Alibaba Cloud Resource Name (ARN)。これは、アカウントをまたいでイメージをプルする の手順 4 で取得できます。このパラメータはオプションです。アカウントをまたいでイメージをプルしない場合は、このパラメータを空のままにします。
例: acs:ram::123456789012****:test-rrsa-acr。
このパラメータはデフォルトでは空のままです。
expireDuration
Alibaba Cloud アカウントをまたいでイメージをプルするために使用されるシークレットの有効期間。このパラメータはオプションです。アカウントをまたいでイメージをプルしない場合は、このパラメータを空のままにします。
重要expireDuration パラメータの値は、アカウントをまたいでイメージをプルする の手順 4 でイメージリポジトリオーナーがアシュームする RAM ロールの MaxSessionDuration パラメータの値以下にする必要があります。
デフォルト値:
3600
。rrsaRoleARN
ACS クラスタのオーナーがアシュームする RAM ロールの ARN。これは、アカウントをまたいでイメージをプルする の手順 3 で取得できます。このパラメータはオプションです。アカウントをまたいでイメージをプルしない場合は、このパラメータを空のままにします。
例: acs:ram::987654321012****:demo-role-for-rrsa。
このパラメータはデフォルトでは空のままです。
rrsaOIDCProviderRoleARN
ACS クラスタの RRSA Openid Connect (OIDC) プロバイダの ARN。これは、アカウントをまたいでイメージをプルする の手順 2 で取得できます。このパラメータはオプションです。アカウントをまたいでイメージをプルしない場合は、このパラメータを空のままにします。
例: acs:ram::987654321012****:oidc-provider/ack-rrsa-abcd1234****。
このパラメータはデフォルトでは空のままです。
次の表にその他のパラメータを示します。
パラメータ
説明
値
RRSA を有効にするかどうかを指定します。
チェックボックスをオンにして、クラスタと aliyun-acr-credential-helper コンポーネントの RAM Roles for Service Accounts (RRSA) 機能を構成すると、この機能が有効になります。
デフォルトでは、このオプションは選択されていません。RRSA を構成し、このチェックボックスをオンにすると、アカウントをまたいでイメージをプル できます。
watchNamespace
シークレットを使用せずにイメージをプルするネームスペース。
デフォルト値:
default
。値が all に設定されている場合、すべてのネームスペースからシークレットを使用せずにイメージをプルできます。複数のネームスペースはカンマ (,) で区切ります。説明本番環境のネームスペースに値を設定することをお勧めします。クラスタのシステムコンポーネントの値を all またはネームスペースに設定すると、ネームスペース内のイメージのプルに失敗する可能性があります。
serviceAccount
aliyun-acr-credential-helper がイメージをプルするために使用するサービスアカウント。
デフォルト値:
default
。説明複数のサービスアカウントはカンマ (,) で区切ります。パラメータをアスタリスク (*) に設定すると、指定されたネームスペース内のすべてのサービスアカウントが使用されます。
expiringThreshold
キャッシュされたシークレットの有効期限。
デフォルト値:
15 分
。説明このパラメータを 15 分に設定することをお勧めします。デフォルト値は、シークレットが有効期限の 15 分前に更新されることを指定します。
notifyEmail
aliyun-acr-credential-helper によって生成されるシークレットの電子メールマーク。
デフォルト値:
xxx@aliyun.com
。
アカウントをまたいでイメージをプルする
RRSA を使用してアカウントをまたいでイメージをプルする
RAM Roles for Service Accounts (RRSA) 機能を使用して、ACS クラスタ内の Pod の権限を分離できます。ACS クラスタの RRSA 機能を有効にし、RAM ロールの ARN をさまざまなイメージリポジトリオーナーに配布できます。このようにして、aliyun-acr-credential-helper を使用すると、アカウントをまたいでコンテナレジストリインスタンスからイメージをプルできます。
コンテナレジストリエンタープライズ版インスタンス (ベーシック、スタンダード、アドバンスト) のみ RRSA をサポートしています。
RRSA 機能を有効にした後、aliyun-acr-credential-helper によって生成されたシークレットを使用して、コンテナレジストリ個人版インスタンスからプライベートイメージをプルすることはできません。RRSA 機能を有効にした後、このトピックで説明されている AccessKey ペア方式などの他の認証方式を使用することはできません。
シークレットを使用せずにイメージをプルするために RRSA を構成する前に、クラスタの RRSA 機能を有効にする必要があります。aliyun-acr-credential-helper の RRSA を構成してから ACK コンソールでクラスタの RRSA を有効にする場合は、RRSA を構成した後に aliyun-acr-credential-helper に対応する Pod を削除する必要があります。これにより、RRSA が有効になります。
ACS クラスタの RRSA 機能を有効にする 詳細については、RRSA の有効化 を参照してください。
ACS はクラスタの RRSA OIDC プロバイダを自動的に作成します。ACS コンソールで、 を選択して、プロバイダ URL と プロバイダ ARN を表示します。
クラスタオーナーは OIDC プロバイダを使用して RAM ロールを構成し、ロールをアシュームする権限を付与します。
OIDC プロバイダを使用して RAM ロールを作成する か、既存の RAM ロールを OIDC プロバイダに関連付ける と、aliyun-acr-credential-helper は RAM ロールを使用して API 操作を呼び出すことができます。
OIDC プロバイダを使用して RAM ロールを作成する
RAM コンソール に Alibaba Cloud アカウントでログオンします。
左側のナビゲーションペインで、 を選択します。ロール ページで、ロールの作成 をクリックします。
ロールの作成 パネルで、信頼できるエンティティの選択で IdP を選択し、次へ をクリックします。
ロールの構成 ウィザードページで、次のパラメータを設定し、OK をクリックします。
次の表に、この例で構成されているパラメータを示します。
パラメータ
説明
RAM ロールの名前
値を demo-role-for-rrsa に設定します。
メモ
オプション。RAM ロールの説明。
Idp タイプ
OIDC が選択されています。
Idp の選択
acs-rrsa-<cluster_id>。<cluster_id> はクラスタの ID を示します。
条件
oidc:iss: デフォルト値を使用します。
oidc:aud: sts.aliyuncs.com を選択します。
oidc:sub: 条件演算子を StringEquals に設定し、system:serviceaccount:<namespace>:<serviceAccountName> 形式で値を入力します。
<namespace>: アプリケーションのネームスペース。
<serviceAccountName>: サービスアカウントの名前を指定します。
aliyun-acr-credential-helper の要件に従って、
system:serviceaccount:kube-system:aliyun-acr-credential-helper
を入力する必要があります。
既存の RAM ロールを OIDC プロバイダに関連付ける
RAM コンソール に Alibaba Cloud アカウントでログオンします。
左側のナビゲーションペインで、 を選択し、管理する RAM ロールをクリックします。
信頼ポリシー タブで、信頼ポリシーの編集 をクリックします。 詳細については、RAM ロールの信頼ポリシーの編集 を参照してください。
次の内容を
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>" ] } }
重要<oidc_issuer_url>
と<oidc_provider_arn>
を、手順 2 で取得した プロバイダ URL と プロバイダ ARN に置き換えます。
AliyunSTSAssumeRoleAccess
ポリシーを RAM ロールに付与する と、aliyun-acr-credential-helper はロールをアシュームできます。詳細については、RAM ロールへの権限の付与 を参照してください。を選択して、RAM ロールの ARN を表示します。
イメージリポジトリオーナーは、クラスタオーナーの RAM ロールを信頼し、イメージをプルする権限を付与する RAM ロールを構成します。
RAM ロールを作成する。詳細については、信頼できる Alibaba Cloud アカウントの RAM ロールの作成 を参照してください。
ACS クラスタの RAM ロールを信頼し、リポジトリオーナーのロールをアシュームできるようにする。詳細については、RAM ロールの信頼ポリシーの編集 を参照してください。ポリシーの例:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "<acs_role_arn>" ] } } ], "Version": "1" }
重要<acs_role_arn>
を、手順 3 で取得した ACS クラスタオーナーがアシュームする RAM ロールの ARN に置き換えます。RAM ロールにイメージプル権限を付与する
JSON タブでカスタムポリシーを作成する。ポリシーの 名前 を
AliyunCreateSLRForIoTCloudSource
に設定することをお勧めします。次のサンプルコードは、ポリシーのドキュメントを示しています。 詳細については、カスタムポリシーの作成 を参照してください。{ "Version": "1", "Statement": [ { "Action": [ "cr:GetAuthorizationToken", "cr:ListInstanceEndpoint", "cr:PullRepository" ], "Resource": "*", "Effect": "Allow" } ] }
RAM ロールに
AliyunACRBasicAccess
権限を付与する。 詳細については、RAM ロールへの権限の付与 を参照してください。
RAM ロールの MaxSessionDuration パラメータを構成できます。このパラメータはオプションです。有効な範囲は 3600 秒から 43200 秒です。MaxSessionDuration パラメータが構成されている場合は、AcrInstanceInfo セクションの expireDuration パラメータを構成する必要があります。
を選択して、RAM ロールの ARN を表示します。
aliyun-acr-credential-helper を構成するときに、RRSA を有効にするかどうかを指定します チェックボックスをオンにします。 AcrInstanceInfo セクションのパラメータを構成します。
次の内容に基づいて、AcrInstanceInfo セクションのパラメータを変更します。
パラメータ
説明
値
RRSA を有効にするかどうかを指定します。
チェックボックスをオンにして、クラスタと aliyun-acr-credential-helper コンポーネントの RRSA 機能を構成すると、この機能が有効になります。
チェックボックスをオンにします。
rrsaRoleARN
ACS クラスタのオーナーがアシュームする RAM ロールの ARN。これは、手順 3 で取得できます。
<acs_role_arn>
rrsaOIDCProviderRoleARN
RRSA OIDC プロバイダの ARN。これは、手順 2 で取得できます。
oidc_provider_arn
assumeRoleARN
イメージリポジトリオーナーがアシュームする RAM ロールの ARN。これは、手順 4 で取得できます。
<acr_role_arn>
expireDuration
aliyun-acr-credential-helper によって生成されるシークレットの有効期間。
重要expireDuration パラメータの値は、手順 4 でイメージリポジトリオーナーがアシュームする RAM ロールの MaxSessionDuration パラメータの値以下にする必要があります。
デフォルト値: 3600。有効な値: 3600 から 43200。単位: 秒。