From 7ae117cbbd55650582e7fa3dc01a1590c0b3d735 Mon Sep 17 00:00:00 2001 From: Xinzhao Xu Date: Tue, 1 Mar 2022 16:22:02 +0800 Subject: [PATCH] Update the clusterName field when the kubesphere-config configmap is updated --- cmd/controller-manager/app/controllers.go | 4 ++- pkg/controller/cluster/cluster_controller.go | 35 ++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/cmd/controller-manager/app/controllers.go b/cmd/controller-manager/app/controllers.go index 4180ada90..8c27d2bae 100644 --- a/cmd/controller-manager/app/controllers.go +++ b/cmd/controller-manager/app/controllers.go @@ -456,7 +456,9 @@ func addAllControllers(mgr manager.Manager, client k8s.Client, informerFactory i kubesphereInformer.Cluster().V1alpha1().Clusters(), client.KubeSphere().ClusterV1alpha1().Clusters(), cmOptions.MultiClusterOptions.ClusterControllerResyncPeriod, - cmOptions.MultiClusterOptions.HostClusterName) + cmOptions.MultiClusterOptions.HostClusterName, + kubernetesInformer.Core().V1().ConfigMaps(), + ) addController(mgr, "cluster", clusterController) } } diff --git a/pkg/controller/cluster/cluster_controller.go b/pkg/controller/cluster/cluster_controller.go index afa22eb39..2b97602ed 100644 --- a/pkg/controller/cluster/cluster_controller.go +++ b/pkg/controller/cluster/cluster_controller.go @@ -38,6 +38,7 @@ import ( utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" + coreinformers "k8s.io/client-go/informers/core/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" corev1 "k8s.io/client-go/kubernetes/typed/core/v1" @@ -173,6 +174,7 @@ func NewClusterController( clusterClient clusterclient.ClusterInterface, resyncPeriod time.Duration, hostClusterName string, + configmapInformer coreinformers.ConfigMapInformer, ) *clusterController { broadcaster := record.NewBroadcaster() @@ -205,6 +207,18 @@ func NewClusterController( DeleteFunc: c.addCluster, }, resyncPeriod) + configmapInformer.Informer().AddEventHandlerWithResyncPeriod(cache.ResourceEventHandlerFuncs{ + UpdateFunc: func(oldObj, newObj interface{}) { + oldCM := oldObj.(*v1.ConfigMap) + newCM := newObj.(*v1.ConfigMap) + if oldCM.ResourceVersion == newCM.ResourceVersion { + return + } + // Update the clusterName field when the kubesphere-config configmap is updated. + c.syncClusterNameInConfigMap() + }, + }, resyncPeriod) + return c } @@ -675,6 +689,27 @@ func (c *clusterController) setClusterNameInConfigMap(client kubernetes.Interfac return nil } +func (c *clusterController) syncClusterNameInConfigMap() { + clusters, err := c.clusterLister.List(labels.Everything()) + if err != nil { + klog.Errorf("list clusters failed: %v", err) + return + } + + for _, cluster := range clusters { + clusterDt, ok := c.clusterMap[cluster.Name] + if !ok { + continue + } + if err = retry.RetryOnConflict(retry.DefaultRetry, func() (err error) { + return c.setClusterNameInConfigMap(clusterDt.client, cluster.Name) + }); err != nil { + klog.Errorf("update configmap %s failed: %v", constants.KubeSphereConfigName, err) + continue + } + } +} + func (c *clusterController) checkIfClusterIsHostCluster(memberClusterNodes *v1.NodeList) bool { hostNodes, err := c.client.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{}) if err != nil {