Интеграция хранилища ключей Azure со службой Azure Kubernetes с использованием управляемой идентификации

Я настраиваю интеграцию Keyvault с k8s в Azure. Я могу смонтировать том с секретами с помощью драйвера csi в Azure с помощью управляемых удостоверений. Я могу проверить, что секрет установлен, выполнив команду в модуле и выведя секреты. Однако теперь я хочу раскрыть секреты как переменные среды, но я не понимаю, как это сделать. Ниже приводится следующее SecretProviderClass и Pod Я развернулся.

spc-keyvault.yaml:

      apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
  name: spc-keyvault
spec:
  provider: azure
  secretObjects:
  - secretName: foobar-secret
    data:
    - key: foobar
      objectName: foobar
    type: Opaque
  parameters:
    keyvaultName: "$keyvault"
    usePodIdentity: "true"
    useVMManagedIdentity: "false"
    userAssignedIdentityID: ""
    cloudName: ""
    objects: |
      array:
        - |
          objectName: foobar
          objectType: secret
          objectVersion: ""
    resourceGroup: "$resourceGroup"
    subscriptionId: "$subId"
    tenantId: "$tenantId"

под.ямл:

      apiVersion: v1
kind: Pod
metadata:
  name: inject-secrets-from-akv
  labels:
    aadpodidbinding: azure-pod-identity-binding-selector
spec:
  containers:
    - name: nginx
      image: nginx
      env:
      - name: SECRET
        valueFrom:
          secretKeyRef:
            name: foobar-secret
            key: foobar
      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: spc-keyvault

Вот ошибка, когда я развертываю свой манифест Pod:

      Events:
  Type     Reason   Age                     From     Message
  ----     ------   ----                    ----     -------
  Warning  Failed   58m (x227 over 108m)    kubelet  Error: secret "foobar-secret" not found
  Normal   Pulling  3m51s (x470 over 108m)  kubelet  Pulling image "nginx"

Ошибка довольно очевидна, нет никакого секрета с названием: foobar-secret. Я думал, что драйвер csi автоматически создал необходимые секреты. Итак, после некоторого исследования и изучения документации и исходного кода я нашел предложение добавить в pod yaml. Тогда вам нужно установить nodePublishSecretRef с идентификатором клиента aad и секретом клиента.[1, 2] Однако, поскольку я использую управляемую идентификацию, я не уверен, как это сделать.

Кто-нибудь получил эту работу с помощью Managed Identity и может предоставить какое-либо представление? Или мне нужно создать сценарий запуска (через configmap?), Чтобы заполнить монтирование тома как env. переменные.

  1. https://azure.github.io/secrets-store-csi-driver-provider-azure/configurations/identity-access-modes/service-principal-mode/
  2. https://medium.com/swlh/integrate-azure-key-vault-with-azure-kubernetes-service-1a8740429bea

2 ответа

Решение

После дополнительных поисков я обнаружил, что этот бит щекочет в диаграмме управления, чтобы заставить драйвер csi создавать секреты k8s:

      secrets-store-csi-driver.syncSecret.enabled = true

Теперь у меня есть секреты k8s. Подумал, что я поделюсь с кем угодно, кто хочет эту функциональность.

Мне удалось решить эту проблему, обновив entrypoint.sh для экспорта секретов в переменные env. Что-то вроде этого:

      if [ ! -z ${SECRET_PATH+x} ]
then

  echo "Exporting secrets as env. variables."
  for f in $(ls ${SECRET_PATH})
  do

    echo "Exporting $f..."
    export $f=$(cat ${SECRET_PATH}/$f)

  done

fi
Другие вопросы по тегам