1

我正在 Azure 中设置 Keyvault 与 k8s 的集成。我可以使用托管标识在 Azure 中使用 csi 驱动程序装载包含机密的卷。我可以通过在 pod 中执行并找出秘密来验证秘密是否已安装。但是,现在我想将秘密公开为环境变量,但我不清楚如何做到这一点。以下是我已经部署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"

pod.yaml:

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 驱动程序会自动创建所需的机密。因此,经过一些研究和挖掘文档和源代码后,我找到了添加nodePublishSecretRef到 pod yaml 的建议。然后您需要nodePublishSecretRef使用 aad 客户端 ID 和客户端密码进行设置。[1, 2] 但是,由于我使用的是托管身份,因此我不确定如何执行此操作。

有没有人使用托管身份进行这项工作并且可以提供任何见解?或者我是否需要创建一个启动脚本(通过 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
4

2 回答 2

1

我能够通过更新 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
于 2021-08-10T03:25:04.737 回答
1

经过更多的挖掘,我在 helm 图表中发现了这一点,以获取 csi 驱动程序来创建 k8s 机密:

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

现在我有了 k8s 的秘密。想我会分享给其他想要这个功能的人。

于 2021-08-11T03:00:39.360 回答