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

AKS私有Nginx Ingress 308重定向与HTTPS连接故障排查

问题根因说明

两个现象分别对应配置偏差,其中308跳转本身不属于异常:

  • 未加特殊注解时访问HTTP端点返回308 Permanent Redirect是Nginx Ingress的默认行为:只要Ingress资源配置了tls段,控制器默认会将80端口的HTTP请求强制跳转到443端口的HTTPS,属于符合安全预期的设计,不是故障。你之前添加nginx.ingress.kubernetes.io/ssl-redirect: "false"是直接关闭了强制跳转逻辑,该操作本身不会禁用HTTPS端口,当时HTTPS无法访问是证书配置错误导致的。
  • HTTPS访问返回SSL certificate problem: unable to get local issuer certificate的核心原因是Secrets Store CSI Driver同步出的TLS证书不包含完整信任链,同时存在命名空间配置错误导致Ingress控制器可能读取不到正确的证书内容。
修复步骤

1. 修正SecretProviderClass配置

首先确认Azure Key Vault中存储的是证书(Certificate)类型对象(而非单独的Secret对象),且导入证书时上传了完整信任链(包含服务端叶子证书、中间CA证书、根CA证书,不要仅上传单独的叶子证书)。
按如下内容调整SecretProviderClass配置,注意必须部署在ingress-nginx命名空间(和Nginx Ingress控制器同命名空间):

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: azure-tls
  namespace: ingress-nginx
spec:
  provider: azure
  secretObjects:
  - secretName: ingress-tls-csi
    type: kubernetes.io/tls
    namespace: ingress-nginx
    data: 
    - objectName: <你的Key Vault证书名称>
      key: tls.key
    - objectName: <你的Key Vault证书名称>-chain
      key: tls.crt
  parameters:
    usePodIdentity: "false"
    useVMManagedIdentity: "true"
    userAssignedIdentityID: <有权限访问Key Vault的托管标识GUID>
    keyvaultName: <Key Vault实例名称>
    objects: |
      array:
        - |
          objectName: <你的Key Vault证书名称>
          objectType: cert
    tenantId: <Key Vault所属租户GUID>

配置注意点:

  • 托管标识必须配置Key Vault的「证书获取」「密钥获取」权限,仅配置Secret权限无法读取证书内容
  • 证书公钥部分必须使用<证书名>-chain对象,该对象由Azure CSI驱动自动生成,包含完整证书信任链,直接用证书名只会拿到不带CA链的单独叶子证书,是导致证书校验报错的核心原因
  • objectType必须设为cert,不能设为secret

2. 触发证书同步并验证Secret生成

重新应用修正后的SecretProviderClass配置后,重启Ingress控制器Pod,触发CSI驱动同步Key Vault中的证书内容到K8s Secret:

kubectl rollout restart deployment/nginx-ingress-ingress-nginx-controller -n ingress-nginx

等待Pod重启完成后,检查TLS Secret是否成功生成:

kubectl get secret ingress-tls-csi -n ingress-nginx

如果命令能返回对应Secret资源,说明证书同步成功;如果查不到Secret,排查kube-system命名空间下csi-secrets-store-前缀的CSI驱动Pod日志,以及Ingress控制器Pod日志,常见原因包括托管标识权限不足、证书名称拼写错误、Key Vault防火墙拦截AKS节点访问。

3. 调整Ingress资源配置

  • 删除之前添加的nginx.ingress.kubernetes.io/ssl-redirect: "false"注解,保持默认的HTTPS强制跳转逻辑(如果确实需要同时开放HTTP明文访问,可以保留该注解,证书同步完成后HTTPS端口可正常工作,生产环境不建议关闭强制跳转)
  • 在Ingress的metadata.annotations段添加如下注解,指定从ingress-nginx命名空间读取TLS证书(因为证书Secret生成在ingress-nginx命名空间,默认Ingress只会查找自身所在命名空间的Secret):
    nginx.ingress.kubernetes.io/ssl-secret-namespace: "ingress-nginx"
    
    调整完成后重新应用Ingress配置。

4. 功能验证

  1. 验证HTTP跳转:执行curl -v http://ingress.cluster.apaca.demo.com,返回308跳转到HTTPS地址为正常现象,符合安全预期
  2. 验证HTTPS访问:
    • 如果使用公共可信CA签发的证书,直接执行curl -v https://ingress.cluster.apaca.demo.com即可返回200业务状态码,无证书报错
    • 如果使用内部私有CA/自签名证书,需要在访问客户端的信任根证书库中添加对应的根CA证书,之后访问就不会出现证书颁发者校验错误。

内容的提问来源于stack exchange,提问作者Ashwin Agarkhed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:36:22