Vault Secrets Store CSI provider 예시

Vault Secrets Store CSI provider 예시

다음 예시는 Vault Secrets Store CSI provider의 일반적인 사용법을 보여줍니다.

출처: 문서

본문

파일 기반 동적 데이터베이스 자격증명

다음 Secret Provider Class는 Vault에서 동적 데이터베이스 자격증명을 가져와 생성된 사용자 이름과 비밀번호를 추출합니다. 그런 다음 시크릿은 구성된 마운트 위치에 파일로 마운트됩니다.

---
apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
  name: vault-db-creds
spec:
  provider: vault
  parameters:
    roleName: 'app'
    objects: |
      - objectName: "dbUsername"
        secretPath: "database/creds/db-app"
        secretKey: "username"
      - objectName: "dbPassword"
        secretPath: "database/creds/db-app"
        secretKey: "password"

다음으로, 이 Secret Provider Class를 사용해 파드의 시크릿을 채우는 파드를 만들 수 있습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
  labels:
    app: demo
spec:
  selector:
    matchLabels:
      app: demo
  replicas: 1
  template:
    metadata:
      annotations:
      labels:
        app: demo
    spec:
      serviceAccountName: app
      containers:
        - name: app
          image: my-app:1.0.0
          volumeMounts:
            - name: 'vault-db-creds'
              mountPath: '/mnt/secrets-store'
              readOnly: true
      volumes:
        - name: vault-db-creds
          csi:
            driver: 'secrets-store.csi.k8s.io'
            readOnly: true
            volumeAttributes:
              secretProviderClass: 'vault-db-creds'

파드는 CSI 볼륨을 마운트하고 위에서 만든 Secret Provider Class(vault-db-creds)를 지정합니다. 그 프로바이더 클래스에서 만들어진 시크릿은 /mnt/secrets-store에 마운트됩니다. 이 파드가 생성되면 컨테이너는 시크릿을 담은 두 개의 파일을 찾게 됩니다.

  • /mnt/secrets-store/dbUsername
  • /mnt/secrets-store/dbPassword

환경 변수 동적 데이터베이스 자격증명

다음 Secret Provider Class는 Vault에서 동적 데이터베이스 자격증명을 가져와 생성된 사용자 이름과 비밀번호를 추출합니다. 그런 다음 시크릿을 Kubernetes 시크릿에 동기화해 컨테이너에서 환경 변수로 마운트할 수 있게 합니다.

---
apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
  name: vault-db-creds
spec:
  provider: vault
  secretObjects:
    - secretName: vault-db-creds-secret
      type: Opaque
      data:
        - objectName: dbUsername # References dbUsername below
          key: username # Key within k8s secret for this value
        - objectName: dbPassword
          key: password
  parameters:
    roleName: 'app'
    objects: |
      - objectName: "dbUsername"
        secretPath: "database/creds/db-app"
        secretKey: "username"
      - objectName: "dbPassword"
        secretPath: "database/creds/db-app"
        secretKey: "password"

다음으로, 이 Secret Provider Class를 사용해 파드의 환경에 시크릿을 채우는 파드를 만들 수 있습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
  labels:
    app: demo
spec:
  selector:
    matchLabels:
      app: demo
  replicas: 1
  template:
    metadata:
      annotations:
      labels:
        app: demo
    spec:
      serviceAccountName: app
      containers:
        - name: app
          image: my-app:1.0.0
          env:
            - name: DB_USERNAME
              valueFrom:
                secretKeyRef:
                  name: vault-db-creds-secret
                  key: username
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: vault-db-creds-secret
                  key: password
          volumeMounts:
            - name: 'vault-db-creds'
              mountPath: '/mnt/secrets-store'
              readOnly: true
      volumes:
        - name: vault-db-creds
          csi:
            driver: 'secrets-store.csi.k8s.io'
            readOnly: true
            volumeAttributes:
              secretProviderClass: 'vault-db-creds'

파드는 CSI 볼륨을 마운트하고 위에서 만든 Secret Provider Class(vault-db-creds)를 지정합니다. 그 프로바이더 클래스에서 만들어진 시크릿은 /mnt/secrets-store에 마운트되며, 추가로 vault-db-creds-secret이라는 Kubernetes 시크릿이 생성되어 두 환경 변수에서 참조됩니다.

더 알아보기 (Learn more)