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という名前のサービスアカウントキーを作成した。
手順
Google Secret Manager プロバイダーをインストールします。
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次のコマンドを実行して、
csi-secrets-store-provider-gcpサービスアカウントに特権アクセスを付与します。$ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-gcp -n openshift-cluster-csi-drivers次のコマンドを実行して、プロバイダーリソースを作成します。
$ oc apply -f gcp-provider.yaml
Google Secret Manager シークレットに読み取り権限を付与します。
次のコマンドを実行して新しいプロジェクトを作成します。
$ oc new-project my-namespace次のコマンドを実行して、Pod セキュリティーアドミッション用の
my-namespacenamespace にラベルを付けます。$ 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 --overwritePod のデプロイメント用のサービスアカウントを作成します。
$ oc create serviceaccount my-service-account --namespace=my-namespace次のコマンドを実行して、
key.jsonファイルから汎用シークレットを作成します。$ oc create secret generic secrets-store-creds -n my-namespace --from-file=key.json1 - 1
- この
key.jsonファイルは Google Secret Manager から作成したものです。
secrets-store.csi.k8s.io/used=trueラベルを適用して、プロバイダーがこのnodePublishSecretRefシークレットを検索できるようにします。$ oc -n my-namespace label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
シークレットプロバイダークラスを作成して、シークレットストアプロバイダーを定義します。
SecretProviderClassオブジェクトを定義する YAML ファイルを作成します。secret-provider-class-gcp.yamlの例apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: my-gcp-provider1 namespace: my-namespace2 spec: provider: gcp3 parameters:4 secrets: | - resourceName: "projects/my-project/secrets/testsecret1/versions/1" path: "testsecret1.txt"次のコマンドを実行して
SecretProviderClassオブジェクトを作成します。$ oc create -f secret-provider-class-gcp.yaml
このシークレットプロバイダークラスを使用するデプロイメントを作成します。
Deploymentオブジェクトを定義する YAML ファイルを作成します。deployment.yamlの例apiVersion: apps/v1 kind: Deployment metadata: name: my-gcp-deployment1 namespace: my-namespace2 spec: replicas: 1 selector: matchLabels: app: my-storage template: metadata: labels: app: my-storage spec: serviceAccountName: my-service-account3 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-creds5 次のコマンドを実行して、
Deploymentオブジェクトを作成します。$ oc create -f deployment.yaml
検証
Pod ボリュームマウント内の Google Secret Manager からのシークレットにアクセスできることを確認します。
次のコマンドを実行して、Pod マウント内のシークレットをリスト表示します。
$ oc exec my-gcp-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/出力例
testsecret1次のコマンドを実行して、Pod マウント内のシークレットを表示します。
$ oc exec my-gcp-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testsecret1出力例
<secret_value>