如何在Kubernetes集群中追踪未知来源的HTTP请求?
追踪未知请求来源的方法及可能原因
一、追踪未知IP的具体步骤
- 检查节点的所有网卡IP:
kubectl get nodes -o wide仅显示集群默认通信网卡的IP,节点可能存在额外物理/虚拟网卡。登录集群各节点,执行ip addr查看所有网卡的IP地址,确认这两个未知IP是否属于节点的某个网卡。 - 排查集群服务与端点:
- 执行
kubectl get endpoints --all-namespaces,检查是否存在对应IP的遗留端点(比如已删除Pod但未清理的Endpoint)。 - 执行
kubectl get svc --all-namespaces -o wide,查看是否有服务将流量转发到该IP,或是Headless服务的后端实例。
- 执行
- 查看临时/已终止Pod:若请求来自短期运行的Pod(如CronJob任务),Pod执行完会被销毁,常规
kubectl get all无法捕获。执行kubectl get pods --all-namespaces --include=terminated查看所有已终止的Pod,检查是否有Pod的IP匹配未知地址;同时用kubectl get cronjobs --all-namespaces排查定时任务。 - 节点上抓包分析:在Pod所在节点执行抓包命令,获取请求的更多细节:
该命令会抓取对应IP的HTTP请求内容,包括User-Agent、请求头信息,帮助判断请求发起方的类型。tcpdump -i any port 3000 and src host 192.168.21.174 -A - 检查集群附加组件:排查集群内的CNI插件(如Calico、Flannel)、监控工具(如Prometheus Exporter)、日志收集组件(如Fluentd)等,这些组件多以DaemonSet形式运行,执行
kubectl get daemonsets --all-namespaces查看相关Pod的IP是否匹配。如果使用Helm部署组件,执行helm list --all-namespaces确认所有部署的应用。
二、可能的请求来源
- 节点额外网卡上的进程:节点的非集群通信网卡上可能运行着独立脚本、监控工具或其他服务,每隔几秒发送
GET /请求到Pod的3000端口。 - 定时任务(CronJob):周期性运行的CronJob任务,每次执行时创建临时Pod发送请求,执行完成后Pod被销毁,因此无法通过常规命令看到。
- CNI网络组件异常:部分CNI插件的维护进程或网络测试逻辑,可能会发送简单HTTP请求验证网络连通性。
- 集群外同网段设备:同一192.168.x.x局域网内的其他服务器/设备,若能通过NodePort、LoadBalancer或直接访问Pod网络(如同节点的HostNetwork Pod),也可能发起这类请求。
- 遗留的Endpoint或服务配置:已删除Pod对应的Endpoint未被正确清理,或是服务配置错误导致流量转发到了无效IP。
内容的提问来源于stack exchange,提问作者Aviran
相关产品推荐
相关产品推荐

