Kubernetes Ingress异常排查:404错误与证书无效问题
一、证书无效问题排查
验证Secret中的证书内容
执行命令导出并解码Secret中的证书:kubectl get secret mywebsite-tls -o jsonpath='{.data.tls\.crt}' | base64 -d > cert.crt kubectl get secret mywebsite-tls -o jsonpath='{.data.tls\.key}' | base64 -d > cert.key检查
cert.crt是否包含完整的证书链(通配符证书+中间CA证书),cert.key是否为对应私钥。如果证书链不完整,Azure Ingress Controller会无法识别,转而使用默认的Acme证书。确认命名空间一致性
检查Ingress所在命名空间是否与Secret一致:kubectl get ingress mywebsite-ingress -o jsonpath='{.metadata.namespace}'如果Ingress不在
default命名空间,Secret无法被加载,Ingress会 fallback 到默认证书。查看Ingress Controller日志
针对Azure托管环境,查看AGIC(Application Gateway Ingress Controller)的Pod日志,检查是否有证书加载失败的错误:kubectl logs -n kube-system <agic-pod-name>常见错误包括证书格式不合法、私钥与证书不匹配、权限不足等。
二、404错误排查
确认容器内服务正常
进入API Pod,验证服务是否正常监听并响应:kubectl exec -it <mywebsite-api-pod-name> -- bash # 检查端口监听 ss -tulpn | grep :80 # 本地请求测试 curl localhost:80如果容器内请求返回404,说明镜像本身的服务路由配置有问题,和Kubernetes无关。
验证Service与Pod的关联
检查Service是否正确关联到Pod的Endpoints:kubectl describe service mywebsite-api-service查看
Endpoints字段是否有Pod的IP地址。如果为空,说明Deployment的标签与Service的selector不匹配(检查Deployment的metadata.labels和Service的spec.selector是否一致)。同时在集群内测试Service的可达性:
kubectl run -it --rm --image=curlimages/curl curl-test -- curl mywebsite-api-service.default.svc.cluster.local:80如果请求返回404,说明后端服务本身的路由有问题;如果连不上,说明Service配置错误。
检查Ingress路由规则
确认Ingress的路径规则是否匹配后端API的路由:- 如果你的.NET API有前缀路由(比如
/api),需要将Ingress的path调整为/api/*或/api(根据路由配置)。 - 检查
pathType: Prefix的行为:该配置会匹配所有以指定路径开头的请求,但需确保Ingress Controller正确转发请求到后端。
查看Ingress的状态:
kubectl describe ingress mywebsite-ingress确认
Rules和TLS配置是否正确加载。- 如果你的.NET API有前缀路由(比如
查看Ingress Controller请求日志
查看AGIC日志中请求的转发情况,确认请求是否到达后端服务,以及后端返回的响应码:kubectl logs -n kube-system <agic-pod-name> | grep "api-uat.mywebsite.com"如果日志显示请求转发到了正确的Service,但后端返回404,问题出在API服务的路由配置;如果请求没有到达后端,检查Ingress规则或Controller配置。
三、关于Helm的疑问
未使用Helm完全不影响Kubernetes资源的正确性,Helm只是用于简化资源部署和版本管理的工具,和当前的证书、404问题无关。
内容的提问来源于stack exchange,提问作者wombat172a

