Secret Manager 연동 예제

Prev Next

VPC 환경에서 이용 가능합니다.

Ncloud Kubernetes Service에서 Secret Manager와 연동하여 Secret을 사용할 수 있습니다.

Secret Manager에서 Secret 생성

Secret Manager 사용 가이드를 참고해서 my-secret Secret을 생성하고 id, password를 Key로 가지는 Value를 등록합니다.

Secret Manager 에 등록 된 Secret 전체를 마운트해서 사용

  1. SecretProviderClass 생성
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: my-secret
  namespace: default
spec:
  provider: ncp
  parameters:
    objects: |
      - objectName: "my-secret"
        objectType: "secretmanager"
        path: "my-secret.txt"
  1. SecretProviderClass를 마운트해서 사용하는 Pod 생성
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  namespace: default
spec:
  containers:
  - name: my-pod
    command: [ "sleep", "1000000" ]
    image: busybox
    imagePullPolicy: IfNotPresent
    volumeMounts:
      - mountPath: "/var/secrets"
        name: my-secret
  volumes:
  - name: my-secret
    csi:
      driver: secrets-store.csi.k8s.io
      readOnly: true
      volumeAttributes:
        secretProviderClass: "my-secret"
  1. Pod에 접근해서 Secret이 정상적으로 마운트 되었는지 확인
$ kubectl exec my-pod -- ls /var/secrets
my-secret.txt

$ kubectl exec my-pod -- cat /var/secrets/my-secret.txt
{"id": "my-id", "password": "my-password"}

Secret Manager에 등록된 Secret의 특정 Key를 사용해서 마운트

  1. SecretProviderClass 생성
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: my-secret
  namespace: default
spec:
  provider: ncp
  parameters:
    objects: |
      - objectName: "my-secret"
        objectType: "secretmanager"
        secretKey: "id"
        path: "id.txt"
      - objectName: "my-secret"
        objectType: "secretmanager"
        secretKey: "password"
        path: "password.txt"
  1. SecretProviderClass를 마운트해서 사용하는 Pod 생성
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  namespace: default
spec:
  containers:
  - name: my-pod
    command: [ "sleep", "1000000" ]
    image: busybox
    imagePullPolicy: IfNotPresent
    volumeMounts:
      - mountPath: "/var/secrets"
        name: my-secret
  volumes:
  - name: my-secret
    csi:
      driver: secrets-store.csi.k8s.io
      readOnly: true
      volumeAttributes:
        secretProviderClass: "my-secret"
  1. Pod에 접근해서 Secret이 정상적으로 마운트 되었는지 확인
$ kubectl exec my-pod -- ls /var/secrets
id.txt
password.txt

$ kubectl exec my-pod -- cat /var/secrets/id.txt
my-id

$ kubectl exec my-pod -- cat /var/secrets/password.txt
my-password

Secret Manager에 등록된 Secret을 Kubernetes Secret과 동기화

Secret Manager에 등록된 Secret을 Kubernetes Secret과 동기화하려면 반드시 해당 Secret이 Pod에 마운트 되어 있어야 합니다.

  1. SecretProviderClass 생성
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: my-secret
  namespace: default
spec:
  provider: ncp
  parameters:
    objects: |
      - objectName: "my-secret"
        objectType: "secretmanager"
        path: "my-secret.txt"
  secretObjects:
  - secretName: my-secret
    type: Opaque
    data:
    - objectName: my-secret.txt
      key: my-key
  1. SecretProviderClass를 마운트해서 사용하는 Pod 생성
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  namespace: default
spec:
  containers:
  - name: my-pod
    command: [ "sleep", "1000000" ]
    image: busybox
    imagePullPolicy: IfNotPresent
    volumeMounts:
      - mountPath: "/var/secrets"
        name: my-secret
  volumes:
  - name: my-secret
    csi:
      driver: secrets-store.csi.k8s.io
      readOnly: true
      volumeAttributes:
        secretProviderClass: "my-secret"
  1. 해당 Secret이 정상적으로 생성되었는지 확인
$ kubectl get secret my-secret -o yaml

apiVersion: v1
data:
  my-key: eyJpZCI6ICJteS1pZCIsICJwYXNzd29yZCI6ICJteS1wYXNzd29yZCJ9
kind: Secret
metadata:
  labels:
    secrets-store.csi.k8s.io/managed: "true"
  name: my-secret
  namespace: default
  ownerReferences:
  - apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClassPodStatus
    name: my-pod-default-my-secret
type: Opaque