diff --git a/examples/basic/pd-micro-service-cluster.yaml b/examples/basic/pd-micro-service-cluster.yaml index cf857961426..0fe624258ea 100644 --- a/examples/basic/pd-micro-service-cluster.yaml +++ b/examples/basic/pd-micro-service-cluster.yaml @@ -35,6 +35,10 @@ spec: baseImage: hub.pingcap.net/devbuild/pd version: v8.3.0-5427 replicas: 2 + - name: "router" + baseImage: hub.pingcap.net/devbuild/pd + version: v8.3.0-5427 + replicas: 2 tikv: baseImage: pingcap/tikv version: v8.5.3 diff --git a/manifests/crd.yaml b/manifests/crd.yaml index 9ed891a6a07..2b31f020782 100644 --- a/manifests/crd.yaml +++ b/manifests/crd.yaml @@ -33240,6 +33240,7 @@ spec: enum: - tso - scheduling + - router type: string nodeSelector: additionalProperties: diff --git a/manifests/crd/v1/pingcap.com_tidbclusters.yaml b/manifests/crd/v1/pingcap.com_tidbclusters.yaml index abda97ce905..53871370223 100644 --- a/manifests/crd/v1/pingcap.com_tidbclusters.yaml +++ b/manifests/crd/v1/pingcap.com_tidbclusters.yaml @@ -8573,6 +8573,7 @@ spec: enum: - tso - scheduling + - router type: string nodeSelector: additionalProperties: diff --git a/pkg/apis/label/label.go b/pkg/apis/label/label.go index c4ef6f8a42f..5bdb7f33322 100644 --- a/pkg/apis/label/label.go +++ b/pkg/apis/label/label.go @@ -127,6 +127,8 @@ const ( AnnTSODeleteSlots = "tso.tidb.pingcap.com/delete-slots" // AnnSchedulingDeleteSlots is annotation key of pd ms scheduling delete slots. AnnSchedulingDeleteSlots = "scheduling.tidb.pingcap.com/delete-slots" + // AnnRouterDeleteSlots is annotation key of pd ms router delete slots. + AnnRouterDeleteSlots = "router.tidb.pingcap.com/delete-slots" // AnnTiDBDeleteSlots is annotation key of tidb delete slots. AnnTiDBDeleteSlots = "tidb.tidb.pingcap.com/delete-slots" // AnnTiKVDeleteSlots is annotation key of tikv delete slots. @@ -169,6 +171,8 @@ const ( PDMSTSOLabelVal string = "tso" // PDMSSchedulingLabelVal is pd microservice scheduling member type PDMSSchedulingLabelVal string = "scheduling" + // PDMSRouterLabelVal is pd microservice router member type + PDMSRouterLabelVal string = "router" // TiDBLabelVal is TiDB label value TiDBLabelVal string = "tidb" // TiKVLabelVal is TiKV label value @@ -232,6 +236,8 @@ func PDMSLabel(name string) string { return PDMSTSOLabelVal case "scheduling": return PDMSSchedulingLabelVal + case "router": + return PDMSRouterLabelVal default: panic(fmt.Sprintf("unknown pd ms name %s", name)) } @@ -435,6 +441,8 @@ func (l Label) PDMS(name string) Label { return l.Component(PDMSTSOLabelVal) case "scheduling": return l.Component(PDMSSchedulingLabelVal) + case "router": + return l.Component(PDMSRouterLabelVal) default: panic(fmt.Sprintf("unknown pd ms name %s", name)) } diff --git a/pkg/apis/pingcap/v1alpha1/component_spec.go b/pkg/apis/pingcap/v1alpha1/component_spec.go index e68cf9b7355..3b55db20797 100644 --- a/pkg/apis/pingcap/v1alpha1/component_spec.go +++ b/pkg/apis/pingcap/v1alpha1/component_spec.go @@ -500,6 +500,8 @@ func getComponentLabelValue(c MemberType) string { return label.PDMSTSOLabelVal case PDMSSchedulingMemberType: return label.PDMSSchedulingLabelVal + case PDMSRouterMerberType: + return label.PDMSRouterLabelVal case TiDBMemberType: return label.TiDBLabelVal case TiKVMemberType: diff --git a/pkg/apis/pingcap/v1alpha1/component_status_test.go b/pkg/apis/pingcap/v1alpha1/component_status_test.go index 43aac40890d..7df542a9293 100644 --- a/pkg/apis/pingcap/v1alpha1/component_status_test.go +++ b/pkg/apis/pingcap/v1alpha1/component_status_test.go @@ -57,6 +57,9 @@ func TestComponentStatus(t *testing.T) { case PDMSSchedulingMemberType: _, ok := status.(*PDMSStatus) g.Expect(ok).To(BeTrue()) + case PDMSRouterMerberType: + _, ok := status.(*PDMSStatus) + g.Expect(ok).To(BeTrue()) case TiDBMemberType: _, ok := status.(*TiDBStatus) g.Expect(ok).To(BeTrue()) diff --git a/pkg/apis/pingcap/v1alpha1/tidbcluster.go b/pkg/apis/pingcap/v1alpha1/tidbcluster.go index 189f32743ee..64906ceb554 100644 --- a/pkg/apis/pingcap/v1alpha1/tidbcluster.go +++ b/pkg/apis/pingcap/v1alpha1/tidbcluster.go @@ -547,6 +547,8 @@ func (tc *TidbCluster) getDeleteSlots(component string) (deleteSlots sets.Int32) key = label.AnnTSODeleteSlots } else if component == label.PDMSSchedulingLabelVal { key = label.AnnSchedulingDeleteSlots + } else if component == label.PDMSRouterLabelVal { + key = label.AnnRouterDeleteSlots } else if component == label.TiDBLabelVal { key = label.AnnTiDBDeleteSlots } else if component == label.TiKVLabelVal { diff --git a/pkg/apis/pingcap/v1alpha1/types.go b/pkg/apis/pingcap/v1alpha1/types.go index 46c501a8b51..11640b03aec 100644 --- a/pkg/apis/pingcap/v1alpha1/types.go +++ b/pkg/apis/pingcap/v1alpha1/types.go @@ -74,6 +74,8 @@ const ( PDMSTSOMemberType MemberType = "tso" // PDMSSchedulingMemberType is pd microservice scheduling member type PDMSSchedulingMemberType MemberType = "scheduling" + // PDMSRouterMerberType is pd microservice router member type + PDMSRouterMerberType MemberType = "router" // TiDBMemberType is tidb member type TiDBMemberType MemberType = "tidb" // TiKVMemberType is tikv member type @@ -113,13 +115,15 @@ func PDMSMemberType(name string) MemberType { return PDMSTSOMemberType case "scheduling": return PDMSSchedulingMemberType + case "router": + return PDMSRouterMerberType default: panic(fmt.Sprintf("unknown pd ms name %s", name)) } } func IsPDMSMemberType(name MemberType) bool { - return name == PDMSTSOMemberType || name == PDMSSchedulingMemberType + return name == PDMSTSOMemberType || name == PDMSSchedulingMemberType || name == PDMSRouterMerberType } // MemberPhase is the current state of member @@ -610,7 +614,7 @@ type PDMSSpec struct { corev1.ResourceRequirements `json:",inline"` // Name of the PD microservice - // +kubebuilder:validation:Enum:="tso";"scheduling" + // +kubebuilder:validation:Enum:="tso";"scheduling";"router" Name string `json:"name"` // Specify a Service Account for pd ms diff --git a/pkg/manager/member/pvc_resizer.go b/pkg/manager/member/pvc_resizer.go index cedee4963d4..7f2a61eb5c1 100644 --- a/pkg/manager/member/pvc_resizer.go +++ b/pkg/manager/member/pvc_resizer.go @@ -204,7 +204,7 @@ func (p *pvcResizer) buildContextForTC(tc *v1alpha1.TidbCluster, status v1alpha1 } storageVolumes = tc.Spec.PD.StorageVolumes // PD microservice - case v1alpha1.PDMSTSOMemberType, v1alpha1.PDMSSchedulingMemberType: + case v1alpha1.PDMSTSOMemberType, v1alpha1.PDMSSchedulingMemberType, v1alpha1.PDMSRouterMerberType: pdmsRequirement := util.MustNewRequirement(label.ComponentLabelKey, selection.Equals, []string{label.PDMSLabel(comp.String())}) ctx.selector = selector.Add(*pdmsRequirement) for _, component := range tc.Spec.PDMS { diff --git a/pkg/manager/member/startscript/render_start_script.go b/pkg/manager/member/startscript/render_start_script.go index beee3366b0e..67d2ef331de 100644 --- a/pkg/manager/member/startscript/render_start_script.go +++ b/pkg/manager/member/startscript/render_start_script.go @@ -41,6 +41,7 @@ var ( pdMS = map[string]RenderMap{ "tso": pdmsTSO, "scheduling": pdmsScheduling, + "router": pdmsRouter, } pdmsTSO = RenderMap{ v1alpha1.StartScriptV1: v2.RenderPDTSOStartScript, @@ -50,6 +51,10 @@ var ( v1alpha1.StartScriptV1: v2.RenderPDSchedulingStartScript, v1alpha1.StartScriptV2: v2.RenderPDSchedulingStartScript, } + pdmsRouter = RenderMap{ + v1alpha1.StartScriptV1: v2.RenderPDRouterStartScript, + v1alpha1.StartScriptV2: v2.RenderPDRouterStartScript, + } tidb = RenderMap{ v1alpha1.StartScriptV1: v1.RenderTiDBStartScript, v1alpha1.StartScriptV2: v2.RenderTiDBStartScript, diff --git a/pkg/manager/member/startscript/v2/pd_start_script.go b/pkg/manager/member/startscript/v2/pd_start_script.go index 27e2d4969c3..ee1cb07f1e9 100644 --- a/pkg/manager/member/startscript/v2/pd_start_script.go +++ b/pkg/manager/member/startscript/v2/pd_start_script.go @@ -126,6 +126,10 @@ func RenderPDSchedulingStartScript(tc *v1alpha1.TidbCluster) (string, error) { return renderPDMSStartScript(tc, "scheduling") } +func RenderPDRouterStartScript(tc *v1alpha1.TidbCluster) (string, error) { + return renderPDMSStartScript(tc, "router") +} + // RenderPDMCSStartScript renders TSO start script from TidbCluster func renderPDMSStartScript(tc *v1alpha1.TidbCluster, name string) (string, error) { m := &PDMSStartScriptModel{} diff --git a/pkg/manager/member/utils.go b/pkg/manager/member/utils.go index 892071228bc..61cc74f781d 100644 --- a/pkg/manager/member/utils.go +++ b/pkg/manager/member/utils.go @@ -210,6 +210,8 @@ func getStsAnnotations(tcAnns map[string]string, component string) map[string]st key = label.AnnTSODeleteSlots case label.PDMSSchedulingLabelVal: key = label.AnnSchedulingDeleteSlots + case label.PDMSRouterLabelVal: + key = label.AnnRouterDeleteSlots case label.TiDBLabelVal: key = label.AnnTiDBDeleteSlots case label.TiKVLabelVal: diff --git a/pkg/manager/suspender/suspender.go b/pkg/manager/suspender/suspender.go index 045928d874e..61fb38ebb22 100644 --- a/pkg/manager/suspender/suspender.go +++ b/pkg/manager/suspender/suspender.go @@ -36,6 +36,7 @@ var ( v1alpha1.PDMemberType, v1alpha1.PDMSTSOMemberType, v1alpha1.PDMSSchedulingMemberType, + v1alpha1.PDMSRouterMerberType, } suspendOrderForDM = []v1alpha1.MemberType{ v1alpha1.DMWorkerMemberType, @@ -166,7 +167,7 @@ func (s *suspender) suspendSts(ctx *suspendComponentCtx) error { case v1alpha1.PDMemberType: ctx.status.(*v1alpha1.PDStatus).Members = nil ctx.status.(*v1alpha1.PDStatus).Leader = v1alpha1.PDMember{} - case v1alpha1.PDMSTSOMemberType, v1alpha1.PDMSSchedulingMemberType: + case v1alpha1.PDMSTSOMemberType, v1alpha1.PDMSSchedulingMemberType, v1alpha1.PDMSRouterMerberType: ctx.status.(*v1alpha1.PDMSStatus).Members = nil case v1alpha1.TiDBMemberType: ctx.status.(*v1alpha1.TiDBStatus).Members = nil diff --git a/pkg/manager/volumes/selector.go b/pkg/manager/volumes/selector.go index 1b90d56fc3d..cf2910d5293 100644 --- a/pkg/manager/volumes/selector.go +++ b/pkg/manager/volumes/selector.go @@ -55,6 +55,7 @@ func NewSelectorFactory() (*selectorFactory, error) { v1alpha1.PDMemberType, v1alpha1.PDMSTSOMemberType, v1alpha1.PDMSSchedulingMemberType, + v1alpha1.PDMSRouterMerberType, v1alpha1.TiProxyMemberType, v1alpha1.TiDBMemberType, v1alpha1.TiKVMemberType, diff --git a/pkg/manager/volumes/selector_test.go b/pkg/manager/volumes/selector_test.go index cb2127524a3..08633ca4a7c 100644 --- a/pkg/manager/volumes/selector_test.go +++ b/pkg/manager/volumes/selector_test.go @@ -51,6 +51,13 @@ func TestNewSelector(t *testing.T) { expected: "app.kubernetes.io/component=scheduling,app.kubernetes.io/instance=aaa,app.kubernetes.io/managed-by=tidb-operator,app.kubernetes.io/name=tidb-cluster", }, + { + desc: "selector for router", + instance: "aaa", + mt: v1alpha1.PDMSRouterMerberType, + + expected: "app.kubernetes.io/component=router,app.kubernetes.io/instance=aaa,app.kubernetes.io/managed-by=tidb-operator,app.kubernetes.io/name=tidb-cluster", + }, { desc: "selector for tidb", instance: "aaa", diff --git a/pkg/manager/volumes/vol_compare_utils.go b/pkg/manager/volumes/vol_compare_utils.go index 8d21ff9826c..26bf1c63749 100644 --- a/pkg/manager/volumes/vol_compare_utils.go +++ b/pkg/manager/volumes/vol_compare_utils.go @@ -236,7 +236,7 @@ func (u *volCompareUtils) GetDesiredVolumes(tc *v1alpha1.TidbCluster, mt v1alpha desiredVolumes = append(desiredVolumes, d) storageVolumes = tc.Spec.PD.StorageVolumes - case v1alpha1.PDMSSchedulingMemberType, v1alpha1.PDMSTSOMemberType: + case v1alpha1.PDMSSchedulingMemberType, v1alpha1.PDMSTSOMemberType, v1alpha1.PDMSRouterMerberType: for _, component := range tc.Spec.PDMS { if strings.Contains(mt.String(), component.Name) { defaultScName = component.StorageClassName diff --git a/pkg/monitor/monitor/template.go b/pkg/monitor/monitor/template.go index 97f37c59748..8b624fcb669 100644 --- a/pkg/monitor/monitor/template.go +++ b/pkg/monitor/monitor/template.go @@ -47,6 +47,7 @@ var ( pdPattern = "pd" pdmsTSOPattern = "tso" pdmsSchedulingPattern = "scheduling" + pdmsRouterPattern = "router" tidbPattern = "tidb" addressPattern = "(.+);(.+);(.+);(.+)" tiflashPattern = "tiflash" @@ -96,6 +97,7 @@ func newPrometheusConfig(cmodel *MonitorConfigModel) yaml.MapSlice { scrapeJobs = append(scrapeJobs, scrapeJob("pd", pdPattern, cmodel, buildAddressRelabelConfigByComponent("pd"))...) scrapeJobs = append(scrapeJobs, scrapeJob("tso", pdmsTSOPattern, cmodel, buildAddressRelabelConfigByComponent("tso"))...) scrapeJobs = append(scrapeJobs, scrapeJob("scheduling", pdmsSchedulingPattern, cmodel, buildAddressRelabelConfigByComponent("scheduling"))...) + scrapeJobs = append(scrapeJobs, scrapeJob("router", pdmsRouterPattern, cmodel, buildAddressRelabelConfigByComponent("router"))...) scrapeJobs = append(scrapeJobs, scrapeJob("tidb", tidbPattern, cmodel, buildAddressRelabelConfigByComponent("tidb"))...) scrapeJobs = append(scrapeJobs, scrapeJob("tikv", tikvPattern, cmodel, buildAddressRelabelConfigByComponent("tikv"))...) scrapeJobs = append(scrapeJobs, scrapeJob("tiproxy", tiproxyPattern, cmodel, buildAddressRelabelConfigByComponent("tiproxy"))...) @@ -139,7 +141,7 @@ func buildAddressRelabelConfigByComponent(kind string) yaml.MapSlice { } switch strings.ToLower(kind) { - case "pd", "scheduling", "tso": + case "pd", "scheduling", "tso", "router": return f() case "tidb": return f() diff --git a/pkg/monitor/monitor/template_test.go b/pkg/monitor/monitor/template_test.go index 87808aabd34..fb94d6c415f 100644 --- a/pkg/monitor/monitor/template_test.go +++ b/pkg/monitor/monitor/template_test.go @@ -296,6 +296,79 @@ scrape_configs: - __tmp_hash regex: $(SHARD) action: keep +- job_name: ns1-target-router + honor_labels: true + scrape_interval: 15s + scheme: http + kubernetes_sd_configs: + - api_server: null + role: pod + namespaces: + names: + - ns1 + tls_config: + insecure_skip_verify: true + relabel_configs: + - source_labels: + - __meta_kubernetes_pod_label_app_kubernetes_io_instance + action: keep + regex: target + - source_labels: + - __meta_kubernetes_namespace + action: keep + regex: ns1 + - source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_scrape + action: keep + regex: "true" + - source_labels: + - __meta_kubernetes_pod_label_app_kubernetes_io_component + action: keep + regex: router + - action: replace + regex: (.+);(.+);(.+);(.+) + replacement: $1.$2-router-peer.$3:$4 + target_label: __address__ + source_labels: + - __meta_kubernetes_pod_name + - __meta_kubernetes_pod_label_app_kubernetes_io_instance + - __meta_kubernetes_namespace + - __meta_kubernetes_pod_annotation_prometheus_io_port + - source_labels: + - __meta_kubernetes_namespace + action: replace + target_label: kubernetes_namespace + - source_labels: + - __meta_kubernetes_pod_label_app_kubernetes_io_instance + action: replace + target_label: cluster + - source_labels: + - __meta_kubernetes_pod_name + action: replace + target_label: instance + - source_labels: + - __meta_kubernetes_pod_label_app_kubernetes_io_component + action: replace + target_label: component + - source_labels: + - __meta_kubernetes_namespace + - __meta_kubernetes_pod_label_app_kubernetes_io_instance + separator: '-' + target_label: tidb_cluster + - source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_path + action: replace + target_label: __metrics_path__ + regex: (.+) + - source_labels: + - __address__ + action: hashmod + target_label: __tmp_hash + modulus: 0 + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep - job_name: ns1-target-tidb honor_labels: true scrape_interval: 15s @@ -1413,6 +1486,79 @@ scrape_configs: - __tmp_hash regex: $(SHARD) action: keep +- job_name: ns1-target-router + honor_labels: true + scrape_interval: 15s + scheme: http + kubernetes_sd_configs: + - api_server: null + role: pod + namespaces: + names: + - ns1 + tls_config: + insecure_skip_verify: true + relabel_configs: + - source_labels: + - __meta_kubernetes_pod_label_app_kubernetes_io_instance + action: keep + regex: target + - source_labels: + - __meta_kubernetes_namespace + action: keep + regex: ns1 + - source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_scrape + action: keep + regex: "true" + - source_labels: + - __meta_kubernetes_pod_label_app_kubernetes_io_component + action: keep + regex: router + - action: replace + regex: (.+);(.+);(.+);(.+) + replacement: $1.$2-router-peer.$3:$4 + target_label: __address__ + source_labels: + - __meta_kubernetes_pod_name + - __meta_kubernetes_pod_label_app_kubernetes_io_instance + - __meta_kubernetes_namespace + - __meta_kubernetes_pod_annotation_prometheus_io_port + - source_labels: + - __meta_kubernetes_namespace + action: replace + target_label: kubernetes_namespace + - source_labels: + - __meta_kubernetes_pod_label_app_kubernetes_io_instance + action: replace + target_label: cluster + - source_labels: + - __meta_kubernetes_pod_name + action: replace + target_label: instance + - source_labels: + - __meta_kubernetes_pod_label_app_kubernetes_io_component + action: replace + target_label: component + - source_labels: + - __meta_kubernetes_namespace + - __meta_kubernetes_pod_label_app_kubernetes_io_instance + separator: '-' + target_label: tidb_cluster + - source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_path + action: replace + target_label: __metrics_path__ + regex: (.+) + - source_labels: + - __address__ + action: hashmod + target_label: __tmp_hash + modulus: 0 + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep - job_name: ns1-target-tidb honor_labels: true scrape_interval: 15s @@ -2532,6 +2678,81 @@ scrape_configs: - __tmp_hash regex: $(SHARD) action: keep +- job_name: ns1-target-router + honor_labels: true + scrape_interval: 15s + scheme: https + kubernetes_sd_configs: + - api_server: null + role: pod + namespaces: + names: + - ns1 + tls_config: + ca_file: /var/lib/cluster-assets-tls/secret_ns1_target-cluster-client-secret_ca.crt + cert_file: /var/lib/cluster-assets-tls/secret_ns1_target-cluster-client-secret_tls.crt + key_file: /var/lib/cluster-assets-tls/secret_ns1_target-cluster-client-secret_tls.key + relabel_configs: + - source_labels: + - __meta_kubernetes_pod_label_app_kubernetes_io_instance + action: keep + regex: target + - source_labels: + - __meta_kubernetes_namespace + action: keep + regex: ns1 + - source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_scrape + action: keep + regex: "true" + - source_labels: + - __meta_kubernetes_pod_label_app_kubernetes_io_component + action: keep + regex: router + - action: replace + regex: (.+);(.+);(.+);(.+) + replacement: $1.$2-router-peer.$3:$4 + target_label: __address__ + source_labels: + - __meta_kubernetes_pod_name + - __meta_kubernetes_pod_label_app_kubernetes_io_instance + - __meta_kubernetes_namespace + - __meta_kubernetes_pod_annotation_prometheus_io_port + - source_labels: + - __meta_kubernetes_namespace + action: replace + target_label: kubernetes_namespace + - source_labels: + - __meta_kubernetes_pod_label_app_kubernetes_io_instance + action: replace + target_label: cluster + - source_labels: + - __meta_kubernetes_pod_name + action: replace + target_label: instance + - source_labels: + - __meta_kubernetes_pod_label_app_kubernetes_io_component + action: replace + target_label: component + - source_labels: + - __meta_kubernetes_namespace + - __meta_kubernetes_pod_label_app_kubernetes_io_instance + separator: '-' + target_label: tidb_cluster + - source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_path + action: replace + target_label: __metrics_path__ + regex: (.+) + - source_labels: + - __address__ + action: hashmod + target_label: __tmp_hash + modulus: 0 + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep - job_name: ns1-target-tidb honor_labels: true scrape_interval: 15s diff --git a/pkg/pdapi/pd_control.go b/pkg/pdapi/pd_control.go index c5c4d29c996..a5c3e35a9c6 100644 --- a/pkg/pdapi/pd_control.go +++ b/pkg/pdapi/pd_control.go @@ -29,6 +29,7 @@ import ( const ( TSOServiceName = "tso" SchedulingServiceName = "scheduling" + RouterServiceName = "router" ) // Namespace is a newtype of a string @@ -109,7 +110,7 @@ func (c *clientConfig) applyOptions(opts ...Option) { } // completeForPDClient populate and correct config for pd client -// serviceName need to be `tso` or `scheduling`, use `pd` as default +// serviceName need to be `tso`, `scheduling` or "router", use `pd` as default func (c *clientConfig) completeForPDClient(namespace Namespace, tcName, serviceName string) { scheme := "http" if c.tlsEnable { @@ -259,7 +260,7 @@ func (pdc *defaultPDControl) GetPDClient(namespace Namespace, tcName string, tls } func checkServiceName(name string) bool { - return name == TSOServiceName || name == SchedulingServiceName + return name == TSOServiceName || name == SchedulingServiceName || name == RouterServiceName } func (pdc *defaultPDControl) GetPDMSClient(namespace Namespace, tcName, serviceName string, tlsEnabled bool, opts ...Option) PDMSClient { diff --git a/pkg/util/util.go b/pkg/util/util.go index 909224a7be0..f178793b75b 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -122,6 +122,14 @@ func GetPodOrdinals(tc *v1alpha1.TidbCluster, memberType v1alpha1.MemberType) (s break } } + } else if memberType == v1alpha1.PDMSRouterMerberType { + for _, component := range tc.Spec.PDMS { + if strings.Contains(memberType.String(), component.Name) { + replicas = component.Replicas + ann = label.AnnRouterDeleteSlots + break + } + } } else if memberType == v1alpha1.TiKVMemberType { ann = label.AnnTiKVDeleteSlots replicas = tc.Spec.TiKV.Replicas diff --git a/tests/actions.go b/tests/actions.go index 825cce239bd..c4d3b4a88d6 100644 --- a/tests/actions.go +++ b/tests/actions.go @@ -683,7 +683,7 @@ func (oa *OperatorActions) memberCheckContextForTC(tc *v1alpha1.TidbCluster, com expectedImage = tc.PDImage() services = []string{controller.PDMemberName(name), controller.PDPeerMemberName(name)} checkComponent = oa.isPDMembersReady - case v1alpha1.PDMSTSOMemberType, v1alpha1.PDMSSchedulingMemberType: + case v1alpha1.PDMSTSOMemberType, v1alpha1.PDMSSchedulingMemberType, v1alpha1.PDMSRouterMerberType: skip = true if tc.Spec.PD != nil && tc.Spec.PD.Mode == "ms" { curService := component.String() @@ -1366,6 +1366,7 @@ func (oa *OperatorActions) WaitForTidbClusterReady(tc *v1alpha1.TidbCluster, tim components := []v1alpha1.MemberType{ v1alpha1.PDMSTSOMemberType, v1alpha1.PDMSSchedulingMemberType, + v1alpha1.PDMSRouterMerberType, v1alpha1.PDMemberType, v1alpha1.TiKVMemberType, v1alpha1.TiDBMemberType,