为何从Compute Engine调用Google API间歇性报“Network is unreachable”且含IPv6地址
问题解答
1. 错误诱因
该错误的核心诱因是cURL默认优先尝试IPv6地址建立连接,而你的GCE实例未启用IPv6、VPC也未配置IPv6的私有Google访问权限,当短时间内调用量上升触发DNS解析更新时,如果解析拿到Google API的IPv6地址,cURL就会尝试走IPv6协议栈连接,最终触发不可达错误。
因为该错误仅在DNS解析返回IPv6地址的场景下触发,所以表现为间歇性故障,和实例本身的CPU、内存等资源利用率没有直接关联。
2. 报错为网络不可达而非Datastore业务错误的原因
cURL error 7属于传输层连接错误,错误发生在TCP三次握手阶段,此时请求还没有发送到Datastore服务端,Datastore根本没有接收到你的API调用请求,自然不会返回业务层面的错误信息。该错误是Linux内核在检测到IPv6路由不可达时直接返回给cURL的报错。
3. 报错出现IPv6子网的原因
所有Google API的公共域名默认都会同时返回IPv4(A记录)和IPv6(AAAA记录)的解析结果,和你是否启用IPv6无关。虽然Google不支持从公网IPv6地址访问大部分API服务,但VPC内部的默认DNS服务器仍然会返回Google API的AAAA记录,cURL默认的IP解析策略是优先使用IPv6,因此会尝试连接解析到的IPv6地址,最终将该地址输出到报错日志中。
修复方案
你可以通过以下任意一种方式彻底解决该问题:
- 修改Google PHP SDK底层的cURL配置,在初始化SDK客户端时添加cURL参数配置,设置
CURLOPT_IPRESOLVE为CURL_IPRESOLVE_V4,强制使用IPv4解析 - 在系统层面修改
/etc/resolv.conf,添加options single-request-reopen配置,避免DNS解析优先返回IPv6记录 - 在VPC层面配置DNS规则,禁止解析Google API域名的AAAA记录
内容的提问来源于stack exchange,提问作者Craig Finch
相关产品推荐
相关产品推荐

