tidb 各个组件的pod之间是如何通信的?

tidb-2rrqbf2pyp-discovery-784d8b45df-hv8zd 1/1 Running 0 4d5h
tidb-2rrqbf2pyp-monitor-7c64fdc57b-pd8zb 3/3 Running 0 4d5h
tidb-2rrqbf2pyp-pd-0 1/1 Running 0 4d5h
tidb-2rrqbf2pyp-pd-1 1/1 Running 0 4d5h
tidb-2rrqbf2pyp-pd-2 1/1 Running 1 4d5h
tidb-2rrqbf2pyp-tidb-0 2/2 Running 0 4d5h
tidb-2rrqbf2pyp-tidb-1 2/2 Running 0 4d5h
tidb-2rrqbf2pyp-tidb-initializer-9bttf 0/1 Completed 0 4d5h
tidb-2rrqbf2pyp-tikv-0 1/1 Running 0 4d5h
tidb-2rrqbf2pyp-tikv-1 1/1 Running 0 4d5h
tidb-2rrqbf2pyp-tikv-2 1/1 Running 0 4d5h

discovery的作用是什么?
各个pod之间是都是通过headless来通信的吗?


tidb-2rrqbf2pyp-discovery ClusterIP 10.255.129.221 10261/TCP,10262/TCP 4d5h
tidb-2rrqbf2pyp-grafana ClusterIP 10.255.142.10 3000/TCP 4d5h
tidb-2rrqbf2pyp-monitor-reloader ClusterIP 10.255.109.103 9089/TCP 4d5h
tidb-2rrqbf2pyp-pd ClusterIP 10.255.74.215 2379/TCP 4d5h
tidb-2rrqbf2pyp-pd-peer ClusterIP None 2380/TCP 4d5h
tidb-2rrqbf2pyp-prometheus ClusterIP 10.255.149.182 9090/TCP 4d5h
tidb-2rrqbf2pyp-tidb ClusterIP 10.255.166.216 4000/TCP,10080/TCP 4d5h
tidb-2rrqbf2pyp-tidb-peer ClusterIP None 10080/TCP 4d5h
tidb-2rrqbf2pyp-tiflash-peer ClusterIP None 3930/TCP,20170/TCP 4d5h
tidb-2rrqbf2pyp-tikv-peer ClusterIP None 20160/TCP 4d5h

tidb-2rrqbf2pyp-discovery和tidb-2rrqbf2pyp-monitor-reloader不是headless的。
那么discovery和monitor的pod与其他pod之间会相互会通信,如果相互通信是以什么方式进行的,是通过headless的方式,还是通过service的方式来进行的?

Discovery 目前用于 PD 和 DM 的服务发现, 用于配置他们的 Join 参数, PD 和 DM 在启动的时候会向discovery注册, discovery 会在 PD 节点都启动后, 向最后一个节点下发初始化 PD 集群的参数, 向之前的节点下发 join 参数.

各个 pod 之间是通过 headless 访问的, headless service 返回的是 pod ip, 如果需要利用 Kubernetes 中健康检查, 只需要返回一个可用节点, 使用负载均衡, 访问哪个节点不重要, 则使用的是service, 在 TiDB 和 TiKV 以及其他使用 PD 的组件中, 都是配置的 PD 的 service 地址

PD初始化完成后,discovery还有用吗?discovery访问pd和dm,是通过headless吗?
在 TiDB 和 TiKV 以及其他使用 PD 的组件中, 都是配置的 PD 的 service 地址?这个能举个例子吗,比如哪些是使用了PD的service地址,TiCDC会使用PD的service地址吗?

我想确认的是: tidb的各个组件之间会用到service吗? 还是service只是提供给用户用的,tidb的内部组件永远不会用到service,只是会用到headless?

Discovery 是在各个组件的启动脚本中被访问的, 主要是用来动态配置参数, 而不需要访问 PD 和 DM.

可以创建一个TiDBCluster看到如下信息

TiDB的启动脚本

ARGS="--store=tikv \
--advertise-address=${POD_NAME}.${HEADLESS_SERVICE_NAME}.${NAMESPACE}.svc \
--host=0.0.0.0 \
--path=${CLUSTER_NAME}-pd:2379 \
--config=/etc/tidb/tidb.toml"

TiKV 的启动脚本

ARGS="--pd=http://${CLUSTER_NAME}-pd:2379 \
--advertise-addr=${POD_NAME}.${HEADLESS_SERVICE_NAME}.${NAMESPACE}.svc:20160 \
--addr=0.0.0.0:20160 \
--status-addr=0.0.0.0:20180 \
--advertise-status-addr=${POD_NAME}.${HEADLESS_SERVICE_NAME}.${NAMESPACE}.svc:20180 \
--data-dir=/var/lib/tikv \
--capacity=${CAPACITY} \
--config=/etc/tikv/tikv.toml
"

在PD failover过程中, PD 的 pod 发生重启, 也会访问 Discovery, 所以启动后 discovery 仍有用.

PD 和 DM会访问discovery,这个访问是通过service访问的吗?
–path=${CLUSTER_NAME}-pd:2379
这个配置谁会用到?这个是service。

我想确认的是: tidb的各个组件之间会用到service吗? 还是service只是提供给用户用的,tidb的内部组件永远不会用到service,只是会用到headless?

PD 和 DM 访问 discovery 是通过 service 访问的,

–path=${CLUSTER_NAME}-pd:2379 是 TiKV, TiDB, 以及其他组件访问 PD 的时候使用 service 访问.

不同组件之间互相访问是使用 service, 例如 TiDB , TiKV, TiFlash 以及其他使用 PD 的组件访问 PD, TiFlash 访问 TiDB, TiDB Initializer Job 使用 service 地址.

同一种类组件内部访问是用的peer地址.

tidb访问tikv呢?不走service,对吧。

另外ticdc是不是只是访问tikv和pd,也是通过service吗?

TiDB 访问 TiKV 是从 PD 读的信息, 应该不走service, TiCDC 也是访问 PD 的时候拿到 TiKV 的信息的. 这方面的问题可以创建一个集群, 看各个组件的ConfigMap