Kubernetes, Key Vault 활용하기

눕눕·2023년 7월 1일
0

Kubernetes 도입하기

목록 보기
4/8

Key Vault를 Kubernetes에서 왜 활용해?

secret!?

kubernetes에서는 secret이라는 object가 있다. 이름에서도 알 수 있듯이 비밀스러운 것들을 넣고 빼는 건데 이러한 사람들이 있을 수 있다.

  1. 내 yaml 파일이 어쩔 수 없이 여러 사람들과 공유되어 사용되고 있는데 이 secret 값들을 그 사람들이 보는게 싫다.
  2. base64 디코딩 하면 다 보이니 위험해 보인다.
  3. 그냥 진짜 비밀 스럽게 숨겨서 쓰고 싶다.

이러한 경우, key vault를 활용해 보는걸 추천한다.

Key Vault를 활용하면 yaml 또는 application에 비밀번호 및 숨기고싶은 정보를 적지 않은채 pod에서 활용할 수 있다!!

물론 cicd 과정에서 ci 때 갖은 수단과 방법을 가리지 않고 여러 정보들을 넣어줄 수 있다지만, 이번에는 쉽고 정상적인 접근으로 접근해보자!! 우리가 괴롭히지 않아도 devops 엔지니어들은 충분히 고통스럽다.

어떻게 하는데 그거?

준비물

csi driver가 필요하다.

kubernetes를 처음 생성할 때 이런 옵션을 본 기억이 날 것이다.

만약 놓쳤다면 아래와 같은 명령어를 통해 csi driver를 설치할 수 있다.

az aks enable-addons --addons azure-keyvault-secrets-provider --name myAKSCluster --resource-group myResourceGroup

그러면 아래와 같이 kube-system namespace 아래에 보이게 된다!!

Key Vault가 필요하다.

적당히 Key Vault를 생성하고 아래와 같은 managed identity를 찾아서 Key Vault에 적절한 IAM 권한을 주자.

나는 위와 같이 secret만 읽어올 것이라 Key Vault Secret User role을 해당 managed identity에 부여했다.

준비는 끝이났다. 써보자.

SecretProviderClass를 정의해서 내가 가져올 값들을 기술해야한다. parameter 에 objects 아래에 있는 array로 묶여진 objectname은 Key Vault에 저장한 나의 key, secret, cert의 이름이어야 한다.

spec.secretObjects.secretName 은 pod에서 사용할 secret 이름이다.

중요한 점은 SecretProviderClass가 무조건 아래와 같이 pod에 마운트가 되어야 사용이 가능하다.

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: azure-kvname-user-msi
spec:
  provider: azure
  secretObjects:
    - secretName: some-secret-name1
      type: Opaque
      data:
        - objectName: secret1
          key: secret-key-name1
    - secretName: some-secret-name2
      type: Opaque
      data:
        - objectName: secret2
          key: secret-key-name2
  parameters:
    usePodIdentity: "false"
    useVMManagedIdentity: "true"          # Set to true for using managed identity
    userAssignedIdentityID: <client-id>   # Set the clientID of the user-assigned managed identity to use
    keyvaultName: <key-vault-name>        # Set to the name of your key vault
    cloudName: ""                         # [OPTIONAL for Azure] if not provided, the Azure environment defaults to AzurePublicCloud
    objects:  |
      array:
        - |
          objectName: secret1
          objectType: secret              # object types: secret, key, or cert
          objectVersion: ""               # [OPTIONAL] object versions, default to latest if empty
        - |
          objectName: secret2
          objectType: secret
          objectVersion: ""
    tenantId: <tenant-id>                 # The tenant ID of the key vault
# This is a sample pod definition for using SecretProviderClass and the user-assigned identity to access your key vault
kind: Pod
apiVersion: v1
metadata:
  name: busybox-secrets-store-inline-user-msi
spec:
  containers:
  - name: busybox
    image: registry.k8s.io/e2e-test-images/busybox:1.29-1
    command:
      - "/bin/sleep"
      - "10000"
    volumeMounts:
    - name: secrets-store01-inline
      mountPath: "/mnt/secrets-store"
      readOnly: true
    env:
    - name: env_secret
      valueFrom:
        secretKeyRef:
          name: some-secret-name1
          key: secret-key-name1
  volumes:
  - name: secrets-store01-inline
    csi:
      driver: secrets-store.csi.k8s.io
      readOnly: true
      volumeAttributes:
        secretProviderClass: "azure-kvname-user-msi"

위와 같이 volume에 마운트 하는것 뿐만아니라 env로 넣어서 사용하고 싶어도 SecretProviderClass 자체의 마운트는 필수이다!!

위에 배포한 것들을 확인하려면 아래를 통해 확인하자!

kubectl exec pod-name -- sh -c 'echo $env_secret'

마치며

이미 사용하는 사람들이 더 많곘지만, AKS 생성할떄 '어라!? secret csi driver를 설치했었는데 어떻게 쓰는지 모르곘네?' 하는사람들이 있을 수 있다. 혹은 나와 같이, 기본 제공되는 secret object의 base64에 불만이 있는 사람들에게 유용하게 사용할 수 있는 기능이 있어 다행이다. yaml 여러 개발자와 공유가 되는 상황이면 너무 찜찜하다구요!!

profile
n년차 눕눕

0개의 댓글