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

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

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

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

  1. Secret Manager アドオンを新規または既存の GKE クラスタにインストールします。
  2. Secret Manager API に対する認証を行うようにアプリケーションを構成します。
  3. SecretProviderClass YAML ファイルを使用して、Kubernetes Pod にマウントするシークレットを定義します。
  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 アドオンは、linux/arm64linux/amd64 のデプロイをサポートしています。

制限事項

Secret Manager アドオンのこのプレビュー リリースでは、オープンソースの Secrets Store CSI ドライバで利用可能な次の機能はサポートされていません。

準備

  • Enable the Secret Manager and Google Kubernetes Engine APIs.

    Enable the APIs

  • このタスクに 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 ボリュームで 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 への認証を行えるようにするには、次の手順を行います。

  • 新しい Kubernetes ServiceAccount を作成するか、デフォルトの Kubernetes ServiceAccount を含む任意の名前空間で既存の 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 を参照する 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 の名前。

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

    kubectl apply -f app-secrets.yaml
    
  3. SecretProviderClass オブジェクトが作成されていることを確認します。

    kubectl get SecretProviderClasses
    

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

  1. 次の構成を 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 ServiceAccount
    • IMAGE_NAME: コンテナ イメージの名前
    • SECRET_PROVIDER_CLASS_NAME: SecretProviderClass オブジェクトの名前
  2. クラスタに構成を適用します。

    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 マニフェストを次のように更新します。

  1. 次のマニフェストの説明に従って SecretProviderClassprovider の名前を更新します。

    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"
    
  2. 次のマニフェストに記載されているように、Kubernetes ボリュームの driversecretProviderClass を更新します。

    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 など)