Google Kubernetes Engine で Secret Manager アドオンを使用する

Secret Manager と Google Kubernetes Engine(GKE)の統合により、GKE クラスタで使用されるパスワードや証明書などのセンシティブ データを Secret Manager にシークレットとして保存できます。

このページでは、Secret Manager アドオンを使用して、Kubernetes Pod にマウントされたボリュームとして Secret Manager に保存されているシークレットにアクセスする方法について説明します。

このプロセスには、次のステップが含まれます。

  1. 新規または既存の GKE クラスタで Secret Manager アドオンを有効にします。
  2. Secret Manager API に対して認証を行うようにアプリケーションを構成します。
  3. SecretProviderClass YAML ファイルを使用して、Kubernetes Pod にマウントするシークレットを定義します。Secret Manager アドオンは、グローバル シークレットとリージョン シークレットの両方をサポートしています。
  4. 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 ドライバで使用できる Sync as Kubernetes Secret 機能をサポートしていません。Secret Manager に保存されているシークレットを Kubernetes Secret に同期する場合は、Secret Manager の統合シークレット同期機能を使用します。詳細については、Secret を Kubernetes Secret に同期するをご覧ください。

  • Secret Manager アドオンは、Windows Server ノードをサポートしていません。

始める前に

  • Secret Manager API と Google Kubernetes Engine API を有効にします。

    API を有効にするために必要なロール

    API を有効にするには、serviceusage.services.enable 権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を介してこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を介してこの権限を取得できます。ロールを付与する方法をご覧ください。

    API を有効にする

  • このタスクに 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 が有効になっていることを確認します。Workload Identity Federation for GKE は、Autopilot クラスタではデフォルトで有効になっています。Kubernetes Pod は、Workload Identity Federation for GKE を使用して Secret Manager API への認証を行います。

Secret Manager アドオンを有効にする

Secret Manager アドオンは、Standard クラスタと Autopilot クラスタの両方で有効にできます。

新しい GKE クラスタで Secret Manager アドオンを有効にする

クラスタ作成時に Secret Manager アドオンを有効にするには、次の操作を行います。

コンソール

  1. Google Cloud コンソールで、[Google Kubernetes Engine] ページに移動します。

    Google Kubernetes Engine に移動

  2. [作成] をクリックします。

  3. [クラスタを作成] ダイアログで、[構成] をクリックします。

  4. ナビゲーション メニューの [クラスタ] セクションで、[セキュリティ] をクリックします。

  5. [Secret Manager を有効にする] チェックボックスをオンにします。

  6. [Workload Identity を有効にする] チェックボックスをオンにします。

  7. クラスタの構成を続行し、[作成] をクリックします。

gcloud

{ Standard クラスタ}

新しい 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 アドオンを有効にするには、次のコマンドを実行します。

後述のコマンドデータを使用する前に、次のように置き換えます。

次のコマンドを実行します。

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 アドオンを有効にするには、次の操作を行います。

コンソール

  1. Google Cloud コンソールで、[Google Kubernetes Engine] ページに移動します。

    Google Kubernetes Engine に移動

  2. クラスタのリストで、変更するクラスタの名前をクリックします。

  3. クラスタの詳細ページの [セキュリティ] セクションで、 [Secret Manager] をクリックします。

  4. [Secret Manager の編集] ダイアログで、[Secret Manager を有効にする] チェックボックスをオンにします。

  5. [変更を保存] をクリックします。

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 4

以下を置き換えます。

  • CLUSTER_NAME: クラスタの名前。
  • LOCATION: クラスタのロケーションus-central1 など)。

シークレットの自動ローテーションを構成する

Secret Manager アドオンを構成してシークレットを自動的にローテーションすると、最初の Pod のデプロイ後に Secret Manager で更新されたシークレットが、自動的に定期的に Pod に push されます。マウントされたシークレットの自動ローテーションにより、アプリケーションは再起動や手動操作なしで更新されたシークレットを自動的に受け取ることができます。この機能により、アプリケーションは常に最新のシークレットを使用します。

シークレットの自動ローテーションの構成については、次の点にご注意ください。

  • シークレットの自動ローテーションは、オプションの構成です。
  • この機能は、新しいクラスタの作成時または既存のクラスタの更新時に構成できます。
  • ローテーション間隔とローテーション間隔の単位を指定することで、自動ローテーションの頻度を構成できます。
  • シークレットの自動ローテーションは、GKE バージョン 1.32.2-gke.1059000 以降でサポートされています。

