K3s集群Python传感器向Go服务发POST请求间歇性连接拒绝排查
故障根因分析
核心故障点为Service标签选择器匹配范围错误:
你配置的weather-server Service的selector规则为app: weather,但传感器、服务端两个Deployment的Pod模板都打上了app: weather标签,导致Service会把流量随机转发到所有匹配标签的Pod上:流量转发到监听了8080端口的服务端Pod时请求正常,转发到没有监听8080端口的传感器Pod时就会触发连接拒绝,这就是故障间歇性出现的直接原因。
其余可能的次要原因:
- 传感器代码异常处理逻辑不完善,单次请求失败直接退出进程,触发Kubernetes的
CrashLoopBackOff重启策略 - 服务端Pod偶发重启,重启过程中端口未完成监听导致短时连接拒绝
- k3s集群CoreDNS组件偶发不稳定(概率极低,你的错误日志为连接拒绝而非域名解析失败)
排查步骤
- 验证Service后端Endpoint是否匹配异常:执行
kubectl get endpoints weather-server,正常情况下输出的IP列表应该只有2个服务端Pod的IP,如果看到3个IP(2个服务端+1个传感器)即可确认标签匹配错误问题 - 手动模拟请求验证:在传感器Pod内多次执行
kubectl exec -it [传感器Pod名称] -- curl http://weather-server:8080,同时执行kubectl get pods -o wide核对返回结果对应的IP,确认请求失败时的IP是否为传感器Pod自身的IP - 检查服务端Pod运行状态:执行
kubectl get pods -l app=weather,确认所有服务端Pod处于Running状态,无频繁重启记录
解决方案
修正标签配置,隔离传感器和服务端的匹配规则
- 调整sensor_deployment.yml的标签配置,避免和服务端共用标签:
spec: selector: matchLabels: app: weather-sensor template: metadata: labels: app: weather-sensor- 调整server_deployment.yml的标签配置:
spec: selector: matchLabels: app: weather-server template: metadata: labels: app: weather-server- 调整server_service.yml的selector,仅匹配服务端Pod:
spec: selector: app: weather-server配置修改完成后执行
kubectl apply -f重新加载所有配置即可。优化传感器代码异常处理逻辑,避免单次请求失败直接导致进程退出:
def send_data(data, retry_times=3): headers = {'Content-Type': 'application/json'} for i in range(retry_times): try: requests.post(url=URL, data=data, headers=headers, timeout=5) return True except ConnectionError as e: print(f"请求失败,第{i+1}次重试:{e}") time.sleep(2) # 重试多次失败后仅记录日志,不抛出异常终止进程 print(f"数据发送失败:{data}") return False给服务端添加健康检查探针,确保只有正常运行的Pod会接入Service流量:
在server_deployment.yml的containers配置下新增探针规则:livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 2 periodSeconds: 5注意需要同步在Go服务端新增
/health健康检查接口。
内容的提问来源于stack exchange,提问作者TheQuestioner
相关产品推荐
相关产品推荐

