@@ -21,6 +21,7 @@ import (
21
21
"crypto/rand"
22
22
"crypto/sha1"
23
23
"encoding/base64"
24
+ "fmt"
24
25
"strconv"
25
26
"strings"
26
27
@@ -60,7 +61,6 @@ type RayClusterReconciler struct {
60
61
routeClient * routev1client.RouteV1Client
61
62
Scheme * runtime.Scheme
62
63
CookieSalt string
63
- IsOpenShift bool
64
64
}
65
65
66
66
type IngressOptions struct {
@@ -87,6 +87,9 @@ const (
87
87
strTrue = "true"
88
88
strFalse = "false"
89
89
logRequeueing = "requeueing"
90
+ defaultIngressName = "ray-dashboard"
91
+ defaultIngressPath = "/"
92
+ defaultIngressPathType = networkingv1 .PathTypePrefix
90
93
)
91
94
92
95
var (
@@ -117,7 +120,7 @@ func (r *RayClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request)
117
120
118
121
var cluster rayv1.RayCluster
119
122
120
- IsOpenShift := getClusterType (logger )
123
+ IsOpenShift , ingressHost := getClusterType (logger , r . kubeClient , cluster . Name , cluster . Namespace )
121
124
122
125
if err := r .Get (ctx , req .NamespacedName , & cluster ); err != nil {
123
126
if ! errors .IsNotFound (err ) {
@@ -236,7 +239,7 @@ func (r *RayClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request)
236
239
logger .Info (string (cluster .Status .State ))
237
240
// create an ingress
238
241
logger .Info ("Creating Ingress" )
239
- _ , err := r .kubeClient .NetworkingV1 ().Ingresses (cluster .Namespace ).Apply (ctx , createIngressApplyConfiguration (& cluster ), metav1.ApplyOptions {FieldManager : controllerName , Force : true })
242
+ _ , err := r .kubeClient .NetworkingV1 ().Ingresses (cluster .Namespace ).Apply (ctx , createIngressApplyConfiguration (& cluster , ingressHost ), metav1.ApplyOptions {FieldManager : controllerName , Force : true })
240
243
if err != nil {
241
244
logger .Error (err , "Failed to update Ingress" )
242
245
}
@@ -383,43 +386,6 @@ func (r *RayClusterReconciler) SetupWithManager(mgr ctrl.Manager) error {
383
386
Complete (r )
384
387
}
385
388
386
- // getDiscoveryClient returns a discovery client for the current reconciler
387
- func getDiscoveryClient (config * rest.Config ) (* discovery.DiscoveryClient , error ) {
388
- return discovery .NewDiscoveryClientForConfig (config )
389
- }
390
-
391
- // Check where we are running. We are trying to distinguish here whether
392
- // this is vanilla kubernetes cluster or Openshift
393
- func getClusterType (logger logr.Logger ) bool {
394
- // The discovery package is used to discover APIs supported by a Kubernetes API server.
395
- config , err := ctrl .GetConfig ()
396
- if err == nil && config != nil {
397
- dclient , err := getDiscoveryClient (config )
398
- if err == nil && dclient != nil {
399
- apiGroupList , err := dclient .ServerGroups ()
400
- if err != nil {
401
- logger .Info ("Error while querying ServerGroups, assuming we're on Vanilla Kubernetes" )
402
- return false
403
- } else {
404
- for i := 0 ; i < len (apiGroupList .Groups ); i ++ {
405
- if strings .HasSuffix (apiGroupList .Groups [i ].Name , ".openshift.io" ) {
406
- logger .Info ("We detected being on OpenShift!" )
407
- return true
408
- }
409
- }
410
- logger .Info ("We detected being on Vanilla Kubernetes!" )
411
- return false
412
- }
413
- } else {
414
- logger .Info ("Cannot retrieve a DiscoveryClient, assuming we're on Vanilla Kubernetes" )
415
- return false
416
- }
417
- } else {
418
- logger .Info ("Cannot retrieve config, assuming we're on Vanilla Kubernetes" )
419
- return false
420
- }
421
- }
422
-
423
389
func serviceNameFromCluster (cluster * rayv1.RayCluster ) string {
424
390
return cluster .Name + "-head-svc"
425
391
}
@@ -439,9 +405,7 @@ func createRoute(cluster *rayv1.RayCluster) *routeapply.RouteApplyConfiguration
439
405
}
440
406
441
407
// Create an Ingress object for the RayCluster
442
- func createIngressApplyConfiguration (cluster * rayv1.RayCluster ) * networkingv1ac.IngressApplyConfiguration {
443
- pt := networkingv1 .PathTypeImplementationSpecific
444
-
408
+ func createIngressApplyConfiguration (cluster * rayv1.RayCluster , ingressHost string ) * networkingv1ac.IngressApplyConfiguration {
445
409
return networkingv1ac .Ingress (cluster .Name , cluster .Namespace ).
446
410
WithLabels (map [string ]string {"ray.io/cluster-name" : cluster .Name }).
447
411
WithOwnerReferences (v1 .OwnerReference ().
@@ -451,16 +415,16 @@ func createIngressApplyConfiguration(cluster *rayv1.RayCluster) *networkingv1ac.
451
415
WithUID (types .UID (cluster .UID ))).
452
416
WithSpec (networkingv1ac .IngressSpec ().
453
417
WithRules (networkingv1ac .IngressRule ().
454
- WithHost ("kind" ). // Specify the host name here
418
+ WithHost (ingressHost ). // host name for specific cluster type
455
419
WithHTTP (networkingv1ac .HTTPIngressRuleValue ().
456
420
WithPaths (networkingv1ac .HTTPIngressPath ().
457
- WithPath ("/" ). // Specify the path here
458
- WithPathType (pt ).
421
+ WithPath (defaultIngressPath ).
422
+ WithPathType (defaultIngressPathType ).
459
423
WithBackend (networkingv1ac .IngressBackend ().
460
424
WithService (networkingv1ac .IngressServiceBackend ().
461
425
WithName (serviceNameFromCluster (cluster )).
462
426
WithPort (networkingv1ac .ServiceBackendPort ().
463
- WithName (RegularServicePortName ), // Assuming RegularServicePortName is a string constant defining the port name
427
+ WithName (RegularServicePortName ),
464
428
),
465
429
),
466
430
),
@@ -471,6 +435,63 @@ func createIngressApplyConfiguration(cluster *rayv1.RayCluster) *networkingv1ac.
471
435
// Optionally, add TLS configuration here if needed
472
436
}
473
437
438
+ // isOnKindCluster checks if the current cluster is a KinD cluster.
439
+ // It searches for a node with a label commonly used by KinD clusters.
440
+ func isOnKindCluster (clientset * kubernetes.Clientset ) (bool , error ) {
441
+ nodes , err := clientset .CoreV1 ().Nodes ().List (context .TODO (), metav1.ListOptions {
442
+ LabelSelector : "kubernetes.io/hostname=kind-control-plane" ,
443
+ })
444
+ if err != nil {
445
+ return false , err
446
+ }
447
+ // If we find one or more nodes with the label, assume it's a KinD cluster.
448
+ return len (nodes .Items ) > 0 , nil
449
+ }
450
+
451
+ // getDiscoveryClient returns a discovery client for the current reconciler
452
+ func getDiscoveryClient (config * rest.Config ) (* discovery.DiscoveryClient , error ) {
453
+ return discovery .NewDiscoveryClientForConfig (config )
454
+ }
455
+
456
+ // Check where we are running. We are trying to distinguish here whether
457
+ // this is vanilla kubernetes cluster or Openshift
458
+ func getClusterType (logger logr.Logger , clientset * kubernetes.Clientset , clusterName string , namespace string ) (bool , string ) {
459
+ // The discovery package is used to discover APIs supported by a Kubernetes API server.
460
+ ingress_domain := "local" //TEMP until label is available
461
+ config , err := ctrl .GetConfig ()
462
+ if err == nil && config != nil {
463
+ dclient , err := getDiscoveryClient (config )
464
+ if err == nil && dclient != nil {
465
+ apiGroupList , err := dclient .ServerGroups ()
466
+ if err != nil {
467
+ logger .Info ("Error while querying ServerGroups, assuming we're on Vanilla Kubernetes" )
468
+ return false , ""
469
+ } else {
470
+ for i := 0 ; i < len (apiGroupList .Groups ); i ++ {
471
+ if strings .HasSuffix (apiGroupList .Groups [i ].Name , ".openshift.io" ) {
472
+ logger .Info ("We detected being on OpenShift!" )
473
+ return true , ""
474
+ }
475
+ }
476
+ onKind , _ := isOnKindCluster (clientset )
477
+ if onKind && ingress_domain == "" { //TEMP until label is available
478
+ logger .Info ("We detected being on a KinD cluster!" )
479
+ return false , "kind"
480
+ }
481
+ // else if onKinD and ingress_domain is not none, use ingress_domain, else use ingress-domain
482
+ logger .Info ("We detected being on Vanilla Kubernetes!" )
483
+ return false , fmt .Sprintf ("ray-dashboard-%s-%s.local" , clusterName , namespace ) //temp it would be .{ingress-domain}
484
+ }
485
+ } else {
486
+ logger .Info ("Cannot retrieve a DiscoveryClient, assuming we're on Vanilla Kubernetes" )
487
+ return false , "ingress-domain-here" //TEMP until label is available
488
+ }
489
+ } else {
490
+ logger .Info ("Cannot retrieve config, assuming we're on Vanilla Kubernetes" )
491
+ return false , "ingress-domain-here" //TEMP until label is available
492
+ }
493
+ }
494
+
474
495
// Need to create route for Ray Client for local_interactive
475
496
// No more ingress_options - Removing completely.
476
- // What to do about ingress_domain?
497
+ // What to do about ingress_domain? Needed for local_interactive?
0 commit comments