From e10560f9bec0a1bb5f444fae01ca9e96ed2e56c8 Mon Sep 17 00:00:00 2001 From: acekingke Date: Thu, 21 Jul 2022 13:04:42 +0800 Subject: [PATCH] feat(singleNode): Support running single node. #361 --- api/v1alpha1/mysqlcluster_types.go | 2 +- .../crds/mysql.radondb.com_mysqlclusters.yaml | 1 + .../mysql.radondb.com_mysqlclusters.yaml | 1 + controllers/mysqlcluster_controller.go | 44 ++++++++++++++++--- mysqlcluster/container/xenon.go | 6 ++- mysqlcluster/container/xenon_test.go | 2 +- 6 files changed, 48 insertions(+), 8 deletions(-) diff --git a/api/v1alpha1/mysqlcluster_types.go b/api/v1alpha1/mysqlcluster_types.go index d1490144..3d6a3973 100644 --- a/api/v1alpha1/mysqlcluster_types.go +++ b/api/v1alpha1/mysqlcluster_types.go @@ -31,7 +31,7 @@ type MysqlClusterSpec struct { // Replicas is the number of pods. // +optional - // +kubebuilder:validation:Enum=0;2;3;5 + // +kubebuilder:validation:Enum=0;1;2;3;5 // +kubebuilder:default:=3 Replicas *int32 `json:"replicas,omitempty"` diff --git a/charts/mysql-operator/crds/mysql.radondb.com_mysqlclusters.yaml b/charts/mysql-operator/crds/mysql.radondb.com_mysqlclusters.yaml index f9607898..2f7d9fb0 100644 --- a/charts/mysql-operator/crds/mysql.radondb.com_mysqlclusters.yaml +++ b/charts/mysql-operator/crds/mysql.radondb.com_mysqlclusters.yaml @@ -1259,6 +1259,7 @@ spec: description: Replicas is the number of pods. enum: - 0 + - 1 - 2 - 3 - 5 diff --git a/config/crd/bases/mysql.radondb.com_mysqlclusters.yaml b/config/crd/bases/mysql.radondb.com_mysqlclusters.yaml index f9607898..2f7d9fb0 100644 --- a/config/crd/bases/mysql.radondb.com_mysqlclusters.yaml +++ b/config/crd/bases/mysql.radondb.com_mysqlclusters.yaml @@ -1259,6 +1259,7 @@ spec: description: Replicas is the number of pods. enum: - 0 + - 1 - 2 - 3 - 5 diff --git a/controllers/mysqlcluster_controller.go b/controllers/mysqlcluster_controller.go index 0cf7dd68..4d51058d 100644 --- a/controllers/mysqlcluster_controller.go +++ b/controllers/mysqlcluster_controller.go @@ -38,6 +38,7 @@ import ( "github.com/radondb/radondb-mysql-kubernetes/internal" "github.com/radondb/radondb-mysql-kubernetes/mysqlcluster" clustersyncer "github.com/radondb/radondb-mysql-kubernetes/mysqlcluster/syncer" + "github.com/radondb/radondb-mysql-kubernetes/utils" ) var clusterFinalizer string = "mysqlcluster-finalizer" @@ -137,12 +138,23 @@ func (r *MysqlClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request clustersyncer.NewServiceAccountSyncer(r.Client, instance), clustersyncer.NewHeadlessSVCSyncer(r.Client, instance), clustersyncer.NewLeaderSVCSyncer(r.Client, instance), - clustersyncer.NewFollowerSVCSyncer(r.Client, instance), - clustersyncer.NewStatefulSetSyncer(r.Client, instance, cmRev, sctRev, r.SQLRunnerFactory, r.XenonExecutor), - clustersyncer.NewPDBSyncer(r.Client, instance), - clustersyncer.NewXenonCMSyncer(r.Client, instance), } - + if *instance.Unwrap().Spec.Replicas == 1 { + // Delete follower service + r.deleteFollowerService(ctx, req, instance.Unwrap()) + syncers = append(syncers, + clustersyncer.NewStatefulSetSyncer(r.Client, instance, cmRev, sctRev, r.SQLRunnerFactory, r.XenonExecutor), + clustersyncer.NewPDBSyncer(r.Client, instance), + clustersyncer.NewXenonCMSyncer(r.Client, instance), + ) + } else { + syncers = append(syncers, + clustersyncer.NewFollowerSVCSyncer(r.Client, instance), + clustersyncer.NewStatefulSetSyncer(r.Client, instance, cmRev, sctRev, r.SQLRunnerFactory, r.XenonExecutor), + clustersyncer.NewPDBSyncer(r.Client, instance), + clustersyncer.NewXenonCMSyncer(r.Client, instance), + ) + } if instance.Spec.MetricsOpts.Enabled { syncers = append(syncers, clustersyncer.NewMetricsSVCSyncer(r.Client, instance)) } @@ -204,3 +216,25 @@ func (r *MysqlClusterReconciler) deleteAllBackup(ctx context.Context, req ctrl.R return nil } + +// For SingleNode, follower service do not need. +func (r *MysqlClusterReconciler) deleteFollowerService(ctx context.Context, req ctrl.Request, instance *apiv1alpha1.MysqlCluster) error { + log := log.FromContext(ctx).WithName("controllers").WithName("MysqlCluster") + labelSet := labels.Set{"mysql.radondb.com/service-type": string(utils.FollowerService)} + serviceList := corev1.ServiceList{} + if err := r.List(ctx, + &serviceList, + &client.ListOptions{ + Namespace: instance.Namespace, + LabelSelector: labelSet.AsSelector(), + }, + ); err != nil { + return err + } + for _, svc := range serviceList.Items { + if err := r.Delete(context.TODO(), &svc); err != nil { + log.Error(err, "failed to delete a backup", "backup", svc) + } + } + return nil +} diff --git a/mysqlcluster/container/xenon.go b/mysqlcluster/container/xenon.go index 37f520c5..b42d1a6e 100644 --- a/mysqlcluster/container/xenon.go +++ b/mysqlcluster/container/xenon.go @@ -43,7 +43,11 @@ func (c *xenon) getImage() string { // getCommand get the container command. func (c *xenon) getCommand() []string { - return nil + if *c.Spec.Replicas == 1 { + return []string{"xenon", "-c", "/etc/xenon/xenon.json", "-r", "LEADER"} + } + // If return nil, statefulset never update command , And I don't know why. + return []string{"xenon", "-c", "/etc/xenon/xenon.json"} } // getEnvVars get the container env. diff --git a/mysqlcluster/container/xenon_test.go b/mysqlcluster/container/xenon_test.go index f62eb6e7..421f9e89 100644 --- a/mysqlcluster/container/xenon_test.go +++ b/mysqlcluster/container/xenon_test.go @@ -64,7 +64,7 @@ func TestGetXenonImage(t *testing.T) { } func TestGetXenonCommand(t *testing.T) { - assert.Nil(t, xenonCase.Command) + assert.Equal(t, []string{"xenon", "-c", "/etc/xenon/xenon.json"}, xenonCase.Command) } func TestGetXenonEnvVar(t *testing.T) {