シークレットの自動ローテーションを構成するには、enable-secret-manager-rotation 機能を有効にして、secret-manager-rotation-interval を設定してローテーション間隔を構成する必要があります。

新しい GKE クラスタでシークレットの自動ローテーションを構成する

クラスタの作成時に Secret の自動ローテーションを構成するには、次の操作を行います。

コンソール

{ Autopilot クラスタ}

  1. Google Cloud コンソールで、[Autopilot クラスタの作成] ページに移動します。

    [Autopilot クラスタの作成] に移動

  2. ナビゲーション メニューの [詳細設定] セクションで、[セキュリティ] をクリックします。

  3. [Secret Manager を有効にする] チェックボックスをオンにします。

  4. [自動ローテーションを構成する] チェックボックスをオンにします。

  5. [ローテーション間隔] と [ローテーション間隔の単位] を指定します。

  6. クラスタの構成を続行し、[作成] をクリックします。

{ Standard クラスタ}

  1. Google Cloud コンソールで、[Kubernetes クラスタの作成] ページに移動します。

    [Kubernetes クラスタの作成] に移動

  2. ナビゲーション メニューの [クラスタ] セクションで、[セキュリティ] をクリックします。

  3. [Secret Manager を有効にする] チェックボックスをオンにします。

  4. [自動ローテーションを構成する] チェックボックスをオンにします。

  5. [ローテーション間隔] と [ローテーション間隔の単位] を指定します。

  6. クラスタの構成を続行し、[作成] をクリックします。

gcloud

{ Autopilot クラスタ}

後述のコマンドデータを使用する前に、次のように置き換えます。

  • CLUSTER_NAME: クラスタの名前。
  • VERSION: 使用する特定の GKE バージョン。クラスタで GKE バージョン 1.27.14-gke.1042001 以降が実行されていることを確認します。デフォルトのリリース チャンネルにこのバージョンが含まれていない場合は、--release-channel フラグを使用して、該当するバージョンが含まれているリリース チャンネルを選択します。
  • LOCATION: クラスタのロケーションus-central1 など)。
  • ROTATION_INTERVAL: ローテーション間隔(秒単位)。値は、正の整数に接尾辞 s を付けたものにする必要があります。最小許容値は 120s です。たとえば、間隔を 5 分に設定するには、300s を使用します。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud container clusters create CLUSTER_NAME \
    --cluster-version=VERSION \
    --location=LOCATION \
    --enable-secret-manager \
    --enable-secret-manager-rotation \
    --secret-manager-rotation-interval=ROTATION_INTERVAL
    

Windows(PowerShell)

