Skip to content

Commit 810c6c4

Browse files
authored
Merge pull request #609 from jxustc/main
add sharding feature for ClusterSynchroManager
2 parents f4ae79e + 676ff88 commit 810c6c4

File tree

9 files changed

+106
-4
lines changed

9 files changed

+106
-4
lines changed

cmd/binding-apiserver/app/binding_apiserver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func NewClusterPediaServerCommand(ctx context.Context) *cobra.Command {
5757
return err
5858
}
5959

60-
synchromanager := synchromanager.NewManager(crdclient, config.StorageFactory, clustersynchro.ClusterSyncConfig{})
60+
synchromanager := synchromanager.NewManager(crdclient, config.StorageFactory, clustersynchro.ClusterSyncConfig{}, "")
6161
go synchromanager.Run(1, ctx.Done())
6262

6363
server, err := completedConfig.New()

cmd/clustersynchro-manager/app/config/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type Config struct {
1818
EventRecorder record.EventRecorder
1919

2020
WorkerNumber int
21+
ShardingName string
2122
MetricsServerConfig metrics.Config
2223
KubeMetricsServerConfig *kubestatemetrics.ServerConfig
2324
StorageFactory storage.StorageFactory

cmd/clustersynchro-manager/app/options/options.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ type Options struct {
4747

4848
WorkerNumber int // WorkerNumber is the number of worker goroutines
4949
PageSizeForResourceSync int64
50+
ShardingName string
5051
}
5152

5253
func NewClusterSynchroManagerOptions() (*Options, error) {
@@ -90,6 +91,7 @@ func (o *Options) Flags() cliflag.NamedFlagSets {
9091
genericfs.Float32Var(&o.ClientConnection.QPS, "kube-api-qps", o.ClientConnection.QPS, "QPS to use while talking with kubernetes apiserver.")
9192
genericfs.Int32Var(&o.ClientConnection.Burst, "kube-api-burst", o.ClientConnection.Burst, "Burst to use while talking with kubernetes apiserver.")
9293
genericfs.IntVar(&o.WorkerNumber, "worker-number", o.WorkerNumber, "The number of worker goroutines.")
94+
genericfs.StringVar(&o.ShardingName, "sharding-name", o.ShardingName, "The sharding name of manager.")
9395

9496
syncfs := fss.FlagSet("resource sync")
9597
syncfs.Int64Var(&o.PageSizeForResourceSync, "page-size", o.PageSizeForResourceSync, "The requested chunk size of initial and resync watch lists for resource sync")
@@ -160,13 +162,18 @@ func (o *Options) Config() (*config.Config, error) {
160162
}
161163
kubeStateMetricsServerConfig := o.KubeStateMetrics.ServerConfig(metricsConfig)
162164

165+
if o.ShardingName != "" {
166+
o.LeaderElection.ResourceName = fmt.Sprintf("%s-%s", o.LeaderElection.ResourceName, o.ShardingName)
167+
}
168+
163169
return &config.Config{
164170
CRDClient: crdclient,
165171
Kubeconfig: kubeconfig,
166172
EventRecorder: eventRecorder,
167173

168174
StorageFactory: storagefactory,
169175
WorkerNumber: o.WorkerNumber,
176+
ShardingName: o.ShardingName,
170177

171178
MetricsServerConfig: metricsConfig,
172179
KubeMetricsServerConfig: kubeStateMetricsServerConfig,

cmd/clustersynchro-manager/app/synchro.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ func NewClusterSynchroManagerCommand(ctx context.Context) *cobra.Command {
8585
}
8686

8787
func Run(ctx context.Context, c *config.Config) error {
88-
synchromanager := synchromanager.NewManager(c.CRDClient, c.StorageFactory, c.ClusterSyncConfig)
88+
synchromanager := synchromanager.NewManager(c.CRDClient, c.StorageFactory, c.ClusterSyncConfig, c.ShardingName)
8989

9090
go func() {
9191
metrics.RunServer(c.MetricsServerConfig)

kustomize/crds/cluster.clusterpedia.io_pediaclusters.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ spec:
3636
name: ClusterHealthy
3737
priority: 10
3838
type: string
39+
- jsonPath: .status.shardingName
40+
name: ShardingName
41+
priority: 10
42+
type: string
3943
name: v1alpha2
4044
schema:
4145
openAPIV3Schema:
@@ -68,6 +72,8 @@ spec:
6872
kubeconfig:
6973
format: byte
7074
type: string
75+
shardingName:
76+
type: string
7177
syncAllCustomResources:
7278
type: boolean
7379
syncResources:
@@ -169,6 +175,8 @@ spec:
169175
- type
170176
type: object
171177
type: array
178+
shardingName:
179+
type: string
172180
syncResources:
173181
items:
174182
properties:

pkg/generated/openapi/zz_generated.openapi.go

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/synchromanager/clustersynchro_manager.go

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ type Manager struct {
4848
clusterpediaclient crdclientset.Interface
4949
informerFactory externalversions.SharedInformerFactory
5050

51+
shardingName string
5152
queue workqueue.RateLimitingInterface
5253
storage storage.StorageFactory
5354
clusterlister clusterlister.PediaClusterLister
@@ -62,14 +63,15 @@ type Manager struct {
6263

6364
var _ kubestatemetrics.ClusterMetricsWriterListGetter = &Manager{}
6465

65-
func NewManager(client crdclientset.Interface, storage storage.StorageFactory, syncConfig clustersynchro.ClusterSyncConfig) *Manager {
66+
func NewManager(client crdclientset.Interface, storage storage.StorageFactory, syncConfig clustersynchro.ClusterSyncConfig, shardingName string) *Manager {
6667
factory := externalversions.NewSharedInformerFactory(client, 0)
6768
clusterinformer := factory.Cluster().V1alpha2().PediaClusters()
6869
clusterSyncResourcesInformer := factory.Cluster().V1alpha2().ClusterSyncResources()
6970

7071
manager := &Manager{
7172
informerFactory: factory,
7273
clusterpediaclient: client,
74+
shardingName: shardingName,
7375

7476
storage: storage,
7577
clusterlister: clusterinformer.Lister(),
@@ -166,7 +168,9 @@ func (manager *Manager) addCluster(obj interface{}) {
166168
func (manager *Manager) updateCluster(older, newer interface{}) {
167169
oldObj := older.(*clusterv1alpha2.PediaCluster)
168170
newObj := newer.(*clusterv1alpha2.PediaCluster)
169-
if newObj.DeletionTimestamp.IsZero() && equality.Semantic.DeepEqual(oldObj.Spec, newObj.Spec) {
171+
if newObj.DeletionTimestamp.IsZero() &&
172+
equality.Semantic.DeepEqual(oldObj.Spec, newObj.Spec) &&
173+
oldObj.Status.ShardingName == newObj.Status.ShardingName {
170174
return
171175
}
172176

@@ -183,6 +187,17 @@ func (manager *Manager) enqueue(obj interface{}) {
183187
return
184188
}
185189

190+
if cluster, ok := obj.(*clusterv1alpha2.PediaCluster); ok {
191+
currentSharding := cluster.Status.ShardingName
192+
if cluster.Spec.ShardingName != manager.shardingName {
193+
if currentSharding == nil || *currentSharding != manager.shardingName {
194+
return
195+
}
196+
} else if currentSharding != nil && *currentSharding != manager.shardingName {
197+
return
198+
}
199+
}
200+
186201
manager.queue.Add(key)
187202
}
188203

@@ -256,6 +271,17 @@ func (manager *Manager) processNextCluster() (continued bool) {
256271

257272
// if err returned is not nil, cluster will be requeued
258273
func (manager *Manager) reconcileCluster(cluster *clusterv1alpha2.PediaCluster) controller.Result {
274+
if cluster.Status.ShardingName == nil && cluster.Spec.ShardingName != manager.shardingName {
275+
return controller.NoRequeueResult
276+
}
277+
278+
if cluster.Status.ShardingName != nil && *cluster.Status.ShardingName != manager.shardingName {
279+
return controller.NoRequeueResult
280+
}
281+
// After the above filtering, The cluster will be in the following state:
282+
// 1. spec.sharding == manager.shardingName and status.sharding == nil
283+
// 2. spec.sharding == manager.shardingName and status != nil and status.sharding == manager.shardingName
284+
// 3. spec.sharding != manager.shardingName and status != nil and status.sharding == manager.shardingName
259285
if !cluster.DeletionTimestamp.IsZero() {
260286
klog.InfoS("remove cluster", "cluster", cluster.Name)
261287
if err := manager.removeCluster(cluster.Name); err != nil {
@@ -286,6 +312,20 @@ func (manager *Manager) reconcileCluster(cluster *clusterv1alpha2.PediaCluster)
286312
}
287313
}
288314

315+
if cluster.Spec.ShardingName != manager.shardingName {
316+
// status.sharding == manager.shardingName
317+
manager.stopClusterSynchro(cluster.Name)
318+
319+
if err := manager.UpdateClusterShardingStatus(context.TODO(), cluster.Name, nil); err != nil {
320+
klog.ErrorS(err, "Failed to remove cluster shardingName status", "cluster", cluster.Name)
321+
return controller.RequeueResult(defaultRetryNum)
322+
}
323+
324+
return controller.NoRequeueResult
325+
}
326+
327+
cluster.Status.ShardingName = &manager.shardingName
328+
289329
manager.synchrolock.RLock()
290330
synchro := manager.synchros[cluster.Name]
291331
manager.synchrolock.RUnlock()
@@ -387,6 +427,11 @@ func (manager *Manager) reconcileCluster(cluster *clusterv1alpha2.PediaCluster)
387427
return controller.NoRequeueResult
388428
}
389429

430+
if err := manager.UpdateClusterShardingStatus(context.TODO(), cluster.Name, &manager.shardingName); err != nil {
431+
klog.ErrorS(err, "Failed to update cluster shardingName status", "cluster", cluster.Name)
432+
return controller.RequeueResult(defaultRetryNum)
433+
}
434+
390435
manager.synchroWaitGroup.StartWithChannel(manager.stopCh, synchro.Run)
391436

392437
manager.synchrolock.Lock()
@@ -398,6 +443,17 @@ func (manager *Manager) reconcileCluster(cluster *clusterv1alpha2.PediaCluster)
398443
return controller.NoRequeueResult
399444
}
400445

446+
func (manager *Manager) stopClusterSynchro(name string) {
447+
manager.synchrolock.Lock()
448+
synchro := manager.synchros[name]
449+
delete(manager.synchros, name)
450+
manager.synchrolock.Unlock()
451+
452+
if synchro != nil {
453+
synchro.Shutdown(true)
454+
}
455+
}
456+
401457
func (manager *Manager) removeCluster(name string) error {
402458
manager.synchrolock.Lock()
403459
synchro := manager.synchros[name]
@@ -532,6 +588,12 @@ func (manager *Manager) updateClusterStatus(ctx context.Context, name string, up
532588
})
533589
}
534590

591+
func (manager *Manager) UpdateClusterShardingStatus(ctx context.Context, name string, shardingName *string) error {
592+
return manager.updateClusterStatus(ctx, name, func(clusterStatus *clusterv1alpha2.ClusterStatus) {
593+
clusterStatus.ShardingName = shardingName
594+
})
595+
}
596+
535597
func buildClusterConfig(cluster *clusterv1alpha2.PediaCluster) (*rest.Config, error) {
536598
if len(cluster.Spec.Kubeconfig) != 0 {
537599
clientconfig, err := clientcmd.NewClientConfigFromBytes(cluster.Spec.Kubeconfig)

staging/src/github.com/clusterpedia-io/api/cluster/v1alpha2/types.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ const (
5555
// +kubebuilder:printcolumn:name="Validated",type=string,JSONPath=".status.conditions[?(@.type == 'Validated')].reason",priority=10
5656
// +kubebuilder:printcolumn:name="SynchroRunning",type=string,JSONPath=".status.conditions[?(@.type == 'SynchroRunning')].reason",priority=10
5757
// +kubebuilder:printcolumn:name="ClusterHealthy",type=string,JSONPath=".status.conditions[?(@.type == 'ClusterHealthy')].reason",priority=10
58+
// +kubebuilder:printcolumn:name="ShardingName",type=string,JSONPath=".status.shardingName",priority=10
5859
type PediaCluster struct {
5960
metav1.TypeMeta `json:",inline"`
6061
metav1.ObjectMeta `json:"metadata,omitempty"`
@@ -93,6 +94,9 @@ type ClusterSpec struct {
9394

9495
// +optional
9596
SyncResourcesRefName string `json:"syncResourcesRefName,omitempty"`
97+
98+
// +optional
99+
ShardingName string `json:"shardingName,omitempty"`
96100
}
97101

98102
type ClusterGroupResources struct {
@@ -119,6 +123,9 @@ type ClusterStatus struct {
119123

120124
// +optional
121125
SyncResources []ClusterGroupResourcesStatus `json:"syncResources,omitempty"`
126+
127+
// +optional
128+
ShardingName *string `json:"shardingName,omitempty"`
122129
}
123130

124131
type ClusterGroupResourcesStatus struct {

staging/src/github.com/clusterpedia-io/api/cluster/v1alpha2/zz_generated.deepcopy.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)