2.8.3.4. Google Secret Manager からのシークレットのマウント


Secrets Store CSI Driver Operator を使用して、Google Secret Manager から OpenShift Container Platform の Container Storage Interface (CSI) ボリュームにシークレットをマウントできます。Google Secret Manager からシークレットをマウントするには、クラスターが Google Cloud にインストールされている必要があります。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • Secrets Store CSI Driver Operator がインストールされている。手順は、「Secrets Store CSI ドライバーのインストール」を参照してください。
  • 必要なシークレットを保存するように Google Secret Manager を設定した。
  • Google Cloud サービスアカウントから key.json という名前のサービスアカウントキーを作成した。

手順

  1. Google Secret Manager プロバイダーをインストールします。

    1. ServiceAccount リソース設定を定義する、gcp-provider.yaml という名前の YAML ファイルを作成します。次の設定例を参照してください。

      gcp-provider.yaml ファイルの例

      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: csi-secrets-store-provider-gcp
        namespace: openshift-cluster-csi-drivers
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: csi-secrets-store-provider-gcp-rolebinding
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: csi-secrets-store-provider-gcp-role
      subjects:
        - kind: ServiceAccount
          name: csi-secrets-store-provider-gcp
          namespace: openshift-cluster-csi-drivers
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        name: csi-secrets-store-provider-gcp-role
      rules:
        - apiGroups:
            - ""
          resources:
            - serviceaccounts/token
          verbs:
            - create
        - apiGroups:
            - ""
          resources:
            - serviceaccounts
          verbs:
            - get
      ---
      apiVersion: apps/v1
      kind: DaemonSet
      metadata:
        name: csi-secrets-store-provider-gcp
        namespace: openshift-cluster-csi-drivers
        labels:
          app: csi-secrets-store-provider-gcp
      spec:
        updateStrategy:
          type: RollingUpdate
        selector:
          matchLabels:
            app: csi-secrets-store-provider-gcp
        template:
          metadata:
            labels:
              app: csi-secrets-store-provider-gcp
          spec:
            serviceAccountName: csi-secrets-store-provider-gcp
            initContainers:
            - name: chown-provider-mount
              image: busybox
              command:
              - chown
              - "1000:1000"
              - /etc/kubernetes/secrets-store-csi-providers
              volumeMounts:
              - mountPath: "/etc/kubernetes/secrets-store-csi-providers"
                name: providervol
              securityContext:
                privileged: true
            hostNetwork: false
            hostPID: false
            hostIPC: false
            containers:
              - name: provider
                image: us-docker.pkg.dev/secretmanager-csi/secrets-store-csi-driver-provider-gcp/plugin@sha256:a493a78bbb4ebce5f5de15acdccc6f4d19486eae9aa4fa529bb60ac112dd6650
                securityContext:
                  privileged: true
                imagePullPolicy: IfNotPresent
                resources:
                  requests:
                    cpu: 50m
                    memory: 100Mi
                  limits:
                    cpu: 50m
                    memory: 100Mi
                env:
                  - name: TARGET_DIR
                    value: "/etc/kubernetes/secrets-store-csi-providers"
                volumeMounts:
                  - mountPath: "/etc/kubernetes/secrets-store-csi-providers"
                    name: providervol
                    mountPropagation: None
                    readOnly: false
                livenessProbe:
                  failureThreshold: 3
                  httpGet:
                    path: /live
                    port: 8095
                  initialDelaySeconds: 5
                  timeoutSeconds: 10
                  periodSeconds: 30
            volumes:
              - name: providervol
                hostPath:
                  path: /etc/kubernetes/secrets-store-csi-providers
            tolerations:
              - key: kubernetes.io/arch
                operator: Equal
                value: amd64
                effect: NoSchedule
            nodeSelector:
              kubernetes.io/os: linux

    2. 次のコマンドを実行して、csi-secrets-store-provider-gcp サービスアカウントに特権アクセスを付与します。

      $ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-gcp -n openshift-cluster-csi-drivers
    3. 次のコマンドを実行して、プロバイダーリソースを作成します。

      $ oc apply -f gcp-provider.yaml
  2. Google Secret Manager シークレットに読み取り権限を付与します。

    1. 次のコマンドを実行して新しいプロジェクトを作成します。

      $ oc new-project my-namespace
    2. 次のコマンドを実行して、Pod セキュリティーアドミッション用の my-namespace namespace にラベルを付けます。

      $ oc label ns my-namespace security.openshift.io/scc.podSecurityLabelSync=false pod-security.kubernetes.io/enforce=privileged pod-security.kubernetes.io/audit=privileged pod-security.kubernetes.io/warn=privileged --overwrite
    3. Pod のデプロイメント用のサービスアカウントを作成します。

      $ oc create serviceaccount my-service-account --namespace=my-namespace
    4. 次のコマンドを実行して、key.json ファイルから汎用シークレットを作成します。

      $ oc create secret generic secrets-store-creds -n my-namespace --from-file=key.json 
      1
      1
      この key.json ファイルは Google Secret Manager から作成したものです。
    5. secrets-store.csi.k8s.io/used=true ラベルを適用して、プロバイダーがこの nodePublishSecretRef シークレットを検索できるようにします。

      $ oc -n my-namespace label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
  3. シークレットプロバイダークラスを作成して、シークレットストアプロバイダーを定義します。

    1. SecretProviderClass オブジェクトを定義する YAML ファイルを作成します。

      secret-provider-class-gcp.yaml の例

      apiVersion: secrets-store.csi.x-k8s.io/v1
      kind: SecretProviderClass
      metadata:
        name: my-gcp-provider                        
      1
      
        namespace: my-namespace                      
      2
      
      spec:
        provider: gcp                                
      3
      
        parameters:                                  
      4
      
          secrets: |
            - resourceName: "projects/my-project/secrets/testsecret1/versions/1"
              path: "testsecret1.txt"

      1
      シークレットプロバイダークラスの名前を指定します。
      2
      シークレットプロバイダークラスの namespace を指定します。
      3
      プロバイダーを gcp として指定します。
      4
      プロバイダー固有の設定パラメーターを指定します。
    2. 次のコマンドを実行して SecretProviderClass オブジェクトを作成します。

      $ oc create -f secret-provider-class-gcp.yaml
  4. このシークレットプロバイダークラスを使用するデプロイメントを作成します。

    1. Deployment オブジェクトを定義する YAML ファイルを作成します。

      deployment.yaml の例

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: my-gcp-deployment                              
      1
      
        namespace: my-namespace                              
      2
      
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: my-storage
        template:
          metadata:
            labels:
              app: my-storage
          spec:
            serviceAccountName: my-service-account           
      3
      
            containers:
            - name: busybox
              image: k8s.gcr.io/e2e-test-images/busybox:1.29
              command:
                - "/bin/sleep"
                - "10000"
              volumeMounts:
              - name: secrets-store-inline
                mountPath: "/mnt/secrets-store"
                readOnly: true
            volumes:
              - name: secrets-store-inline
                csi:
                  driver: secrets-store.csi.k8s.io
                  readOnly: true
                  volumeAttributes:
                    secretProviderClass: "my-gcp-provider"   
      4
      
                  nodePublishSecretRef:
                    name: secrets-store-creds                
      5

      1
      デプロイメントの名前を指定します。
      2
      デプロイメントの namespace を指定します。これは、シークレットプロバイダークラスと同じ namespace である必要があります。
      3
      作成したサービスアカウントを指定します。
      4
      シークレットプロバイダークラスの名前を指定します。
      5
      Google Secret Manager にアクセスするためのサービスプリンシパル認証情報を含む Kubernetes シークレットの名前を指定します。
    2. 次のコマンドを実行して、Deployment オブジェクトを作成します。

      $ oc create -f deployment.yaml

検証

  • Pod ボリュームマウント内の Google Secret Manager からのシークレットにアクセスできることを確認します。

    1. 次のコマンドを実行して、Pod マウント内のシークレットをリスト表示します。

      $ oc exec my-gcp-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/

      出力例

      testsecret1

    2. 次のコマンドを実行して、Pod マウント内のシークレットを表示します。

      $ oc exec my-gcp-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testsecret1

      出力例

      <secret_value>

Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

Red Hat ドキュメントについて

Legal Notice

Theme

© 2026 Red Hat
トップに戻る