同步 Service 一般 Service 的 Reconcile 在组件 Reconcile 开始部分,它负责创建和同步组件所使用的 Service,例如 cluster1-pd 和 cluster1-pd-peer。在控制循环函数中,会调用 getNewServiceForTidbCluster 函数,通过 Tidbcluster CR 中记录的信息创建一个新的 Service 的模板,如果 Service 不存在,直接创建 Service,否则,通过比对新老 Service Spec 是否一致,来决定是否要更新 Service 对象。
TiDB 组件使用的 Service 中,包括了 Service 和 Headless Serivce,为组件提供了被访问的能力。当组件不需要知道是哪个实例正在与它通信,并且可以接受负载均衡方式的访问,则可以使用 Service 服务,例如 TiKV,TiDB 等组件访问 PD 时,就可以使用 Service 地址。当组件需要区分是那个 Pod 在提供服务时,则需要用 Pod DNS 进行通信,例如 TiKV 在启动时,会将自己的 Pod DNS 作为 Advertise Address 对外暴露,其他 Pod 可以通过这个 Pod DNS 访问到自己。 同步 Status 完成 Service 的同步后,组件接入了集群的网络,可以在集群内访问和被访问。控制循环会进入 syncStatefulSetForTidbCluster,开始对 Statefulset 进行 Reconcile,首先是使用 syncTidbClusterStatus 对组件的 Status 信息进行同步,后续的扩缩容、Failover、升级等操作会依赖 Status 中的信息进行决策。