Skip to content

Commit

Permalink
cleanup: add finalizers for mcs to make code graceful
Browse files Browse the repository at this point in the history
Signed-off-by: duanmengkk <[email protected]>
  • Loading branch information
duanmengkk committed Dec 20, 2023
1 parent 04938bf commit 08ed51e
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package mcs

import (
"context"

Check failure on line 4 in pkg/clustertree/cluster-manager/controllers/mcs/serviceexport_controller.go

View workflow job for this annotation

GitHub Actions / lint

File is not `goimports`-ed with -local github.com/kosmos.io/kosmos (goimports)
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"

Check failure on line 5 in pkg/clustertree/cluster-manager/controllers/mcs/serviceexport_controller.go

View workflow job for this annotation

GitHub Actions / lint

File is not `gci`-ed with --skip-generated -s Standard -s Default -s Prefix(github.com/kosmos.io/kosmos) (gci)

"github.com/go-logr/logr"
corev1 "k8s.io/api/core/v1"
Expand Down Expand Up @@ -45,28 +46,28 @@ func (c *ServiceExportController) Reconcile(ctx context.Context, request reconci
klog.V(4).Infof("============ %s has been reconciled =============", request.NamespacedName.String())
}()

var shouldDelete bool
serviceExport := &mcsv1alpha1.ServiceExport{}
if err := c.RootClient.Get(ctx, request.NamespacedName, serviceExport); err != nil {
if !apierrors.IsNotFound(err) {
return controllerruntime.Result{Requeue: true}, err
if apierrors.IsNotFound(err) {
return controllerruntime.Result{}, nil
}
shouldDelete = true

return controllerruntime.Result{Requeue: true}, err
}

// The serviceExport is being deleted, in which case we should clear endpointSlice.
if shouldDelete || !serviceExport.DeletionTimestamp.IsZero() {
if !serviceExport.DeletionTimestamp.IsZero() {
if err := c.removeAnnotation(ctx, request.Namespace, request.Name); err != nil {
return controllerruntime.Result{Requeue: true}, err
}
return controllerruntime.Result{}, nil
return c.removeFinalizer(ctx, serviceExport)
}

err := c.syncServiceExport(ctx, serviceExport)
if err != nil {
return controllerruntime.Result{Requeue: true}, err
}
return controllerruntime.Result{}, nil
return c.ensureFinalizer(ctx, serviceExport)
}

func (c *ServiceExportController) SetupWithManager(mgr manager.Manager) error {
Expand Down Expand Up @@ -215,3 +216,31 @@ func (c *ServiceExportController) syncServiceExport(ctx context.Context, export
c.EventRecorder.Event(export, corev1.EventTypeNormal, "Synced", "serviceExport has been synced to endpointSlice's annotation successfully")
return nil
}

func (c *ServiceExportController) ensureFinalizer(ctx context.Context, export *mcsv1alpha1.ServiceExport) (reconcile.Result, error) {
if controllerutil.ContainsFinalizer(export, utils.MCSFinalizer) {
return controllerruntime.Result{}, nil
}

controllerutil.AddFinalizer(export, utils.MCSFinalizer)
err := c.RootClient.Update(ctx, export)
if err != nil {
return controllerruntime.Result{Requeue: true}, err
}

return controllerruntime.Result{}, nil
}

func (c *ServiceExportController) removeFinalizer(ctx context.Context, export *mcsv1alpha1.ServiceExport) (reconcile.Result, error) {
if !controllerutil.ContainsFinalizer(export, utils.MCSFinalizer) {
return controllerruntime.Result{}, nil
}

controllerutil.RemoveFinalizer(export, utils.MCSFinalizer)
err := c.RootClient.Update(ctx, export)
if err != nil {
return controllerruntime.Result{Requeue: true}, err
}

return controllerruntime.Result{}, nil
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package mcs
import (
"context"
"fmt"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"

Check failure on line 6 in pkg/clustertree/cluster-manager/controllers/mcs/serviceimport_controller.go

View workflow job for this annotation

GitHub Actions / lint

File is not `gci`-ed with --skip-generated -s Standard -s Default -s Prefix(github.com/kosmos.io/kosmos) (gci)
"strings"

Check failure on line 8 in pkg/clustertree/cluster-manager/controllers/mcs/serviceimport_controller.go

View workflow job for this annotation

GitHub Actions / lint

File is not `goimports`-ed with -local github.com/kosmos.io/kosmos (goimports)
"github.com/go-logr/logr"
Expand Down Expand Up @@ -109,29 +110,29 @@ func (c *ServiceImportController) Reconcile(key utils.QueueKey) error {
klog.V(4).Infof("============ %s has been reconciled in cluster %s =============", clusterWideKey.NamespaceKey(), c.LeafNodeName)
}()

var shouldDelete bool
serviceImport := &mcsv1alpha1.ServiceImport{}
if err := c.LeafClient.Get(c.ctx, types.NamespacedName{Namespace: clusterWideKey.Namespace, Name: clusterWideKey.Name}, serviceImport); err != nil {
if !apierrors.IsNotFound(err) {
klog.Errorf("Get %s in cluster %s failed, Error: %v", clusterWideKey.NamespaceKey(), c.LeafNodeName, err)
return err
if apierrors.IsNotFound(err) {
return nil
}
shouldDelete = true

klog.Errorf("Get %s in cluster %s failed, Error: %v", clusterWideKey.NamespaceKey(), c.LeafNodeName, err)
return err
}

// The serviceImport is being deleted, in which case we should clear endpointSlice.
if shouldDelete || !serviceImport.DeletionTimestamp.IsZero() {
if !serviceImport.DeletionTimestamp.IsZero() {
if err := c.cleanupServiceAndEndpointSlice(c.ctx, clusterWideKey.Namespace, clusterWideKey.Name); err != nil {
return err
}
return nil
return c.removeFinalizer(c.ctx, serviceImport)
}

err := c.syncServiceImport(c.ctx, serviceImport)
if err != nil {
return err
}
return nil
return c.ensureFinalizer(c.ctx, serviceImport)
}

func (c *ServiceImportController) cleanupServiceAndEndpointSlice(ctx context.Context, namespace, name string) error {
Expand Down Expand Up @@ -509,6 +510,34 @@ func (c *ServiceImportController) checkServiceType(service *corev1.Service) erro
return nil
}

func (c *ServiceImportController) removeFinalizer(ctx context.Context, serviceImport *mcsv1alpha1.ServiceImport) error {
if !controllerutil.ContainsFinalizer(serviceImport, utils.MCSFinalizer) {
return nil
}

controllerutil.RemoveFinalizer(serviceImport, utils.MCSFinalizer)
err := c.LeafClient.Update(ctx, serviceImport)
if err != nil {
return err
}

return nil
}

func (c *ServiceImportController) ensureFinalizer(ctx context.Context, serviceImport *mcsv1alpha1.ServiceImport) error {
if controllerutil.ContainsFinalizer(serviceImport, utils.MCSFinalizer) {
return nil
}

controllerutil.AddFinalizer(serviceImport, utils.MCSFinalizer)
err := c.LeafClient.Update(ctx, serviceImport)
if err != nil {
return err
}

return nil
}

func isServiceIPSet(service *corev1.Service) bool {
return service.Spec.ClusterIP != corev1.ClusterIPNone && service.Spec.ClusterIP != ""
}
Expand Down
8 changes: 6 additions & 2 deletions pkg/utils/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,6 @@ const (
EnvNodeName = "NODE_NAME"
)

const ClusterStartControllerFinalizer = "kosmos.io/cluster-start-finazlizer"

// mcs
const (
ServiceKey = "kubernetes.io/service-name"
Expand Down Expand Up @@ -162,6 +160,12 @@ const (
MasterRooTCAName = "master-root-ca.crt"
)

// finalizers
const (
ClusterStartControllerFinalizer = "kosmos.io/cluster-start-finalizer"
MCSFinalizer = "kosmos.io/multi-cluster-service-finalizer"
)

var GVR_CONFIGMAP = schema.GroupVersionResource{
Group: "",
Version: "v1",
Expand Down

0 comments on commit 08ed51e

Please sign in to comment.