1

通过使用https://docs.microsoft.com/en-us/azure/aks/csi-secrets-store-nginx-tls本文档的参考,我正在尝试将 TLS 机密从 AKV 获取到 AKS pod。最初,我使用User Assigned Managed Identity创建和配置CSI 驱动程序配置

我已经执行了以下步骤:

  • 创建具有 1 个节点池的 AKS 群集。
  • 创建 AKV。
  • 创建用户分配的托管标识并将其分配给节点池,即为 AKS 创建的 VMSS。
  • 在 AKS 的“kube-system”命名空间中安装了 CSI Driver helm chart 。并完成了执行此操作的所有要求。
  • 创建了 TLS 证书和密钥。
  • 通过使用 TLS 证书和密钥,创建 .pfx 文件。
  • 在名为"ingresscert"的 AKV 证书中上传了该 .pfx 文件。
  • 在 AKS 中创建了名为“ingress-test”的新命名空间。
  • 在该命名空间中部署的 secretProviderClass 如下:
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
  • 在同一个命名空间中部署了nginx-ingress-controller helm chart,其中证书与应用程序绑定。
  • 已部署的 Busy Box 部署如下:
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 与繁忙的盒子 pod 连接并转到我提供的用于挂载机密的挂载路径,我会看到那里已成功获取机密。但是这个秘密并没有显示在 AKS 的秘密列表中。

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

提前致谢..!!!

4

2 回答 2

3

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

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

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

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

于 2021-11-30T08:25:27.763 回答
0

你的配置对我来说看起来不错。要考虑的一件事是,它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
于 2021-11-29T16:48:05.493 回答