我最近在学习 Kubernetes Operator。部署etcd集群时,etcd-operator使用以下创建方法:
--initial-cluster-state
将被设置为new
。--initial-cluster-state
将被设置为existing
,并且相应的--initial-cluster
选项将被配置。我对 tidb-operator 也很感兴趣。于是,我查看了 tidb-operator 的部署代码。我很好奇 tidb-operator 是如何部署 pd 集群的。
func (pmm *pdMemberManager) getNewPDSetForTidbCluster(tc *v1alpha1.TidbCluster) (*apps.StatefulSet, error) {
…
vols := []corev1.Volume{
annVolume,
{Name: "config",
VolumeSource: corev1.VolumeSource{
ConfigMap: &corev1.ConfigMapVolumeSource{
LocalObjectReference: corev1.LocalObjectReference{
Name: pdConfigMap,
},
Items: []corev1.KeyToPath{{Key: "config-file", Path: "pd.toml"}},
},
},
},
{Name: "startup-script",
VolumeSource: corev1.VolumeSource{
ConfigMap: &corev1.ConfigMapVolumeSource{
LocalObjectReference: corev1.LocalObjectReference{
Name: pdConfigMap,
},
Items: []corev1.KeyToPath{{Key: "startup-script", Path: "pd_start_script.sh"}},
},
},
},
}
…
}
我注意到,在部署 pd 集群时,tidb-operator 会将配置项保存在“/etc/pd/config”中,其中包括
—initial-cluster-state
选项。仅供参考:https://docs-archive.pingcap.com/zh/tidb/v7.0/pd-configuration-file#initial-cluster-state
因此,我有以下疑问:
以下是我所知道的:
Operator 使用 startScript 启动 PD 流程,参见代码 https://github.com/pingcap/tidb-operator/blob/v1.5.1/pkg/manager/member/pd_member_manager.go#L900
在 pdStartScriptTplText 中,每个 PD 都会连接到 Discovery 来竞争 Leader(仅在 Bootstrap 阶段),参见 Discovery 代码 https://github.com/pingcap/tidb-operator/blob/v1.5.1/pkg/discovery/发现.go
2.1 PD 获胜领导者竞选将使用“--initial-cluster”来初始化 PD 集群
2.2 PD 失去领导者活动将使用“--join”加入 PD 集群
PD 有内部 ETCD 来维持领导力,中文社区有中文博客图片见https://tidb.net/blog/66b475c0
3.1 在 PD 集群本身中维持引导领导地位之后