macOS 无法访问 docker 容器内的 TiKV 节点

【概述】macOS v10.15.7 无法访问 docker v20.10.8 容器内的 TiKV 节点

【背景】为了轻便地对与 TiKV 的集成进行测试,我们自己封装了一个 TiUP 镜像,里面包含 TiKV。我们使用自己做的一个小工具 oomplay 执行 oomplay init tikv 部署 TiKV 容器,并把 pd 映射到 localhost 的 22379 端口。部署成功后,执行 docker ps 得到:

$ docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS          PORTS                                                                                 NAMES
8ef0f71beb7e   oomai/tiup:5.3.0   "tiup playground --t…"   13 minutes ago   Up 13 minutes   3000/tcp, 3930/tcp, 4000/tcp, 9090/tcp, 0.0.0.0:22379->2379/tcp, :::22379->2379/tcp   oomplay-tikv

【问题】在 macOS 下,无法从 localhost 正常连接 pd。而在 Ubuntu 20.04 上则不存在这个问题。 :cry:

我尝试了两种 tikv client:python sdk 和 tcli

python sdk

>>> import os; from tikv_client import RawClient;
>>> RawClient.connect(['127.0.0.1:22379']).get('')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/yiksanchan/miniconda3/lib/python3.9/site-packages/tikv_client/__init__.py", line 14, in connect
    inner = event_loop.run_until_complete(
  File "/Users/yiksanchan/miniconda3/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
    return future.result()
  File "/Users/yiksanchan/miniconda3/lib/python3.9/site-packages/tikv_client/asynchronous/__init__.py", line 14, in connect
    inner = await tikv_client.RawClient.connect(pd_endpoints)
Exception: [/Users/runner/.cargo/git/checkouts/client-rust-5a1ccd35a54db20f/eb1d2da/tikv-client-pd/src/cluster.rs:264]: failed to connect to [Member { name: "pd-0", member_id: 13498724266307579611, peer_urls: ["http://172.17.0.2:2380"], client_urls: ["http://172.17.0.2:2379"], leader_priority: 0, deploy_path: "", binary_version: "", git_hash: "", dc_location: "" }]

tcli

$ tcli --pd 127.0.0.1:22379
2022/01/05 10:15:01 txnkv_client.go:18: F | rpc error: code = Unavailable desc = connection closed

两种方法都连不上。

但是,我尝试在容器里使用 python sdk 进行连接是没问题的。

>>> import os; from tikv_client import RawClient;
>>> RawClient.connect(['172.17.0.2:2379']).get('')
Jan 05 02:26:13.296 INFO connect to tikv endpoint: "172.17.0.2:20160"

在本地直接 curl health 接口也没问题。

$ curl 127.0.0.1:22379/health
{"health":"true"}

【TiDB 版本】5.3.0


若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

1赞

这里看到即使用宿主机 localhost:22379 去连接,获取到的 peer_urls 也会变成 172.17.0.2:2379。猜测可能是因为 macos 下宿主机无法通过容器的 ip 访问容器?不知道有没有可能让 peer_urls 使用 localhost ?

能否使用 --network_mode host 跑一下呢?看上去是 docker 在 macos 上的兼容有问题。

--network host 情况也是一样

@iosmanthus 不知道这个问题在你们的 macos 电脑上是否可以复现?

您好,该问题应该是个开发相关的问题,欢迎把问题发到开发者社区,和开发者们一起交流吧!