diff --git a/pkg/kubeserver/client/manager.go b/pkg/kubeserver/client/manager.go index e608e19b5..19a81dd8f 100644 --- a/pkg/kubeserver/client/manager.go +++ b/pkg/kubeserver/client/manager.go @@ -101,6 +101,9 @@ func (m *ClustersManager) AddClient(dbCluster manager.ICluster) error { func (m *ClustersManager) IsClusterClientHealthy(dbCluster manager.ICluster) bool { clusterId := dbCluster.GetId() man := m.getManager(clusterId) + if man == nil { + return false + } err := man.ClientV2.K8S().IsReachable() if err != nil { log.Warningf("check cluster %s is reachable error: %v", dbCluster.GetName(), err) diff --git a/pkg/kubeserver/models/clusters.go b/pkg/kubeserver/models/clusters.go index 5b255311f..c50381453 100644 --- a/pkg/kubeserver/models/clusters.go +++ b/pkg/kubeserver/models/clusters.go @@ -923,8 +923,17 @@ func (m *SClusterManager) ClusterHealthCheckTask(ctx context.Context, userCred m } continue } else { - c.SetStatus(ctx, userCred, api.ClusterStatusLost, err.Error()) - client.GetClustersManager().RemoveClient(c.GetId()) + if c.GetName() == SystemClusterName { + log.Infof("cluster %q is unhealthy, perform force sync", c.GetName()) + if _, err := c.PerformSync(ctx, userCred, nil, api.ClusterSyncInput{ + Force: true, + }); err != nil { + log.Errorf("cluster %q perform force sync when health check error: %v", c.GetName(), err) + } + } else { + c.SetStatus(ctx, userCred, api.ClusterStatusLost, err.Error()) + client.GetClustersManager().RemoveClient(c.GetId()) + } } } }