You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AKS中使用AGIC绑定Azure Key Vault存储的Ingress TLS证书失败的技术咨询

解决AGIC无法读取Azure Key Vault同步的TLS Secret问题

从你的描述来看,虽然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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 17:22:37