シークレットフリーコンポーネントは、コンテナイメージをプルするための認証プロセスを自動化します。これにより、imagePullSecrets を繰り返し設定する必要がなくなります。このトピックでは、シークレットフリーコンポーネントのインストール、設定、使用方法について説明し、重要な考慮事項を強調します。
仕組み
公開匿名プルを有効にせずに ACR をイメージソースとして使用する場合、ACK クラスターはイメージをプルするたびに認証のためにユーザー名とパスワードを提供する必要があります。一般的なソリューションは、ユーザー名とパスワードを Secret に保存することです。ただし、この方法には次の欠点があります。
Secret は Base64 でエンコードされたプレーンテキストであり、漏洩するとセキュリティリスクをもたらします。
各ワークロードに手動で
imagePullSecretsを追加する必要があります。Secret は名前空間をまたいで使用することはできません。
シークレットフリーコンポーネントは次のように動作します。
シークレットフリーコンポーネントは、ACR インスタンスから一時的なユーザー名とパスワードを取得します。
コンポーネントは、一時的なユーザー名とパスワードを Secret に保存します。
コンポーネントは、コンポーネントの設定で指定されたサービスアカウントに Secret を関連付けます。
これらのサービスアカウントを使用するワークロードは、デフォルトで Secret に保存されている一時的なユーザー名とパスワードを使用してイメージをプルします。
シークレットフリーコンポーネントは、複数の名前空間のサービスアカウントを同時に管理できます。設定に基づいて一時的なユーザー名とパスワードを定期的に更新します。これにより、漏洩のリスクが軽減され、ワークロードに手動で imagePullSecrets を追加する必要がなくなります。シークレットフリーコンポーネントは無料です。
シークレットフリーコンポーネントの比較
ACK は aliyun-acr-credential-helper コンポーネントを提供します。このコンポーネントは、マネージドエディションとセルフマネージドエディションで利用できます。一度に 1 つのエディションしかインストールできません。次の表は、2 つのエディションを比較したものです。
項目 | aliyun-acr-credential-helper (マネージド) | aliyun-acr-credential-helper (セルフマネージド) |
サポートされるクラスターバージョン | ACK マネージドクラスター、Serverless Kubernetes クラスター、および Kubernetes 1.22 以降を実行するACK Edge クラスター | ACK マネージドクラスターおよび Kubernetes 1.20 以降を実行するACK 専用クラスター |
機能 |
|
|
クラスターをアップグレードするには、「クラスターを手動でアップグレードする」をご参照ください。
前提条件
クラスターのバージョンがシークレットフリーコンポーネントでサポートされていること。詳細については、上記の表をご参照ください。
Container Registry (ACR) インスタンスが Enterprise Edition インスタンスであること。
重要シークレットフリーコンポーネントは、ACR Enterprise Edition インスタンスと 2024 年 9 月 8 日以前に作成された ACR Personal Edition インスタンスのみをサポートします。シークレットフリーコンポーネントを使用できない場合、詳細については、「imagePullSecrets の使用方法」をご参照ください。
シークレットフリーコンポーネントが使用する RAM ロールに権限を付与していること。
ACR Enterprise Edition インスタンスと ACK クラスター間のネットワーク接続が確立されていること。
マネージドシークレットフリーコンポーネントの使用
ステップ 1: コンポーネントのインストール
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のペインで、 を選択します。
[アドオン] ページで、[セキュリティ] タブを選択します。[Aliyun-acr-credential-helper (マネージド)] カードを見つけて、[インストール] をクリックします。
[Aliyun-acr-credential-helper のインストール] ページで、[AcrInstanceInfo] 設定およびその他のオプションを表示できます。[AcrInstanceInfo] には、コンポーネントに関連付けられた各 ACR インスタンスの設定が含まれています。その他のオプションはコンポーネント設定です。コンポーネントが監視する名前空間またはサービスアカウントを変更する必要がない場合は、デフォルト設定を維持できます。
コンポーネントがインストールされた後、その設定を変更できます。[アドオン] ページで、[Aliyun-acr-credential-helper (マネージド)] カードの [設定] をクリックします。

