Secret Manager と Google Kubernetes Engine(GKE)の統合により、GKE クラスタで使用されるパスワードや証明書などの機密データを Secret Manager にシークレットとして保存できます。
このページでは、Secret Manager アドオンを使用して、Kubernetes Pod にマウントされたボリュームとして Secret Manager に保存されているシークレットにアクセスする方法について説明します。
このプロセスには、次のステップが含まれます。
- Secret Manager アドオンを新規または既存の GKE クラスタにインストールします。
- Secret Manager API への認証を行うようにアプリケーションを構成します。
SecretProviderClass
YAML ファイルを使用して、Kubernetes Pod にマウントするシークレットを定義します。- シークレットがマウントされるボリュームを作成します。ボリュームがアタッチされると、コンテナ内のアプリケーションはコンテナ ファイル システム内のデータにアクセスできます。
Secret Manager アドオンは、オープンソースの Kubernetes Secrets Store CSI ドライバと Google Secret Manager プロバイダから派生しています。オープンソースの Secret Store CSI ドライバを使用してシークレットにアクセスしている場合は、Secret Manager アドオンに移行できます。詳細については、既存の Secrets Store CSI ドライバから移行するをご覧ください。
利点
Secret Manager アドオンには、次のような利点があります。
- サポートされているフルマネージドのソリューションを使用すると、運用上のオーバーヘッドが発生しない状態で、GKE 内から Secret Manager のシークレットにアクセスできます。
- Secret Manager に保存されているシークレットにアクセスするために、カスタムコードを記述する必要はありません。
- Secret Manager ですべての Secret を一元的に保存および管理し、Secret Manager アドオンを使用して GKE Pod からシークレットに選択的にアクセスできます。こうすることで、CMEK 暗号化、詳細なアクセス制御、マネージド ローテーション、ライフサイクル管理、監査ログなどの Secret Manager によって提供される機能と、マウントされたボリュームの形式でコンテナにシークレットを渡すなどの Kubernetes 機能を使用できます。
- Secret Manager アドオンは、Standard クラスタと Autopilot クラスタの両方でサポートされています。
- Secret Manager アドオンは、
linux/arm64
デプロイとlinux/amd64
デプロイをサポートしています。
制限事項
Secret Manager アドオンのこのプレビュー リリースでは、オープンソースの Secrets Store CSI ドライバで利用可能な次の機能はサポートされていません。
準備
-
Secret Manager and Google Kubernetes Engine API を有効にします。
このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化します。すでに gcloud CLI をインストールしている場合は、
gcloud components update
コマンドを実行して最新バージョンを取得します。Linux ノードイメージを使用してクラスタで GKE バージョン 1.29 以降が実行されていることを確認します。Secret Manager アドオンは Windows Server ノードをサポートしていません。
Secret Manager アドオンをインストールする
Secret Manager アドオンは、Standard クラスタと Autopilot クラスタの両方にインストールできます。GKE 用 Workload Identity 連携が Standard クラスタで有効になっていることを確認します。GKE 用 Workload Identity 連携は、Autopilot クラスタではデフォルトで有効になっています。Kubernetes Pod では、Workload Identity を使用して Secret Manager API への認証を行います。
新しい GKE クラスタに Secret Manager アドオンをインストールする
クラスタ作成時に Secret Manager アドオンをインストールするには、次の手順に沿って操作します。
Standard クラスタ
新しい Standard クラスタで Secret Manager アドオンを有効にするには、次のコマンドを実行します。
gcloud beta container clusters create CLUSTER_NAME \ --enable-secret-manager \ --location=LOCATION \ --cluster-version=VERSION \ --workload-pool=PROJECT_ID.svc.id.goog
次のように置き換えます。
CLUSTER_NAME
: クラスタの名前。LOCATION
: クラスタの Compute Engine のリージョンまたはゾーン。VERSION
: 使用する特定の GKE バージョン。クラスタで GKE バージョン 1.29 以降が実行されていることを確認します。デフォルトのリリース チャンネルにこのバージョンが含まれていない場合は、--release-channel
フラグを使用して、該当するバージョンが含まれているリリース チャンネルを選択します。PROJECT_ID
: Google Cloud プロジェクトの ID。
Autopilot クラスタ
新しい Autopilot クラスタで Secret Manager アドオンを有効にするには、次のコマンドを実行します。
gcloud beta container clusters create-auto CLUSTER_NAME \ --enable-secret-manager \ --cluster-version=VERSION \ --location=LOCATION
次のように置き換えます。
CLUSTER_NAME
: クラスタの名前VERSION
: 使用する特定の GKE バージョン。クラスタで GKE バージョン 1.29 以降が実行されていることを確認します。デフォルトのリリース チャンネルにこのバージョンが含まれていない場合は、--release-channel
フラグを使用して、該当するバージョンが含まれているリリース チャンネルを選択します。LOCATION
: クラスタのリージョン(us-central1
など)。
Secret Manager アドオンを有効にすると、ドライバとプロビジョナー名 secrets-store-gke.csi.k8s.io
を使用して、Kubernetes Volume で Secrets Store CSI ドライバを使用できます。
既存の GKE クラスタに Secret Manager アドオンをインストールする
既存のクラスタで Secret Manager アドオンを有効にするには、次のコマンドを実行します。
gcloud beta container clusters update CLUSTER_NAME \
--enable-secret-manager \
--location=LOCATION
次のように置き換えます。
CLUSTER_NAME
: 既存のクラスタの名前。LOCATION
: クラスタのリージョン(us-central1
など)。
Secret Manager API への認証を行うようにアプリケーションを構成する
Google Secret Manager プロバイダは、Secret Manager API への認証時に、シークレットがマウントされている Pod の Workload Identity を使用します。アプリケーションが GKE 用 Workload Identity 連携を使用して Secret Manager API への認証を行えるようにするには、次の手順を行います。
- Identity and Access Management(IAM)ポリシーを使用して、IAM サービス アカウントを Kubernetes ServiceAccount にバインドします。新しい Kubernetes ServiceAccount を作成するか、デフォルトの Kubernetes ServiceAccount を含む任意の名前空間で既存の Kubernetes ServiceAccount を使用できます。
- IAM バインディングを使用して、IAM サービス アカウントに Secret Manager のシークレットへのアクセス権を付与します。
構成された Kubernetes ServiceAccount を使用する Pod は、Secret Manager API にアクセスするときに IAM サービス アカウントとして自動的に認証されます。
Kubernetes ServiceAccount を IAM サービス アカウントにバインドする
2 つのサービス アカウントの間に IAM ポリシー バインディングを追加して、Kubernetes ServiceAccount が IAM サービス アカウントの権限を借用できるようにします。
新しい Kubernetes ServiceAccount を使用する
次のマニフェストを
service-account.yaml
として保存します。apiVersion: v1 kind: ServiceAccount metadata: name: KSA_NAME namespace: NAMESPACE annotations: iam.gke.io/gcp-service-account: GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
次のように置き換えます。
KSA_NAME
: 新しい Kubernetes ServiceAccount の名前。NAMESPACE
: ServiceAccount の Kubernetes Namespace の名前。GSA_NAME
: IAM サービス アカウントの名前。PROJECT_ID
: IAM サービス アカウントの Google Cloud プロジェクトのプロジェクト ID。
次のようにマニフェストを適用します。
kubectl apply -f service-account.yaml
IAM サービス アカウントを新しい Kubernetes ServiceAccount にバインドするには、次のコマンドを実行します。
gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]" \ GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
既存の Kubernetes ServiceAccount を使用する
IAM サービス アカウントを既存の Kubernetes ServiceAccount にバインドするには、次のコマンドを実行します。
gcloud iam service-accounts add-iam-policy-binding \
--role roles/iam.workloadIdentityUser \
--member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]" \
GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
次のように置き換えます。
KSA_NAME
: 既存の Kubernetes ServiceAccount の名前。NAMESPACE
: ServiceAccount の Kubernetes Namespace の名前。GSA_NAME
: IAM サービス アカウントの名前。PROJECT_ID
: IAM サービス アカウントの Google Cloud プロジェクトのプロジェクト ID。
IAM サービス アカウントにシークレットにアクセスするための権限を付与する
サービス アカウントにシークレットにアクセスするための権限を付与するには、次のコマンドを実行します。
gcloud secrets add-iam-policy-binding SECRET_NAME \
--member=serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
--role=roles/secretmanager.secretAccessor
次のように置き換えます。
SECRET_NAME
: Secret Manager でのシークレットの名前。GSA_NAME
: IAM サービス アカウントの名前。PROJECT_ID
: IAM サービス アカウントの Google Cloud プロジェクトのプロジェクト ID。
マウントするシークレットを定義する
Kubernetes Pod 内のファイルとしてマウントするシークレットを指定するには、SecretProviderClass
YAML マニフェストを作成し、マウントするシークレットとマウントする際のファイル名を一覧表示します。以下の手順に沿って登録してください。
次のマニフェストを
app-secrets.yaml
として保存します。apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: SECRET_PROVIDER_CLASS_NAME spec: provider: gke parameters: secrets: | - resourceName: "projects/PROJECT_ID/secrets/SECRET_NAME/versions/SECRET_VERSION" path: "FILENAME.txt"
次のように置き換えます。
SECRET_PROVIDER_CLASS_NAME
:SecretProviderClass
オブジェクトの名前PROJECT_ID
: プロジェクト IDSECRET_NAME
: シークレット名SECRET_VERSION
: シークレットのバージョンFILENAME.txt
: シークレット値がマウントされるファイル名。resourceName
変数とpath
変数を使用して複数のファイルを作成できます。
次のようにマニフェストを適用します。
kubectl apply -f app-secrets.yaml
SecretProviderClass
オブジェクトが作成されたことを確認します。kubectl get SecretProviderClasses
シークレットがマウントされるボリュームを構成する
次の構成を
my-pod.yaml
として保存します。apiVersion: v1 kind: Pod metadata: name: POD_NAME namespace: default spec: serviceAccountName: KSA_NAME containers: - image: IMAGE_NAME imagePullPolicy: IfNotPresent name: POD_NAME resources: requests: cpu: 100m stdin: true stdinOnce: true terminationMessagePath: /dev/termination-log terminationMessagePolicy: File tty: true volumeMounts: - mountPath: "/var/secrets" name: mysecret volumes: - name: mysecret csi: driver: secrets-store-gke.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: SECRET_PROVIDER_CLASS_NAME
次のように置き換えます。
POD_NAME
: シークレットがマウントされている Kubernetes Pod の名前KSA_NAME
: Workload Identity サービス アカウントを設定するのステップで設定した Kubernetes ServiceAccountIMAGE_NAME
: コンテナ イメージの名前SECRET_PROVIDER_CLASS_NAME
:SecretProviderClass
オブジェクトの名前
クラスタに構成を適用します。
kubectl apply -f my-pod.yaml
このステップでは、CSI ドライバ(secrets-store-gke.csi.k8s.io)を使用して /var/secrets
にボリューム mysecret
をマウントします。このボリュームは、プロバイダとして機能する SecretProviderClass
オブジェクトを参照します。
既存の Secrets Store CSI ドライバから移行する
Secrets Store CSI ドライバの既存のインストールから Secret Manager アドオンに移行する場合は、次のように Pod マニフェストを更新します。
次のマニフェストで説明するように、
SecretProviderClass
とprovider
の名前を更新します。apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: app-secrets-gke spec: provider: gke parameters: secrets: | - resourceName: "projects/<project_id>/secrets/<secret_name>/versions/<secret_version>" path: "good1.txt"
次のマニフェストに示すように、Kubernetes Volume の
driver
とsecretProviderClass
を更新します。volumes: - name: mysecret csi: driver: secrets-store-gke.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "app-secrets-gke"
Secret Manager アドオンを無効にする
既存の Standard クラスタまたは Autopilot クラスタで Secret Manager アドオンを無効にするには、次のコマンドを実行します。
gcloud beta container clusters update CLUSTER_NAME \
--no-enable-secret-manager \
--region=REGION
次のように置き換えます。
CLUSTER_NAME
: クラスタの名前REGION
: クラスタのリージョン(us-central1
など)