使用 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 驱动程序配置
我执行了以下步骤:
- 使用 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
- 使用命令
检查是否创建了secret
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
通过使用 https://docs.microsoft.com/en-us/azure/aks/csi-secrets-store-nginx-tls 本文档的参考,我正在尝试从 AKV 获取 TLS 机密到 AKS pods。 最初我使用 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
- 使用命令 检查是否创建了secret
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