You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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状态,无频繁重启记录
解决方案
  1. 修正标签配置,隔离传感器和服务端的匹配规则

    • 调整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重新加载所有配置即可。

  2. 优化传感器代码异常处理逻辑,避免单次请求失败直接导致进程退出:

    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
    
  3. 给服务端添加健康检查探针,确保只有正常运行的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:24:03