执行helm upgrade时Ingress Nginx调用Webhook失败求助
解决Helm升级时Ingress Webhook证书未知权威问题
问题原因
该报错是Kubernetes API Server调用Nginx Ingress的验证Webhook时,无法识别证书签发权威导致的,通常由Webhook的CA证书过期、配置错误或与控制器证书不匹配引发。
排查与修复步骤
1. 检查Webhook相关资源状态
- 查看Nginx Ingress所在命名空间下的证书Secret:
kubectl get secrets -n nginx-ingress - 查看ValidatingWebhookConfiguration的配置详情:
kubectl get validatingwebhookconfiguration validate.nginx.ingress.kubernetes.io -o yaml
2. 修复方案
方案1:自动重新生成Webhook证书
- 删除现有Webhook证书Secret(通常名称为
nginx-ingress-admission):kubectl delete secret nginx-ingress-admission -n nginx-ingress - 重启Nginx Ingress Controller Deployment,控制器会自动重新生成并签署证书:
kubectl rollout restart deployment nginx-ingress-controller -n nginx-ingress
方案2:临时禁用Webhook验证(应急场景)
- 将Webhook的失败策略设为
Ignore,绕过证书验证:kubectl patch validatingwebhookconfiguration validate.nginx.ingress.kubernetes.io -p '{"webhooks":[{"name":"validate.nginx.ingress.kubernetes.io","failurePolicy":"Ignore"}]}' - 完成Helm升级后,建议恢复失败策略为
Fail以保证验证机制正常:kubectl patch validatingwebhookconfiguration validate.nginx.ingress.kubernetes.io -p '{"webhooks":[{"name":"validate.nginx.ingress.kubernetes.io","failurePolicy":"Fail"}]}'
方案3:手动更新Webhook的CA Bundle
- 从运行中的Ingress Controller Pod提取CA证书:
kubectl exec -n nginx-ingress $(kubectl get pods -n nginx-ingress -l app=nginx-ingress -o name | head -1) -- cat /etc/nginx/ssl/default-fake-certificate.crt > ca.crt - 用提取的证书更新Webhook的CA Bundle:
CA_BUNDLE=$(cat ca.crt | base64 | tr -d '\n') kubectl patch validatingwebhookconfiguration validate.nginx.ingress.kubernetes.io -p '{"webhooks":[{"name":"validate.nginx.ingress.kubernetes.io","clientConfig":{"caBundle":"'$CA_BUNDLE'"}}]}'
3. 验证修复
执行Helm升级命令确认问题解决:
helm upgrade <your-release-name> <your-chart-name> -n <your-namespace> -f <your-values-file>
内容的提问来源于stack exchange,提问作者Vineet Kekatpure
相关产品推荐
相关产品推荐

