Secret Manager 연동

Prev Next

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

Ncloud Kubernetes Service에서는 Secret Manager에 저장된 Secret을 연동하여 사용할 수 있습니다. 해당 기능은 Kubernetes에서 제공하는 Secrets Store CSI Driver와 Ncloud Kubernetes Service에서 제공하는 secrets-store-csi-drvier-provider-ncp를 통해 제공됩니다.

제약 사항

  • Secret Manager는 한국, 일본 리전에서만 제공됩니다.

요구 사항

  • Secret Manager를 사용하고 있어야 합니다.
  • Secret Manager 조회를 위해 서브계정 일 경우 NCP_SECRETMANAGER_USER 권한이 필요합니다.

기능

  • Secret Manager에 저장된 Secret을 Pod에 볼륨으로 마운트하여 사용할 수 있습니다.
  • Secret Manager에 저장된 Secret이 교체될 경우 Pod에 마운트 된 Secret도 자동으로 교체할 수 있습니다.
  • Secret Manager에 저장된 Secret을 Kubernetes의 Secret과 동기화할 수 있습니다.

설치

Secret Manager 연동을 위해 secrets-store-csi-driver와 secrets-store-csi-driver-provider-ncp를 설치해야 합니다.

  1. 아래 명령어를 통해 secrets-store-csi-driver를 설치해 주십시오.

    • Secret 교체 기능을 사용하려면 --set enableSecretRotation=true 설정을 추가해 주십시오.
    • Kubernetes Secret 동기화 기능을 사용하려면 --set syncSecret.enabled=true 설정을 추가해 주십시오.
    $ helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
    $ helm install csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver --namespace kube-system
    
  2. Secret Manager API 호출을 위한 인증 정보를 생성해 주십시오.

    • ncloud_access_key_id: Ncloud AcessKey
    • ncloud_secret_access_key: Ncloud SecretKey
    • secretmanager_api_url
      • 한국: https://ocapi-kr.ncloud.com/secretmanager/api/v1
      • 일본: https://ocapi-jp.ncloud.com/secretmanager/api/v1
    $ vi configure
    ncloud_access_key_id=<ACCESS_KEY_ID>
    ncloud_secret_access_key=<SECRET_ACESS_KEY>
    secretmanager_api_url=<SecretManager API URL>
    
  3. 아래 명령어를 통해 인증정보를 Kubernetes Secret으로 생성해 주십시오.

    $ kubectl -n kube-system create secret generic ncp-secrets-store-credentials --from-file=./configure
    
  4. 아래 명령어를 통해 해당하는 리전의 secrets-store-csi-driver-provider-ncp를 설치해 주십시오.

    # 한국 리전
    $ kubectl --kubeconfig=$KUBE_CONFIG apply -f https://kr.object.ncloudstorage.com/nks-download/secrets-store-csi-driver-provider-ncp/pub/kr/v0.1.0/provider-ncp.yaml
    
    # 일본 리전
    $ kubectl --kubeconfig=$KUBE_CONFIG apply -f https://kr.object.ncloudstorage.com/nks-download/secrets-store-csi-driver-provider-ncp/pub/jp/v0.1.0/provider-ncp.yaml
    
    
  5. 아래 명령어를 통해 설치된 Pod 들이 정상적으로 동작하는지 확인해 주십시오.

$ kubectl -n kube-system get po -l app.kubernetes.io/instance=csi-secrets-store
$ kubectl -n kube-system get po -l app=secrets-store-csi-driver-provider-ncp

사용

SecretProviderClass 정의

SecretProviderClass를 정의하여 Secret Manager와 연동된 Secret을 사용할 수 있습니다.

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: my-secret
  namespace: my-namespace
spec:
  provider: ncp
  parameters:
    objects: |
      - objectName: "my-secret"
        objectType: "secretmanager"
        path: "my-secret.txt"
      - objectName: "my-secret"
        objectType: "secretmanager"
        secretKey: "id"
        path: "id.txt"
      - objectName: "my-secret"
        objectType: "secretmanager"
        secretKey: "password"
        path: "password.txt"
  secretObjects:
  - secretName: my-secret
    type: Opaque
    data:
    - objectName: my-secret.txt
      key: my-key
  • provider: ncp
  • objects: 파일로 마운트 할 Secret 을 정의합니다.
    • objectName: SecretManager에 생성 한 Secret 이름
    • objectType: secretmanager
    • path: Pod에 마운트 될 파일 이름
    • secretKey(선택사항): SecretManager에 저장된 Secret 중 해당 Key의 Value만 사용. 정의하지 않으면 해당 Secret에 저장된 모든 Key/Value를 JSON 형태로 사용
  • secretObjects(선택사항): Kubernetes Secret과 동기화를 할 경우 설정
    • secretName: 생성 될 Kubernetes Secret
    • data.objectName: Pod에 마운트 된 파일 이름(path)
    • data.key: 생성 된 Secret data의 key 이름

Pod 마운트 설정

Pod의 volumes에 secretProviderClass를 설정하여 사용할 수 있습니다.

  volumes:
  - name: my-secret
    csi:
      driver: secrets-store.csi.k8s.io
      readOnly: true
      volumeAttributes:
        secretProviderClass: "my-secret"

Secret 마운트 상태 확인

SecretProviderClassPodStatus를 조회해서 현재 Pod에 마운트 된 Secret의 상태를 확인할 수 있습니다.

$ kubectl get secretproviderclasspodstatuses <pod_name>-<namespace>-<secretproviderclass_name> -o yaml
...
status:
  mounted: true
  objects:
  - id: secretmanager/my-secret
    version: "1"
  podName: my-pod
  secretProviderClassName: my-secret
  targetPath: /var/lib/kubelet/pods/1d401b1a-9a16-4335-b015-59e11e87b349/volumes/kubernetes.io~csi/my-secret/mount

Secret 교체 기능 사용

Secret Manager의 Secret 교체 설정을 참고해서 Secret 교체를 진행하실 수 있습니다. Secret Manager의 Secret이 교체되면 해당 Secret이 마운트 된 파일 또한 자동으로 동기화됩니다. 해당 기능은 secrets-store-csi-driver의 알파 버전으로 제공되고 있으며 사용 전에 공식 가이드 참고 바랍니다.