gcloud container clusters create CLUSTER_NAME `
    --cluster-version=VERSION `
    --location=LOCATION `
    --enable-secret-manager `
    --enable-secret-manager-rotation `
    --secret-manager-rotation-interval=ROTATION_INTERVAL
    

Windows(cmd.exe)

gcloud container clusters create CLUSTER_NAME ^
    --cluster-version=VERSION ^
    --location=LOCATION ^
    --enable-secret-manager ^
    --enable-secret-manager-rotation ^
    --secret-manager-rotation-interval=ROTATION_INTERVAL
    

{ Standard クラスタ}

後述のコマンドデータを使用する前に、次のように置き換えます。

  • CLUSTER_NAME: クラスタの名前。
  • LOCATION: クラスタのロケーションus-central1 など)。
  • VERSION: 使用する特定の GKE バージョン。クラスタで GKE バージョン 1.27.14-gke.1042001 以降が実行されていることを確認します。デフォルトのリリース チャンネルにこのバージョンが含まれていない場合は、--release-channel フラグを使用して、該当するバージョンが含まれているリリース チャンネルを選択します。
  • PROJECT_ID: Google Cloud プロジェクトの ID
  • ROTATION_INTERVAL: ローテーション間隔(秒単位)。値は、正の整数に接尾辞 s を付けたものにする必要があります。最小許容値は 120s です。たとえば、間隔を 5 分に設定するには、300s を使用します。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --cluster-version=VERSION \
    --workload-pool=PROJECT_ID.svc.id.goog \
    --enable-secret-manager \
    --enable-secret-manager-rotation \
    --secret-manager-rotation-interval=ROTATION_INTERVAL
    

Windows(PowerShell)

gcloud container clusters create CLUSTER_NAME `
    --location=LOCATION `
    --cluster-version=VERSION `
    --workload-pool=PROJECT_ID.svc.id.goog `
    --enable-secret-manager `
    --enable-secret-manager-rotation `
    --secret-manager-rotation-interval=ROTATION_INTERVAL
    

Windows(cmd.exe)

gcloud container clusters create CLUSTER_NAME ^
    --location=LOCATION ^
    --cluster-version=VERSION ^
    --workload-pool=PROJECT_ID.svc.id.goog ^
    --enable-secret-manager ^
    --enable-secret-manager-rotation ^
    --secret-manager-rotation-interval=ROTATION_INTERVAL
    

既存の GKE クラスタでシークレットの自動ローテーションを構成する

既存の GKE クラスタで Secret の自動ローテーションを構成するには、次の操作を行います。

コンソール

  1. Google Cloud コンソールで [Kubernetes クラスタ] ページに移動します。

    Kubernetes クラスタに移動

  2. クラスタのリストで、変更するクラスタの名前をクリックします。

  3. クラスタの詳細ページで、[ 編集] をクリックします。

  4. [セキュリティ] セクションで、 [Secret Manager] をクリックします。

  5. [Secret Manager の編集] ダイアログで、[Secret Manager を有効にする] チェックボックスをオンにします。

  6. [自動ローテーションを構成する] チェックボックスをオンにします。

  7. [ローテーション間隔] と [ローテーション間隔の単位] を指定します。

  8. [変更を保存] をクリックします。

gcloud

後述のコマンドデータを使用する前に、次のように置き換えます。

  • CLUSTER_NAME: クラスタの名前。
  • LOCATION: クラスタのロケーションus-central1 など)
  • ROTATION_INTERVAL: ローテーション間隔(秒単位)。値は、正の整数に接尾辞 s を付けたものにする必要があります。最小許容値は 120s です。たとえば、間隔を 5 分に設定するには、300s を使用します。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud container clusters update CLUSTER_NAME \
    --enable-secret-manager \
    --location=LOCATION \
    --enable-secret-manager-rotation \
    --secret-manager-rotation-interval=ROTATION_INTERVAL

Windows(PowerShell)

gcloud container clusters update CLUSTER_NAME `
    --enable-secret-manager `
    --location=LOCATION `
    --enable-secret-manager-rotation `
    --secret-manager-rotation-interval=ROTATION_INTERVAL

Windows(cmd.exe)

gcloud container clusters update CLUSTER_NAME ^
    --enable-secret-manager ^
    --location=LOCATION ^
    --enable-secret-manager-rotation ^
    --secret-manager-rotation-interval=ROTATION_INTERVAL

Secret Manager API に対して認証を行うようにアプリケーションを構成する

Google Secret Manager プロバイダは、Secret Manager API への認証時に、シークレットがマウントされている Pod の Workload Identity を使用します。アプリケーションが GKE 用 Workload Identity 連携を使用して Secret Manager API への認証を行えるようにするには、次の手順を行います。

  • Kubernetes ServiceAccount を作成するか、シークレットをマウントする Pod と同じ Namespace で既存の Kubernetes ServiceAccount を使用します。

  • Secret Manager で、Secret の Identity and Access Management(IAM)許可ポリシーを作成します。

構成された Kubernetes ServiceAccount を使用する Pod は、Secret Manager API にアクセスするときに、Kubernetes ServiceAccount に対応する IAM プリンシパル ID として自動的に認証されます。

Kubernetes ServiceAccount を作成する

  1. 次のマニフェストを service-account.yaml として保存します。

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: KSA_NAME
      namespace: NAMESPACE
    

    以下を置き換えます。

    • KSA_NAME: 新しい Kubernetes ServiceAccount の名前。
    • NAMESPACE: ServiceAccount の Kubernetes Namespace の名前。
  2. 次のようにマニフェストを適用します。

    kubectl apply -f service-account.yaml
    
  3. 新しい Kubernetes ServiceAccount を参照する IAM 許可ポリシーを作成し、Secret にアクセスする権限を付与します。

    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 プロジェクトのプロジェクト ID
    • NAMESPACE: ServiceAccount の Kubernetes Namespace の名前。
    • KSA_NAME: 既存の Kubernetes ServiceAccount の名前。

既存の Kubernetes ServiceAccount を使用する

既存の 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 プロジェクトのプロジェクト ID
  • NAMESPACE: ServiceAccount の Kubernetes Namespace の名前。
  • KSA_NAME: 既存の Kubernetes ServiceAccount の名前。

マウントする Secret を定義する

Kubernetes Pod 内のファイルとしてマウントするシークレットを指定するには、SecretProviderClass YAML マニフェストを作成し、マウントするシークレットとマウントする際のファイル名を一覧表示します。以下の手順に沿って登録してください。

  1. 次のマニフェストを 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 変数を使用すると、複数のファイルを作成できます。

    リージョン シークレットの場合、resourceName はリージョン シークレットのロケーションを含むシークレット リソースの完全なパスです。例: 「projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_NAME/versions/SECRET_VERSION

  2. 次のようにマニフェストを適用します。

    kubectl apply -f app-secrets.yaml -n NAMESPACE
    

    NAMESPACE は、ServiceAccount の Kubernetes Namespace の名前に置き換えます。

  3. SecretProviderClass オブジェクトが作成されていることを確認します。

    kubectl get SecretProviderClasses -n NAMESPACE
    

Secret をマウントするボリュームを構成する

  1. 次の構成を 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
    

    以下を置き換えます。

  2. Standard クラスタの場合のみtemplate.spec フィールドに以下を追加して、GKE 用 Workload Identity 連携を使用するノードプールに Pod を配置します。

    すべてのノードが GKE 用 Workload Identity 連携を使用するので、Autopilot クラスタではこの手順をスキップします。Autopilot クラスタではこの nodeSelector が拒否されます。

    spec:
      nodeSelector:
        iam.gke.io/gke-metadata-server-enabled: "true"
    
  3. クラスタに構成を適用します。

    kubectl apply -f my-pod.yaml
    

このステップでは、CSI ドライバ(secrets-store-gke.csi.k8s.io)を使用して /var/secrets にボリューム mysecret をマウントします。このボリュームは、プロバイダとして機能する SecretProviderClass オブジェクトを参照します。

既存のオープンソース Kubernetes Secrets Store CSI ドライバから移行する

オープンソースの Kubernetes Secrets Store CSI ドライバGoogle Secret Manager プロバイダを使用している場合は、マネージド Secret Manager アドオンにワークロードを移行できます。

マネージド アドオンとオープンソース ドライバは、同じクラスタで同時に実行できます。この機能を使用すると、クラスタのダウンタイムなしで個々のアプリケーションと Namespace を段階的に移行できます。

Secret Manager アドオンに移行する手順は次のとおりです。

  1. クラスタで Secret Manager アドオンを有効にする
  2. SecretProviderClass マニフェストを作成する
  3. ワークロード マニフェストを更新する
  4. 移行を確認する
  5. 古いオープンソース リソースをクリーンアップする

ステップ 1: クラスタで Secret Manager アドオンを有効にする

既存の GKE クラスタで Secret Manager アドオンを有効にします。

gcloud container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --enable-secret-manager \
    [--enable-secret-manager-rotation \
     --secret-manager-rotation-interval=ROTATION_INTERVAL]

次のように置き換えます。

  • CLUSTER_NAME: クラスタの名前
  • LOCATION: クラスタのロケーションus-central1 など)。
  • (省略可)ROTATION_INTERVAL: マウントされたシークレットが自動的に更新される頻度(120s3600s など)。最小許容値は 60s で、デフォルトは 120s です。

ステップ 2: SecretProviderClass マニフェストを作成する

各アプリケーションの provider: gke を含む SecretProviderClass マニフェストを作成します。ローリング アップデート中に 古い リソースと新しい SecretProviderClass リソースを共存させるため、リソース名に -gke を追加することをおすすめします。

  1. 次のマニフェストを secret-provider-class-gke.yaml として保存します。

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: SECRET_PROVIDER_CLASS_NAME-gke # Append -gke to coexist with existing SPC
      namespace: NAMESPACE
    spec:
      provider: gke # Changed from 'gcp'
      parameters:
        secrets: |
          - resourceName: "projects/PROJECT_ID/secrets/SECRET_NAME/versions/SECRET_VERSION"
            path: "FILENAME.txt"
    

    次のように置き換えます。

    • SECRET_PROVIDER_CLASS_NAME-gke: 新しい SecretProviderClass リソースの名前
    • NAMESPACE: ワークロードが実行される Kubernetes Namespace
    • PROJECT_ID: 実際の Google Cloud プロジェクト ID
    • SECRET_NAME: Secret Manager でのシークレットの名前
    • SECRET_VERSION: シークレットのバージョン(latest1 など)
    • FILENAME.txt: Secret 値がマウントされるファイル名

    リージョン シークレットの場合は、ロケーションを含む完全なリソースパスを指定します。"projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_NAME/versions/SECRET_VERSION"

  2. 新しい SecretProviderClass マニフェストを適用します。

    kubectl apply -f secret-provider-class-gke.yaml
    

ステップ 3: ワークロード マニフェストを更新する

マネージド ドライバ(secrets-store-gke.csi.k8s.io)を使用し、新しい SecretProviderClass 名を参照するように、Pod または Deployment マニフェストを更新します。

  1. ワークロード マニフェスト(deployment.yaml など)の volumes セクションを更新します。

    spec:
      containers:
      - name: CONTAINER_NAME
        image: IMAGE_NAME
        volumeMounts:
        - name: secrets-volume
          mountPath: "/var/secrets"
          readOnly: true
      volumes:
      - name: secrets-volume
        csi:
          driver: secrets-store-gke.csi.k8s.io # Changed from 'secrets-store.csi.k8s.io'
          readOnly: true
          volumeAttributes:
            secretProviderClass: SECRET_PROVIDER_CLASS_NAME-gke # Reference new SPC name
    

    次のように置き換えます。

    • CONTAINER_NAME: ワークロード内のコンテナの名前
    • IMAGE_NAME: コンテナ イメージの名前
    • SECRET_PROVIDER_CLASS_NAME-gke: 新しい SecretProviderClass リソースの名前
  2. 更新されたワークロード マニフェストを適用して、ローリング デプロイをトリガーします。

    kubectl apply -f deployment.yaml
    

ステップ 4: 移行を確認する

ワークロードがマネージド アドオンを正常に使用していることを確認します。

  1. Pod がロールアウトされ、Running 状態になったことを確認します。

    kubectl get pods -n NAMESPACE
    

    NAMESPACE は、ワークロードが実行される Kubernetes Namespace に置き換えます。

  2. Secret が正しくマウントされ、コンテナ内でアクセスできることを確認します。

    kubectl exec -it POD_NAME -n NAMESPACE -- cat /var/secrets/FILENAME.txt
    

    次のように置き換えます。

    • POD_NAME: Kubernetes Pod の名前
    • NAMESPACE: ワークロードが実行される Kubernetes Namespace
    • FILENAME.txt: SecretProviderClass で構成されたマウントされたシークレットのファイル名
  3. (省略可)自動ローテーションを有効にした場合は、シークレットの更新を確認します。

    1. Secret Manager でシークレットの新しいバージョンを追加します。
    2. 構成されたローテーション間隔(120 秒など)を待ちます。
    3. Pod 内でマウントされた Secret ファイルを再度検査し、Pod を再起動せずにコンテンツが更新されたことを確認します。

      kubectl exec -it POD_NAME -n NAMESPACE -- cat /var/secrets/FILENAME.txt
      

ステップ 5: 古いオープンソース リソースをクリーンアップする

  1. 古い SecretProviderClass リソースを削除します。

    kubectl delete secretproviderclass OLD_SECRET_PROVIDER_CLASS_NAME -n NAMESPACE
    

    次のように置き換えます。

    • OLD_SECRET_PROVIDER_CLASS_NAME: レガシー SecretProviderClass リソースの名前(my-app-secrets など)
    • NAMESPACE: ワークロードが実行される Kubernetes Namespace
  2. マニフェストを使用してオープンソースの Google Secret Manager プロバイダ プラグインをデプロイした場合は、DaemonSet を削除します。

    kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/secrets-store-csi-driver-provider-gcp/main/deploy/provider-gcp-plugin.yaml
    
  3. Helm を使用してオープンソースの Secrets Store CSI ドライバをインストールした場合は、Helm リリースをアンインストールします。

    helm uninstall csi-secrets-store -n kube-system
    

Secret Manager アドオンを無効にする

既存の Standard クラスタまたは Autopilot クラスタで Secret Manager アドオンを無効にするには、次のコマンドを実行します。

コンソール

  1. Google Cloud コンソールで、[Google Kubernetes Engine] ページに移動します。

    Google Kubernetes Engine に移動

  2. クラスタのリストで、変更するクラスタの名前をクリックします。

  3. クラスタの詳細ページの [セキュリティ] セクションで、 [Secret Manager] をクリックします。

  4. [Secret Manager の編集] ダイアログで、[Secret Manager を有効にする] チェックボックスをオフにします。

  5. [変更を保存] をクリックします。

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 ^

次のステップ