AWS kops部署K8s集群Nginx Ingress出现间歇性502 Bad Gateway错误
需优先检查的日志与排查点
- 业务Pod内部日志:优先排查异常Pod的标准输出/标准错误日志(
kubectl logs <异常pod名称> [-c 容器名]),以及应用自身的日志文件,重点查找进程崩溃重启、OOM异常、监听队列溢出、最大连接数打满、GC停顿过长的相关记录。当前返回RST包是Pod侧直接响应,绝大多数情况是业务应用侧的端口监听出现了间歇性异常。 - 节点kubelet日志:登录异常Pod所在的节点,执行
journalctl -u kubelet或查看/var/log/kubelet.log,检查是否有针对该Pod的存活/就绪探针检测失败、Pod被驱逐、容器自动重启、生命周期钩子执行失败的记录。如果探针配置不合理,会出现偶发的Pod重启,重启过程中端口未监听就会返回连接拒绝。 - 集群控制面组件日志:查看kube-controller-manager日志,检查Endpoint资源是否存在更新延迟、同步失败的问题;查看节点上的kube-proxy日志,检查是否有iptables/IPVS规则同步异常的记录。如果Endpoint更新滞后,已终止的Pod IP仍会被保留在转发列表中,导致请求被转发到已经停止监听端口的实例。
- 节点系统日志:查看节点的
dmesg输出与/var/log/syslog日志,检查是否有内核OOM killer杀掉业务进程、conntrack连接跟踪表满、端口资源耗尽、网络栈报错的相关记录。 - Nginx Ingress控制器日志:查看Ingress Pod的日志,检查是否有配置重载失败、上游服务列表更新异常的记录;同时执行
kubectl describe ingress <ingress名称>、kubectl describe svc <关联服务名称>查看资源事件,确认是否存在配置同步异常。
同类问题常见触发原因
该场景属于长期稳定运行的Kubernetes集群非常高发的问题,常见触发点如下:
- 业务应用并发承载能力达到瓶颈:应用的最大连接数、TCP监听backlog队列配置过小,峰值请求到来时队列占满,内核直接返回RST拒绝新连接
- Pod优雅终止配置不合理:未配置
preStop等待流量排空的钩子,或者terminationGracePeriodSeconds设置过短,Ingress仍在向终止过程中的Pod转发流量,此时Pod已经停止监听端口 - 节点连接跟踪表溢出:高并发场景下节点的
nf_conntrack_max内核参数配置过小,连接跟踪表占满后内核会直接拒绝新连接 - kube-proxy规则同步延迟:集群规模较大、Service/Endpoint数量较多时,kube-proxy的规则同步间隔过长,已销毁的Pod IP仍会残留在转发规则中
- 业务进程无感知重启:HPA自动扩缩容、应用热重载、滚动发布过程中,端口出现短暂的未监听窗口,刚好收到请求就会触发连接拒绝
内容的提问来源于stack exchange,提问作者Shreyank Sharma
相关产品推荐
相关产品推荐

