Microk8s MetalLB Ingress访问Headless Service报502 Bad Gateway
问题根因
从Ingress控制器日志可以直接定位核心问题:日志里明确记录转发到后端的请求前缀是http://,也就是Nginx默认用明文HTTP协议访问后端443端口,但后端的ASP.NET Core服务在443端口提供的是HTTPS服务,收到明文HTTP请求后直接主动断开连接,就触发了upstream prematurely closed connection错误,最终返回502。
其他几个不影响连通性但会导致路由不符合预期的配置问题:
- Ingress路径写了正则捕获规则
(/|$)(.*),但pathType设置为Prefix,该类型不支持正则匹配,重写规则不会按预期工作 - Headless Service本身和Nginx Ingress兼容正常,从Ingress描述信息看,控制器已经正确拉取到后端两个Pod的IP地址,服务发现环节没有问题
- MetalLB配置正常,已经成功分配外部IP
192.168.1.77,流量入口环节没有问题
修复步骤
- 给Ingress添加后端协议相关注解
在Ingress的metadata.annotations段添加以下配置,告诉Nginx Ingress用HTTPS协议连接后端,同时跳过集群内部自签名证书校验:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" nginx.ingress.kubernetes.io/proxy-ssl-verify: "off"
- 修正路径匹配类型
正则匹配的路径需要把pathType从Prefix改成ImplementationSpecific,否则Ingress控制器不会按正则规则解析路径、执行重写。 - 修正后的完整Ingress配置参考:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress namespace: default annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" nginx.ingress.kubernetes.io/proxy-ssl-verify: "off" labels: app: ingress spec: ingressClassName: public rules: - http: paths: - pathType: ImplementationSpecific path: /aspnetcorewebapi(/|$)(.*) backend: service: name: svc-aspnetcorewebapi port: number: 443
- 执行
kubectl apply -f ingress.yml应用配置,等待10秒左右控制器完成规则同步后,即可访问http://192.168.1.77/aspnetcorewebapi测试。
修复后异常排查
如果应用配置后仍然无法访问,按以下顺序逐一排查:
- 进入Ingress控制器Pod直接访问后端Pod IP,验证后端服务可用性:执行
kubectl exec -it nginx-ingress-microk8s-controller-9m59x -n ingress -- curl -k https://10.1.207.217:443/,如果能正常返回接口响应,说明后端服务本身无问题 - 检查后端ASP.NET Core服务的监听配置,确认443端口绑定在0.0.0.0而非127.0.0.1,没有限制来源IP访问
- 检查集群是否配置了NetworkPolicy,确认ingress命名空间的Pod有权限访问default命名空间下业务Pod的443端口
内容的提问来源于stack exchange,提问作者khteh
相关产品推荐
相关产品推荐

