K8s部署Bazel Buildfarm执行远程构建时查询远程执行能力连接超时
问题根因分析
你遇到的连接超时问题核心是外部客户端无法通过Ingress暴露的地址和buildfarm的gRPC服务建立连接,常见原因如下:
- 端口暴露错误:你当前配置的标准NGINX Ingress默认仅监听80/443端口,你在bazelrc里直接指定访问8980端口,该端口没有通过Ingress或者LoadBalancer对外暴露
- 服务指向错误:你当前Ingress后端指向的是worker的service
aks-buildfarm,但bazel远程构建请求应该先提交到buildfarm server的service,由server分配任务给worker,属于配置逻辑错误 - gRPC协议适配问题:NGINX Ingress默认没有开启gRPC透传配置,普通HTTP转发规则无法处理gRPC的HTTP/2流量
- TLS配置不匹配:你用了
grpcs协议,但Ingress的证书配置、gRPC服务端的TLS配置没有对齐,也会导致握手超时
排查解决步骤
修正流量指向
首先修改Ingress的后端service,从当前的aks-buildfarm(worker service)改为你部署的buildfarm server对应的service,确保客户端请求可以到达server节点。修正端口暴露逻辑
不要直接用8980端口对外暴露,两种可选方案:
- 方案一(推荐):将bazelrc配置改为
build:rbe --remote_executor=grpcs://buildfarm.dev.azr.internal.mydomain.com:443,走Ingress默认的443 HTTPS端口转发gRPC流量 - 方案二:如果你要保留8980端口访问,需要将buildfarm server的service改为LoadBalancer类型,或者在NGINX Ingress控制器的配置里新增8980端口的监听转发规则
- 调整Ingress gRPC适配配置
在Ingress的annotations里新增如下配置开启gRPC透传,同时删除当前配置的nginx.ingress.kubernetes.io/rewrite-target和nginx.ingress.kubernetes.io/use-regex注解,gRPC转发不需要重写路径配置,会破坏请求路径:
nginx.ingress.kubernetes.io/grpc-backend: "true" nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
- 验证TLS配置有效性
先在本地客户端执行命令验证端口连通性和证书有效性:
# 验证端口连通 telnet buildfarm.dev.azr.internal.mydomain.com 443 # 验证证书合法性 openssl s_client -connect buildfarm.dev.azr.internal.mydomain.com:443
如果你的自签名证书没有加到客户端的信任根证书里,可在bazelrc里新增如下配置跳过证书校验(仅测试环境使用):
build:rbe --tls_insecure_skip_verify
- 内网服务可用性预校验
先在k8s集群内起一个临时Pod,验证buildfarm server服务本身是否正常响应,确认服务没问题再排查外部链路:
kubectl run -it --rm grpcurl --image=fullstorydev/grpcurl:v1.8.7 -n infrastructure--buildfarm --command -- grpcurl aks-buildfarm-server.infrastructure--buildfarm.svc.cluster.local:8980 list
内容的提问来源于stack exchange,提问作者M80
相关产品推荐
相关产品推荐

