9
9
"k8s.io/apimachinery/pkg/api/errors"
10
10
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11
11
"k8s.io/apimachinery/pkg/types"
12
- "k8s.io/apimachinery/pkg/util/uuid"
13
12
"k8s.io/client-go/kubernetes"
14
13
"k8s.io/client-go/util/retry"
15
14
"k8s.io/klog/v2"
@@ -295,47 +294,33 @@ func (h ClassificationModelHandler) GetLeafModelType() LeafModelType {
295
294
// GetLeafNodes returns nodes in leaf cluster by the rootNode
296
295
func (h ClassificationModelHandler ) GetLeafNodes (ctx context.Context , _ * corev1.Node , selector kosmosv1alpha1.NodeSelector ) (* corev1.NodeList , error ) {
297
296
nodesInLeaf , err := h .LeafClientset .CoreV1 ().Nodes ().List (ctx , metav1.ListOptions {
298
- LabelSelector : selector .LabelSelector . String ( ),
297
+ LabelSelector : metav1 . FormatLabelSelector ( selector .LabelSelector ),
299
298
})
300
299
if err != nil {
301
300
return nil , err
302
301
}
303
302
return nodesInLeaf , nil
304
303
}
305
304
306
- func join (nodeList * corev1.NodeList , sep string ) string {
307
- nodes := nodeList .Items
308
- if len (nodes ) == 0 {
309
- return ""
310
- }
311
-
312
- result := nodes [0 ].Name
313
- for _ , node := range nodes [1 :] {
314
- result += sep + node .Name
315
- }
316
-
317
- return result
318
- }
319
-
320
305
// GetLeafPods returns pods in leaf cluster by the rootNode
321
306
func (h ClassificationModelHandler ) GetLeafPods (ctx context.Context , rootNode * corev1.Node , selector kosmosv1alpha1.NodeSelector ) (pods * corev1.PodList , err error ) {
322
307
nodesInLeafs , err := h .GetLeafNodes (ctx , rootNode , selector )
323
308
if err != nil {
324
309
return nil , err
325
310
}
326
311
327
- fieldSelector := join ( nodesInLeafs , "," )
328
- if fieldSelector == "" {
329
- klog . Warningf ( "have leaf node in rootNode :v% " , rootNode .Name )
330
- return
331
- }
332
-
333
- fieldSelector = "spec.nodeName in (" + join ( nodesInLeafs , "," ) + ")"
334
- pods , err = h . LeafClientset . CoreV1 (). Pods ( metav1 . NamespaceAll ). List ( ctx , metav1. ListOptions {
335
- FieldSelector : fieldSelector ,
336
- })
337
- if err != nil {
338
- return nil , err
312
+ for _ , node := range nodesInLeafs . Items {
313
+ podsInNode , err := h . LeafClientset . CoreV1 (). Pods ( metav1 . NamespaceAll ). List ( ctx , metav1. ListOptions {
314
+ FieldSelector : fmt . Sprintf ( "spec.nodeName=%s " , node .Name ),
315
+ })
316
+ if err != nil {
317
+ return nil , err
318
+ }
319
+ if pods == nil {
320
+ pods = podsInNode
321
+ } else {
322
+ pods . Items = append ( pods . Items , podsInNode . Items ... )
323
+ }
339
324
}
340
325
341
326
return pods , nil
@@ -368,13 +353,16 @@ func (h ClassificationModelHandler) UpdateNodeStatus(ctx context.Context, nodes
368
353
}
369
354
370
355
nodesInLeaf , err := h .LeafClientset .CoreV1 ().Nodes ().List (ctx , metav1.ListOptions {
371
- LabelSelector : selector .LabelSelector . String ( ),
356
+ LabelSelector : metav1 . FormatLabelSelector ( selector .LabelSelector ),
372
357
})
373
358
if err != nil {
374
359
// TODO: If a node is accidentally deleted, recreate it
375
360
return fmt .Errorf ("cannot get node in leaf cluster while update node status %s, err: %v" , nodeCopy .Name , err )
376
361
}
377
362
363
+ if len (nodesInLeaf .Items ) == 0 {
364
+ return fmt .Errorf ("cannot get node in leaf cluster while update node status, leaf node item is 0" )
365
+ }
378
366
rootCopy := nodeRoot .DeepCopy ()
379
367
380
368
// TODO: Aggregation the resources of the leaf nodes
@@ -402,23 +390,25 @@ func (h ClassificationModelHandler) UpdateNodeStatus(ctx context.Context, nodes
402
390
// CreateNodeInRoot creates the node in root cluster
403
391
func (h ClassificationModelHandler ) CreateNodeInRoot (ctx context.Context , cluster * kosmosv1alpha1.Cluster , listenPort int32 , gitVersion string ) ([]* corev1.Node , map [string ]kosmosv1alpha1.NodeSelector , error ) {
404
392
nodes := make ([]* corev1.Node , 0 )
405
-
406
393
leafNodeSelectors := make (map [string ]kosmosv1alpha1.NodeSelector )
407
- for _ , leafModel := range cluster .Spec .ClusterTreeOptions .LeafModels {
408
- if reflect .DeepEqual (leafModel .NodeSelector .LabelSelector , metav1.LabelSelector {}) {
394
+
395
+ for i , leafModel := range cluster .Spec .ClusterTreeOptions .LeafModels {
396
+ if ! reflect .DeepEqual (leafModel .NodeSelector .LabelSelector , metav1.LabelSelector {}) {
409
397
var nodeName string
410
398
if leafModel .NodeSelector .NodeName != "" {
411
- nodeName = leafModel .NodeSelector .NodeName
399
+ nodeName = fmt . Sprintf ( "%v%v%v%v" , utils . KosmosNodePrefix , leafModel .NodeSelector .NodeName , "-" , i )
412
400
} else {
413
- nodeName = fmt .Sprintf ("%s%s%s%s " , utils .KosmosNodePrefix , cluster .Name , "_ " , string ( uuid . NewUUID ()) )
401
+ nodeName = fmt .Sprintf ("%v%v%v%v " , utils .KosmosNodePrefix , cluster .Name , "- " , i )
414
402
}
415
403
404
+ if len (nodeName ) > 63 {
405
+ nodeName = nodeName [:63 ]
406
+ }
416
407
node , err := h .RootClientset .CoreV1 ().Nodes ().Get (ctx , nodeName , metav1.GetOptions {})
417
408
if err != nil {
418
409
if ! errors .IsNotFound (err ) {
419
410
return nil , nil , err
420
411
}
421
-
422
412
node = utils .BuildNodeTemplate (nodeName )
423
413
nodeAnnotations := node .GetAnnotations ()
424
414
if nodeAnnotations == nil {
@@ -427,14 +417,14 @@ func (h ClassificationModelHandler) CreateNodeInRoot(ctx context.Context, cluste
427
417
nodeAnnotations [utils .KosmosNodeOwnedByClusterAnnotations ] = cluster .Name
428
418
node .SetAnnotations (nodeAnnotations )
429
419
430
- if leafModel .NodeSelector .LabelSelector .MatchLabels != nil {
431
- nodeLables := node .GetLabels ()
432
- if nodeLables == nil {
433
- nodeLables = make (map [string ]string )
434
- }
435
- nodeLables [utils .KosmosNodeOwnedByClusterAnnotations ] = cluster .Name
436
- node .SetLabels (leafModel .NodeSelector .LabelSelector .MatchLabels )
420
+ nodeLabels := node .GetLabels ()
421
+ if nodeLabels == nil {
422
+ nodeLabels = make (map [string ]string , 1 )
437
423
}
424
+ for key , value := range leafModel .NodeSelector .LabelSelector .MatchLabels {
425
+ nodeLabels [key ] = value
426
+ }
427
+ node .SetLabels (nodeLabels )
438
428
439
429
node .Status .NodeInfo .KubeletVersion = gitVersion
440
430
node .Status .DaemonEndpoints = corev1.NodeDaemonEndpoints {
@@ -451,6 +441,7 @@ func (h ClassificationModelHandler) CreateNodeInRoot(ctx context.Context, cluste
451
441
}
452
442
}
453
443
nodes = append (nodes , node )
444
+ leafNodeSelectors [nodeName ] = leafModel .NodeSelector
454
445
}
455
446
}
456
447
return nodes , leafNodeSelectors , nil
@@ -459,18 +450,18 @@ func (h ClassificationModelHandler) CreateNodeInRoot(ctx context.Context, cluste
459
450
// NewLeafModelHandler create a LeafModelHandler for Cluster
460
451
func NewLeafModelHandler (cluster * kosmosv1alpha1.Cluster , root , leafClient client.Client , rootClientset , leafClientset kubernetes.Interface ) LeafModelHandler {
461
452
leafModels := cluster .Spec .ClusterTreeOptions .LeafModels
462
- if leafModels != nil {
463
- if reflect .DeepEqual (leafModels [0 ].NodeSelector , kosmosv1alpha1.NodeSelector {}) {
464
- return & DispersionModelHandler {
453
+ if leafModels != nil && ! reflect .DeepEqual (leafModels [0 ].NodeSelector , kosmosv1alpha1.NodeSelector {}) {
454
+ if leafModels [0 ].NodeSelector .LabelSelector != nil {
455
+ // support nodeSelector mode
456
+ return & ClassificationModelHandler {
465
457
Cluster : cluster ,
466
458
LeafClient : leafClient ,
467
459
RootClient : root ,
468
460
RootClientset : rootClientset ,
469
461
LeafClientset : leafClientset ,
470
462
}
471
463
} else {
472
- // support nodeSelector mode
473
- return & ClassificationModelHandler {
464
+ return & DispersionModelHandler {
474
465
Cluster : cluster ,
475
466
LeafClient : leafClient ,
476
467
RootClient : root ,
0 commit comments