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

GKE v1.20.10下双实例ingress-nginx v1.0.0验证webhook证书报错问题

问题根因

你的问题由两个配置错误共同导致:

  1. TLS证书不匹配:两个ingress-nginx实例的admission webhook证书生成配置错误,public实例的webhook服务使用了为private实例生成的证书,证书SAN(Subject Alternative Name)字段不匹配导致TLS握手失败。
  2. 校验触发逻辑符合预期:你提交的测试Ingress标签配置为ingress-nginx: nginx-public,匹配public实例的webhook的objectSelector规则,触发该webhook的校验,但该webhook的TLS证书配置错误。

排查步骤

  • 分别导出两个ingress-nginx实例admission Pod内的证书,校验SAN字段:
# 替换为你的public实例admission Pod名称
kubectl exec -n ingress-nginx <public-ingress-admission-pod-name> -- cat /etc/webhook/certs/tls.crt | openssl x509 -text -noout | grep DNS

正常情况下public实例的输出应该包含DNS:ingress-nginx-controller-admission-public, DNS:ingress-nginx-controller-admission-public.ingress-nginx.svc,如果输出只有private实例的域名,即可确认证书配置错误。

  • 检查两个实例的证书Secret是否复用:如果两个实例共用同一个Secret存储webhook证书,后部署的实例会覆盖先部署的实例的证书内容。

解决步骤

  1. 隔离证书配置
    为两个实例生成独立的webhook证书,分别绑定对应服务的域名:
  • 若使用Helm部署,public实例增加以下配置:
    controller:
      admissionWebhook:
        certificate:
          commonName: ingress-nginx-controller-admission-public.ingress-nginx.svc
          extraDnsNames:
            - ingress-nginx-controller-admission-public
            - ingress-nginx-controller-admission-public.ingress-nginx.svc
        existingSecret: "ingress-nginx-admission-cert-public" # 单独指定Secret名称,不要和private实例复用
    
  • private实例对应替换所有配置中的public为private,单独指定独立的Secret存储证书。
  1. 修正Ingress规则配置
    确保每个Ingress的标签和ingress.class注解匹配,避免不必要的校验触发:
  • 归public实例管理的Ingress同时配置label: ingress-nginx=nginx-public和annotation: kubernetes.io/ingress.class=nginx-public
  • 归private实例管理的Ingress同时配置label: ingress-nginx=nginx-private和annotation: kubernetes.io/ingress.class=nginx-private
  1. 清理旧配置重新部署
    删除旧的ValidatingWebhookConfiguration、证书Secret,重新部署两个ingress-nginx实例后提交测试Ingress验证即可。

内容的提问来源于stack exchange,提问作者night-gold

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:45:03