Secret Manager と Google Kubernetes Engine(GKE)の統合により、GKE クラスタで使用されるパスワードや証明書などのセンシティブ データを Secret Manager にシークレットとして保存できます。
このページでは、Secret Manager アドオンを使用して、Kubernetes Pod にマウントされたボリュームとして Secret Manager に保存されているシークレットにアクセスする方法について説明します。
このプロセスには、次のステップが含まれます。
- 新規または既存の GKE クラスタで Secret Manager アドオンを有効にします。
- Secret Manager API に対して認証を行うようにアプリケーションを構成します。
SecretProviderClass
YAML ファイルを使用して、Kubernetes Pod にマウントするシークレットを定義します。- Secret をマウントするボリュームを作成します。ボリュームがアタッチされると、コンテナ内のアプリケーションはコンテナ ファイル システム内のデータにアクセスできるようになります。
Secret Manager アドオンは、オープンソースの Kubernetes Secrets Store CSI ドライバと Google Secret Manager プロバイダから派生したものです。 オープンソースの Secrets Store CSI ドライバを使用して Secret にアクセスしている場合は、Secret Manager アドオンに移行できます。詳細については、既存の Secrets Store CSI ドライバから移行するをご覧ください。
利点
Secret Manager アドオンには次のような利点があります。
- サポートされているフルマネージドのソリューションを使用すると、運用上のオーバーヘッドが発生しない状態で、GKE 内から Secret Manager のシークレットにアクセスできます。
- Secret Manager に保存されている Secret にアクセスするためにカスタム コードを記述する必要はありません。
- Secret Manager ですべての Secret を一元的に保存および管理し、Secret Manager アドオンを使用して GKE Pod からシークレットに選択的にアクセスできます。こうすることで、CMEK 暗号化、詳細なアクセス制御、マネージド ローテーション、ライフサイクル管理、監査ログなどの Secret Manager によって提供される機能と、マウントされたボリュームの形式でコンテナにシークレットを渡すなどの Kubernetes 機能を使用できます。
- Secret Manager アドオンは、Standard クラスタと Autopilot クラスタの両方でサポートされています。
- Secret Manager アドオンは、Container-Optimized OS または Ubuntu ノードイメージを使用するノードをサポートしています。
制限事項
Secret Manager アドオンには次の制限があります。
Secret Manager アドオンは、オープンソースの Secrets Store CSI ドライバで利用可能な次の機能をサポートしていません。
Secret Manager アドオンは Windows Server ノードをサポートしていません。
始める前に
-
Enable the Secret Manager and Google Kubernetes Engine APIs.
このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化します。すでに gcloud CLI をインストールしている場合は、
gcloud components update
コマンドを実行して最新バージョンを取得します。Google Cloud SDK または Google Cloud コンソールを使用して Secret Manager アドオンを手動で設定することはできません。
Linux ノードイメージを使用してクラスタで GKE バージョン 1.27.14-gke.1042001 以降が実行されていることを確認します。
GKE Standard クラスタを使用している場合は、クラスタで Workload Identity Federation for GKE が有効になっていることを確認します。GKE 用 Workload Identity 連携は、Autopilot クラスタではデフォルトで有効になっています。Kubernetes Pod は、GKE 用 Workload Identity 連携を使用して Secret Manager API への認証を行います。
Secret Manager アドオンを有効にする
Secret Manager アドオンは、Standard クラスタと Autopilot クラスタの両方で有効にできます。
新しい GKE クラスタで Secret Manager アドオンを有効にする
クラスタ作成時に Secret Manager アドオンを有効にするには、次の操作を行います。
Console
-
Google Cloud コンソールで [Google Kubernetes Engine] ページに移動します。
add_box [作成] をクリックします。
[クラスタを作成] ダイアログで、[構成] をクリックします。
ナビゲーション メニューの [クラスタ] セクションで、[セキュリティ] をクリックします。
[Secret Manager を有効にする] チェックボックスをオンにします。
[Workload Identity を有効にする] チェックボックスをオンにします。
クラスタの構成を続行し、[作成] をクリックします。
gcloud
{ Standard cluster}
新しい Standard クラスタで Secret Manager アドオンを有効にするには、次のコマンドを実行します。
後述のコマンドデータを使用する前に、次のように置き換えます。
- CLUSTER_NAME: クラスタの名前。
- LOCATION: クラスタの Compute Engine リージョン(
us-central1
など)。 - VERSION: 使用する特定の GKE バージョン。クラスタで GKE バージョン 1.27.14-gke.1042001 以降が実行されていることを確認します。デフォルトのリリース チャンネルにこのバージョンが含まれていない場合は、
--release-channel
フラグを使用して、該当するバージョンが含まれているリリース チャンネルを選択します。 - PROJECT_ID: Google Cloud プロジェクトの ID。
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud container clusters create CLUSTER_NAME \ --enable-secret-manager \ --location=LOCATION \ --cluster-version=VERSION \ --workload-pool=PROJECT_ID.svc.id.goog
Windows(PowerShell)
gcloud container clusters create CLUSTER_NAME ` --enable-secret-manager ` --location=LOCATION ` --cluster-version=VERSION ` --workload-pool=PROJECT_ID.svc.id.goog
Windows(cmd.exe)
gcloud container clusters create CLUSTER_NAME ^ --enable-secret-manager ^ --location=LOCATION ^ --cluster-version=VERSION ^ --workload-pool=PROJECT_ID.svc.id.goog
{ Autopilot クラスタ}
新しい Autopilot クラスタで Secret Manager アドオンを有効にするには、次のコマンドを実行します。
後述のコマンドデータを使用する前に、次のように置き換えます。
- CLUSTER_NAME: クラスタの名前。
- VERSION: 使用する特定の GKE バージョン。クラスタで GKE バージョン 1.27.14-gke.1042001 以降が実行されていることを確認します。特定のバージョンを設定するには、新しい Autopilot クラスタのバージョンとリリース チャンネルを設定するをご覧ください。
- LOCATION: クラスタの Compute Engine リージョン(
us-central1
など)。
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud container clusters create-auto CLUSTER_NAME \ --enable-secret-manager \ --cluster-version=VERSION \ --location=LOCATION
Windows(PowerShell)
gcloud container clusters create-auto CLUSTER_NAME ` --enable-secret-manager ` --cluster-version=VERSION ` --location=LOCATION
Windows(cmd.exe)
gcloud container clusters create-auto CLUSTER_NAME ^ --enable-secret-manager ^ --cluster-version=VERSION ^ --location=LOCATION
Secret Manager アドオンを有効にすると、ドライバとプロビジョナー名 secrets-store-gke.csi.k8s.io
を使用して Kubernetes ボリュームで Secrets Store CSI ドライバを使用できます。
既存の GKE クラスタで Secret Manager アドオンを有効にする
既存のクラスタで Secret Manager アドオンを有効にするには、次の操作を行います。
Console
-
Google Cloud コンソールで [Google Kubernetes Engine] ページに移動します。
クラスタのリストで、変更するクラスタの名前をクリックします。
クラスタの詳細ページの [セキュリティ] セクションで、
[Secret Manager] をクリックします。[Secret Manager を編集] ダイアログで、[Secret Manager を有効にする] チェックボックスをオンにします。
[変更を保存] をクリックします。
gcloud
後述のコマンドデータを使用する前に、次のように置き換えます。
- CLUSTER_NAME: クラスタの名前
- LOCATION: クラスタの Compute Engine リージョン(
us-central1
など)
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud container clusters update CLUSTER_NAME \ --enable-secret-manager \ --location=LOCATION \
Windows(PowerShell)
gcloud container clusters update CLUSTER_NAME ` --enable-secret-manager ` --location=LOCATION `
Windows(cmd.exe)
gcloud container clusters update CLUSTER_NAME ^ --enable-secret-manager ^ --location=LOCATION ^
Secret Manager アドオンのインストールを確認する
Secret Manager アドオンが Kubernetes クラスタにインストールされていることを確認するには、次のコマンドを実行します。
gcloud container clusters describe CLUSTER_NAME --location LOCATION | grep secretManagerConfig -A 1
次のように置き換えます。
CLUSTER_NAME
: クラスタの名前。LOCATION
: クラスタのロケーション(us-central1
など)。
Secret Manager API に対して認証を行うようにアプリケーションを構成する
Google Secret Manager プロバイダは、Secret Manager API への認証時に、シークレットがマウントされている Pod の Workload Identity を使用します。アプリケーションが GKE 用 Workload Identity 連携を使用して Secret Manager API への認証を行えるようにするには、次の手順を行います。
新しい Kubernetes ServiceAccount を作成するか、Secret をマウントする Pod と同じ Namespace にある既存の Kubernetes ServiceAccount を使用します。
Secret Manager で、Secret の Identity and Access Management(IAM)許可ポリシーを作成します。
構成された Kubernetes ServiceAccount を使用する Pod は、Secret Manager API にアクセスするときに、Kubernetes ServiceAccount に対応する IAM プリンシパル ID として自動的に認証されます。
新しい Kubernetes ServiceAccount を作成する
次のマニフェストを
service-account.yaml
として保存します。apiVersion: v1 kind: ServiceAccount metadata: name: KSA_NAME namespace: NAMESPACE
次のように置き換えます。
KSA_NAME
: 新しい Kubernetes ServiceAccount の名前。NAMESPACE
: ServiceAccount の Kubernetes Namespace の名前。
次のようにマニフェストを適用します。
kubectl apply -f service-account.yaml
新しい Kubernetes ServiceAccount を参照し、Secret へのアクセス権を付与する IAM 許可ポリシーを作成します。
gcloud secrets add-iam-policy-binding SECRET_NAME \ --role=roles/secretmanager.secretAccessor \ --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME
次のように置き換えます。
SECRET_NAME
: Secret Manager でのシークレットの名前。PROJECT_NUMBER
: 数値による Google Cloud プロジェクト番号PROJECT_ID
: GKE クラスタを含む Google Cloud プロジェクトのプロジェクト IDNAMESPACE
: ServiceAccount の Kubernetes Namespace の名前。KSA_NAME
: 既存の Kubernetes ServiceAccount の名前。
既存の Kubernetes ServiceAccount を使用する
既存の Kubernetes ServiceAccount を参照し、シークレットへのアクセス権を付与する IAM 許可ポリシーを作成します。
gcloud secrets add-iam-policy-binding SECRET_NAME \
--role=roles/secretmanager.secretAccessor \
--member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME
次のように置き換えます。
SECRET_NAME
: Secret Manager でのシークレットの名前。PROJECT_NUMBER
: 数値による Google Cloud プロジェクト番号PROJECT_ID
: GKE クラスタを含む Google Cloud プロジェクトのプロジェクト IDNAMESPACE
: ServiceAccount の Kubernetes Namespace の名前。KSA_NAME
: 既存の Kubernetes ServiceAccount の名前。
マウントする Secret を定義する
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
: プロジェクト ID。SECRET_NAME
: シークレット名。SECRET_VERSION
: シークレットのバージョン。FILENAME.txt
: Secret 値がマウントされるファイル名。resourceName
変数とpath
変数を使用すると、複数のファイルを作成できます。
次のようにマニフェストを適用します。
kubectl apply -f app-secrets.yaml
SecretProviderClass
オブジェクトが作成されていることを確認します。kubectl get SecretProviderClasses
Secret をマウントするボリュームを構成する
次の構成を
my-pod.yaml
として保存します。apiVersion: v1 kind: Pod metadata: name: POD_NAME namespace: NAMESPACE 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 の名前NAMESPACE
: ServiceAccount の Kubernetes Namespace の名前。KSA_NAME
: Secret Manager API に対して認証を行うようにアプリケーションを構成するのステップで設定した Kubernetes ServiceAccountIMAGE_NAME
: コンテナ イメージの名前SECRET_PROVIDER_CLASS_NAME
:SecretProviderClass
オブジェクトの名前
Standard クラスタの場合のみ、
template.spec
フィールドに以下を追加して、GKE 用 Workload Identity 連携を使用するノードプールに Pod を配置します。すべてのノードが GKE 用 Workload Identity 連携を使用するので、Autopilot クラスタではこの手順をスキップします。Autopilot クラスタではこの nodeSelector が拒否されます。
spec: nodeSelector: iam.gke.io/gke-metadata-server-enabled: "true"
クラスタに構成を適用します。
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 ボリュームの
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 アドオンを無効にするには、次のコマンドを実行します。
Console
-
Google Cloud コンソールで [Google Kubernetes Engine] ページに移動します。
クラスタのリストで、変更するクラスタの名前をクリックします。
クラスタの詳細ページの [セキュリティ] セクションで、
[Secret Manager] をクリックします。[Secret Manager の編集] ダイアログで、[Secret Manager を有効にする] チェックボックスをオフにします。
[変更を保存] をクリックします。
gcloud
後述のコマンドデータを使用する前に、次のように置き換えます。
- CLUSTER_NAME: クラスタの名前
- REGION: クラスタの Compute Engine リージョン(
us-central1
など)
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud container clusters update CLUSTER_NAME \ --no-enable-secret-manager \ --region=REGION \
Windows(PowerShell)
gcloud container clusters update CLUSTER_NAME ` --no-enable-secret-manager ` --region=REGION `
Windows(cmd.exe)
gcloud container clusters update CLUSTER_NAME ^ --no-enable-secret-manager ^ --region=REGION ^