関連付けられた ACR インスタンスの設定:
AcrInstanceInfo
説明
InstanceId
ACR インスタンスの ID。ID は Container Registry コンソールで取得できます。
重要Personal Edition ACR インスタンスの場合は、このパラメーターを空のままにします。Enterprise Edition ACR インスタンスの場合は、このパラメーターは必須です。
regionId
ACR インスタンスのリージョン ID。リージョン ID は Container Registry コンソールで取得できます。
重要このパラメーターは、リージョン間でイメージをプルする場合に必要です。
domains
シークレットフリープラグインが ACR インスタンスへのアクセスに使用するドメイン名。デフォルトでは、指定された ACR インスタンスのすべてのドメイン名 (パブリックおよび VPC) が使用されます。個別のドメイン名を指定するには、コンマ (,) で区切ります。
アカウント間でのイメージのプルに関する設定
これは、アカウント間でイメージをプルするシナリオに適用されます。この要件がない場合は、フィールドを空のままにします。
assumeRoleARN
同一アカウント内でのイメージのプルには不要です。アカウント間でイメージをプルする場合、詳細については、「アカウント間でのイメージのプル」をご参照ください。
expireDuration
rrsaRoleARN
rrsaOIDCProviderRoleARN
ステップ 2: イメージのプル
シークレットフリーコンポーネントをインストールして設定した後、ワークロードを作成するときにコンポーネントに関連付けられているサービスアカウントを指定します。これにより、シークレットなしでイメージをプルできます。
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 # ACR イメージのアドレスを指定します。
ports:
- containerPort: 80セルフマネージドシークレットフリーコンポーネントの使用
ステップ 1: コンポーネントのインストール
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のペインで、 を選択します。
[アドオン] ページで、[セキュリティ] タブをクリックします。[aliyun-acr-credential-helper] を見つけて、[インストール] をクリックします。
[パラメーター] ページで、[tokenMode] ドロップダウンリストからコンポーネントの権限モードを選択し、[OK] をクリックします。コンポーネントがインストールされたら、イメージをプルする前に設定します。詳細については、「ステップ 2: コンポーネント設定の変更 (ACR インスタンスの追加)」をご参照ください。
tokenMode
説明
auto
(推奨) コンポーネントはクラスターの作成時間を検出し、権限モードを自動的に決定します。2023 年 4 月 3 日より前に作成されたクラスターの場合、workerRole モードが使用されます。2023 年 4 月 3 日以降に作成されたクラスターの場合、managedRole モードが使用されます。
重要2023 年 4 月 3 日以降にリリースされた aliyun-acr-credential-helper のバージョンでは、コンポーネントが依存する RAM ロールをカスタマイズするための設定項目が提供されています。詳細については、「[製品変更] aliyun-acr-credential-helper が依存する権限の変更に関するお知らせ」をご参照ください。
managedRole
コンポーネントは、「前提条件」セクションで権限が付与されている AliyunCSManagedAcrRole ロールを使用して権限を取得します。
workerRole
コンポーネントは、クラスターのワーカー RAM ロールを使用して権限を取得します。ワーカー RAM ロールに特定の権限を付与する必要があります。
重要ロールの偽装を使用してアカウント間でイメージをプルするには、このモードを選択します。
ステップ 2: コンポーネント設定の変更 (ACR インスタンスの追加)
シークレットフリーコンポーネントがインストールされた後、イメージをプルする前に、[acr-configuration] ConfigMap を設定して ACR インスタンスを追加する必要があります。これは、コンソールまたは kubectl を使用して実行できます。
コンソール
クラスター ページで、変更したいクラスターの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[ConfigMap] ページで、[名前空間] ドロップダウンリストから [kube-system] を選択します。次に、[acr-configuration] ConfigMap をクリックし、次の表の説明に従って設定を変更します。
キー
説明
watch-namespace
シークレットを使用せずにイメージをプルしたい名前空間。
acr-api-version
デフォルト値を維持します。
expiring-threshold
ローカルキャッシュ資格情報の有効期限のしきい値。
acr-registry-info
コンテナイメージのインスタンス情報の配列で、複数行の YAML 文字列形式です。各インスタンスはトライアドとして設定されます。
instanceId: ACR インスタンスの ID。ID は Container Registry コンソールで取得できます。重要Personal Edition ACR インスタンスの場合は、このパラメーターを空のままにします。Enterprise Edition ACR インスタンスの場合は、このパラメーターは必須です。
regionId: ACR インスタンスのリージョン ID。リージョン ID は Container Registry コンソールで取得できます。重要このパラメーターは、リージョン間でイメージをプルする場合に必要です。以下の設定例をご参照ください。
domains: シークレットフリープラグインが ACR インスタンスへのアクセスに使用するドメイン名。デフォルトでは、instanceIdの ACR インスタンスのすべてのドメイン名が入力されます。個別のドメイン名を指定するには、コンマ (,) で区切ります。
service-account
aliyun-acr-credential-helper コンポーネントでイメージをプルする際に使用されるサービスアカウント。
kubectl
次のコマンドを実行して、次の表の説明に従って
acr-configurationを編集します。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
キャッシュされた Secret が期限切れになるまでの期間。
デフォルト値: 15m。
説明デフォルト値を使用することをお勧めします。デフォルト値は、キャッシュされた Secret が期限切れになる 15 分前に Secret が更新されることを指定します。
ステップ 3: イメージのプル
シークレットフリーコンポーネントをインストールして設定した後、ワークロードを作成するときにコンポーネントに関連付けられているサービスアカウントを指定します。これにより、シークレットなしでイメージをプルできます。
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 # ACR イメージのアドレスを指定します。
ports:
- containerPort: 80作成後すぐにサービスアカウントを使用する機能を有効にする方法
作成後すぐにサービスアカウントを使用する機能を有効にするには、シークレットフリーコンポーネントを v23.02.06.1-74e2172-aliyun 以降にアップグレードする必要があります。
Webhook 機能を有効にすると、シークレットフリーコンポーネントは Webhook を使用してクラスター内のサービスアカウントの変更を監視します。新しいサービスアカウントが作成されると、コンポーネントはすぐにシークレットフリーの Secret をそれに注入します。この機能は、Helm Chart を使用してサービスアカウントとデプロイメントを同時に作成する場合など、サービスアカウントを作成後すぐに使用する必要があるシナリオで役立ちます。この機能はコンポーネントのパフォーマンスに影響を与えるため、他のシナリオで有効にすることはお勧めしません。
この機能を有効にするには、次のフィールドを [acr-configuration] に追加します:
data:
webhook-configuration: |
enable: true
failure-policy: Ignore
timeout-seconds: 10設定項目 | 説明 |
| Webhook 機能を有効にするかどうかを指定します。
|
| この機能で例外が発生した場合にサービスアカウントを処理するためのポリシー。
重要 クラスター API Server の制限により、 |
| この機能の単一のサービスアカウント作成リクエストのタイムアウト期間。タイムアウト期間を超えると、システムは |
よくある質問
シークレットフリーコンポーネントを設定してもイメージのプルが失敗する
シークレットフリーコンポーネントの設定が正しくないために、イメージのプルが失敗することがあります。例:
シークレットフリーコンポーネントのインスタンス情報が ACR インスタンスと一致しない。
イメージのプルに使用されるイメージアドレスが、コンポーネントのインスタンス情報のドメイン名と一致しない。
このトピックの手順に従って問題をトラブルシューティングしてください。
コンポーネントが正しく設定されているにもかかわらずプルが失敗する場合、ワークロード YAML に手動で入力された imagePullSecrets フィールドとシークレットフリーコンポーネントとの間に競合がある可能性があります。この問題を解決するには、手動で imagePullSecrets フィールドを削除し、その後 Pod を削除して再作成します。
imagePullSecrets の使用方法
2024 年 9 月 9 日以降に作成された ACR Personal Edition インスタンスは、シークレットフリーコンポーネントをサポートしていません。新しい ACR Personal Edition インスタンスの場合、ユーザー名とログインパスワードを Secret に保存し、それを imagePullSecrets フィールドで使用することをお勧めします。
シークレットフリーコンポーネントは、手動で入力された
imagePullSecretsフィールドと同時に使用することはできません。Secret はワークロードと同じ名前空間にある必要があります。
関連ドキュメント
シークレットフリーコンポーネントを使用してアカウント間でイメージをプルする方法の詳細については、「アカウント間でのイメージのプル」をご参照ください。
シークレットフリーコンポーネントの変更履歴については、「aliyun-acr-credential-helper」をご参照ください。