AKS中使用AGIC绑定Azure Key Vault存储的Ingress TLS证书失败的技术咨询
从你的描述来看,虽然ingress-tls-csi Secret已经存在,但AGIC仍然报错SecretNotFound,核心问题大概率是Secret内容格式不正确或者AGIC的权限/缓存问题,下面分步骤排查和解决:
1. 检查TLS Secret的内容是否正确
你当前的SecretProviderClass配置中,将同一个Azure Key Vault的Secret对象ingress-cert同时映射到tls.key和tls.crt,这是错误的——因为KV中的单个Secret只能存储一个值(要么是证书,要么是私钥),这会导致生成的ingress-tls-csi中两个字段内容完全相同,AGIC无法识别为有效的TLS证书。
修复方法:
在Azure Key Vault中分别创建两个Secret:
- 一个存储证书的PEM内容(比如命名为
ingress-cert-crt) - 一个存储私钥的PEM内容(比如命名为
ingress-cert-key)
然后修改SecretProviderClass配置:
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: {{ include "secretProvider.name" . }} spec: provider: azure secretObjects: - secretName: ingress-tls-csi type: kubernetes.io/tls data: - objectName: ingress-cert-key # 对应KV中的私钥Secret key: tls.key - objectName: ingress-cert-crt # 对应KV中的证书Secret key: tls.crt parameters: usePodIdentity: "false" useVMManagedIdentity: "true" userAssignedIdentityID: {{ .Values.keyVault.identity }} keyvaultName: {{ .Values.keyVault.name }} objects: | array: - | objectName: ingress-cert-key objectType: secret - | objectName: ingress-cert-crt objectType: secret tenantId: {{ .Values.keyVault.tenant }}
应用修改后,删除旧的Secret让CSI重新同步:
kubectl delete secret ingress-tls-csi -n $NAMESPACE
验证新Secret的内容:
# 查看Secret的data字段是否包含正确的tls.key和tls.crt kubectl get secret ingress-tls-csi -o yaml -n $NAMESPACE # 解码证书内容确认有效性 echo "<tls.crt的base64值>" | base64 -d echo "<tls.key的base64值>" | base64 -d
2. 确认AGIC的ServiceAccount权限
AGIC使用的ServiceAccount(默认在kube-system命名空间下的azure-ingress-application-gateway)需要拥有读取你的应用命名空间下Secrets的权限。
检查权限:
查看AGIC的ClusterRole:
kubectl describe clusterrole azure-ingress-application-gateway -n kube-system
确保包含secrets:get、secrets:list权限。如果是命名空间级别的Role,需要确保该Role绑定到AGIC的ServiceAccount,且覆盖你的应用命名空间。
如果权限不足,可以创建一个额外的RoleBinding:
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: agic-secret-access namespace: my-namespace roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: secret-reader subjects: - kind: ServiceAccount name: azure-ingress-application-gateway namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: secret-reader namespace: my-namespace rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "list"]
应用这个配置:
kubectl apply -f rolebinding.yaml
3. 重启AGIC刷新缓存
AGIC可能在Secret创建前就已经缓存了不存在的状态,导致后续无法识别新创建的Secret。重启AGIC的Deployment:
kubectl rollout restart deployment azure-ingress-application-gateway -n kube-system
等待AGIC重启完成后,再次查看Ingress的事件:
kubectl describe ingress my-ingress -n my-namespace
4. 验证证书与Ingress Host匹配
确保KV中证书的CN或SAN字段包含你的Ingress配置中的{{ .Values.ingress.host }},AGIC会验证证书的有效性,如果主机不匹配也可能导致异常。
按照以上步骤操作后,AGIC应该能正确读取来自Azure Key Vault的TLS证书并配置到Application Gateway上。
内容的提问来源于stack exchange,提问作者phwt

