YugabyteDB Voyager导入数据域名解析失败,Schema导入正常的原因
问题现象
在WSL2 Ubuntu 22.04环境下,通过Docker Desktop部署的Kubernetes集群运行YugabyteDB,使用yb-voyager迁移PostgreSQL数据时:
- 导入Schema操作正常完成,pgAdmin也能正常连接YugabyteDB,说明数据库基础连通性没问题
- 执行数据导入时触发DNS解析错误:
import of data in "postgres" database started
Target YugabyteDB version: 11.2-YB-2.15.2.1-b0
Error Resolving name=yb-tserver-1.yb-tservers.yb-demo.svc.cluster.local: lookup yb-tserver-1.yb-tservers.yb-demo.svc.cluster.local: no such host
执行命令对比
正常的Schema导入命令
yb-voyager import schema --export-dir ${EXPORT_DIR} --target-db-host ${TARGET_DB_HOST} --target-db-user ${TARGET_DB_USER} --target-db-password ${TARGET_DB_PASSWORD} --target-db-name ${TARGET_DB_NAME}
失败的数据导入命令
yb-voyager import data --export-dir ${EXPORT_DIR} --target-db-host ${TARGET_DB_HOST} --target-db-user ${TARGET_DB_USER} --target-db-password ${TARGET_DB_PASSWORD} --target-db-name ${TARGET_DB_NAME}
环境变量配置
EXPORT_DIR=/home/abc/db-export TARGET_DB_HOST=127.0.0.1 TARGET_DB_USER=ybvoyager TARGET_DB_PASSWORD=password TARGET_DB_NAME=postgres
核心原因
Schema与数据导入的访问逻辑差异
- 导入Schema时,yb-voyager仅通过指定的
TARGET_DB_HOST(127.0.0.1)连接YugabyteDB的master节点完成元数据操作,不需要直接访问各个tserver节点。 - 导入数据时,yb-voyager会从YugabyteDB获取所有tserver节点的Kubernetes内部域名(如
yb-tserver-1.yb-tservers.yb-demo.svc.cluster.local),并尝试直接连接这些节点做并行数据加载。但WSL2环境无法解析K8s集群内部的Service域名,导致DNS查询失败。
- 导入Schema时,yb-voyager仅通过指定的
WSL2与K8s网络的隔离性
Docker Desktop的K8s集群内部域名仅能在集群内部解析,WSL2作为独立虚拟机环境,默认无法直接识别这些内部域名。即便TARGET_DB_HOST用127.0.0.1做了端口映射,也只能访问暴露到宿主机的服务,无法直接访问集群内的tserver节点域名。
解决办法
添加hosts映射:在WSL2的
/etc/hosts文件中,将所有tserver节点的内部域名映射到127.0.0.1(K8s已将tserver端口暴露到宿主机)。示例:echo "127.0.0.1 yb-tserver-1.yb-tservers.yb-demo.svc.cluster.local" | sudo tee -a /etc/hosts echo "127.0.0.1 yb-tserver-0.yb-tservers.yb-demo.svc.cluster.local" | sudo tee -a /etc/hosts需先通过
kubectl get pods -n yb-demo获取所有tserver节点名称,确保映射完整。修改YugabyteDB tserver广告地址:部署YugabyteDB时,将tserver的
--tserver-advertised-address设置为宿主机IP或127.0.0.1,让yb-voyager获取到可直接访问的节点地址,而非K8s内部域名。
内容的提问来源于stack exchange,提问作者hawky

