使用 CSI 驱动程序获取后,密钥未在 AKS 中创建

Secret is not creating in AKS after fetching it with CSI Driver

通过使用 https://docs.microsoft.com/en-us/azure/aks/csi-secrets-store-nginx-tls 本文档的参考,我正在尝试从 AKV 获取 TLS 机密到 AKS pods。 最初我使用 User Assigned Managed Identity.

创建并配置了 CSI 驱动程序配置

我执行了以下步骤:

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: azure-tls
spec:
  provider: azure
  secretObjects:                            # secretObjects defines the desired state of synced K8s secret objects
  - secretName: ingress-tls-csi
    type: kubernetes.io/tls
    data: 
    - objectName: ingresscert
      key: tls.key
    - objectName: ingresscert
      key: tls.crt
  parameters:
    usePodIdentity: "false"
    useVMManagedIdentity: "true"
    userAssignedIdentityID: "7*******-****-****-****-***********1"
    keyvaultName: "*****-*****-kv"                 # the name of the AKV instance
    objects: |
      array:
        - |
          objectName: ingresscert
          objectType: secret
    tenantId: "e*******-****-****-****-***********f"                    # the tenant ID of the AKV instance
apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox-one
  labels:
    app: busybox-one
spec:
  replicas: 1
  selector:
    matchLabels:
      app: busybox-one
  template:
    metadata:
      labels:
        app: busybox-one
    spec:
      containers:
        - name: busybox
          image: k8s.gcr.io/e2e-test-images/busybox:1.29-1
          command:
            - "/bin/sleep"
            - "10000"
          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: "azure-tls"
---
apiVersion: v1
kind: Service
metadata:
  name: busybox-one
spec:
  type: ClusterIP
  ports:
    - port: 80
  selector:
    app: busybox-one
kubectl get secret -n <namespaceName>

这里要注意的一件事是,如果我将 shell 附加到 busy box pod 并转到我提供的安装秘密的安装路径,我已经看到成功获取了秘密那里。但是这个秘密并没有出现在AKS的秘密列表中。

我已经对所有 AKS、KV 和清单文件进行了故障排除,但没有找到任何东西。 如果有任何遗漏或有人对此有解决方案,请告诉我。

提前致谢..!!!

我觉得你的配置不错。需要考虑的一件事是,User Assigned Managed Identity 不应该是您为 AKS 创建的那个,它应该是来自您的节点池 (kubelet) 的托管身份,并且它还需要对 AKV 的许可。

我在使用错误的托管身份时遇到了同样的问题。

userAssignedIdentityID = Kubelet Client Id ( Nodepool Managed Idendity )

AZ CLI

export KUBE_ID=$(az aks show -g <resource group> -n <aks cluster name> --query identityProfile.kubeletidentity.objectId -o tsv)
export AKV_ID=$(az keyvault show -g <resource group> -n <akv name> --query id -o tsv)
az role assignment create --assignee $KUBE_ID --role "Key Vault Secrets Officer" --scope $AKV_ID

我将此添加为新答案,因为评论中的格式不正确:

当您使用 Helm Chart 时,您必须在 Helm Chart 的 values.yaml 中激活秘密同步:

secrets-store-csi-driver:
  syncSecret:
    enabled: true

我仍然建议使用 csi-secrets-store-provider-azure 作为 AKS 插件而不是 Helm-Chart