GCE访问GKE部署的Dask Scheduler外部IP出现连接超时OSError
排查与解决步骤
第一步:校验基础网络连通性
先在GCE实例上执行端口连通性测试,排除网络层不通的问题:
nc -zv <scheduler-externalIP> 8786 # 或者 telnet <scheduler-externalIP> 8786
如果测试失败,按以下顺序排查网络策略:
- GCP VPC防火墙规则:检查GKE集群所在VPC的入方向防火墙规则,是否放通GCE实例的出口IP(公网IP/内网IP取决于你的网络架构)到8786端口的访问权限,协议为TCP
- GKE网络策略:如果你的GKE集群开启了NetworkPolicy,检查Dask所在命名空间下的网络策略,是否允许集群外地址访问dask-scheduler的8786端口,默认Helm部署的Dask网络策略通常仅放行集群内部访问
- LoadBalancer健康检查:确认GCP为dask-scheduler LoadBalancer自动创建的健康检查状态正常,健康检查失败会导致流量无法转发到后端scheduler Pod
- LoadBalancer类型确认:如果你的LoadBalancer是内网类型,需要确认GCE实例和GKE集群在同一个可路由的VPC网络(或已配置VPC对等连接),否则无法访问内网LoadBalancer地址
第二步:校验Dask Scheduler配置
因为集群内部访问正常,重点检查外部访问相关的配置:
- TLS认证配置:检查Helm部署时的values配置中
scheduler.tls.enabled是否为true,如果开启了TLS,外部客户端必须配置对应证书才能连接,未携带证书会直接握手超时 - Scheduler对外地址配置:如果配置了
scheduler.extraArgs指定了--contact-address,需要确认该地址为LoadBalancer的对外IP,否则scheduler会返回集群内部地址给客户端,导致握手失败
第三步:客户端连接调整
可以先尝试延长客户端超时时间,排除网络延迟导致的偶发超时:
from dask.distributed import Client client = Client('tcp://<scheduler-externalIP>:8786', timeout='60s')
同时确认GCE实例的出口防火墙规则没有禁止访问8786端口,公网出口的NAT配置正常。
内容的提问来源于stack exchange,提问作者Vin B.
相关产品推荐
相关产品推荐

