GKE v1.20.10下双实例ingress-nginx v1.0.0验证webhook证书报错问题
问题根因
你的问题由两个配置错误共同导致:
- TLS证书不匹配:两个ingress-nginx实例的admission webhook证书生成配置错误,public实例的webhook服务使用了为private实例生成的证书,证书SAN(Subject Alternative Name)字段不匹配导致TLS握手失败。
- 校验触发逻辑符合预期:你提交的测试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证书,后部署的实例会覆盖先部署的实例的证书内容。
解决步骤
- 隔离证书配置
为两个实例生成独立的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存储证书。
- 修正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
- 清理旧配置重新部署
删除旧的ValidatingWebhookConfiguration、证书Secret,重新部署两个ingress-nginx实例后提交测试Ingress验证即可。
内容的提问来源于stack exchange,提问作者night-gold
相关产品推荐
相关产品推荐

