@@ -21,6 +21,7 @@ import (
2121 "crypto/rand"
2222 "crypto/sha1"
2323 "encoding/base64"
24+ "fmt"
2425 "strconv"
2526 "strings"
2627
@@ -60,7 +61,6 @@ type RayClusterReconciler struct {
6061 routeClient * routev1client.RouteV1Client
6162 Scheme * runtime.Scheme
6263 CookieSalt string
63- IsOpenShift bool
6464}
6565
6666type IngressOptions struct {
@@ -87,6 +87,9 @@ const (
8787 strTrue = "true"
8888 strFalse = "false"
8989 logRequeueing = "requeueing"
90+ defaultIngressName = "ray-dashboard"
91+ defaultIngressPath = "/"
92+ defaultIngressPathType = networkingv1 .PathTypePrefix
9093)
9194
9295var (
@@ -117,7 +120,7 @@ func (r *RayClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request)
117120
118121 var cluster rayv1.RayCluster
119122
120- IsOpenShift := getClusterType (logger )
123+ IsOpenShift , ingressHost := getClusterType (logger , r . kubeClient , cluster . Name , cluster . Namespace )
121124
122125 if err := r .Get (ctx , req .NamespacedName , & cluster ); err != nil {
123126 if ! errors .IsNotFound (err ) {
@@ -236,7 +239,7 @@ func (r *RayClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request)
236239 logger .Info (string (cluster .Status .State ))
237240 // create an ingress
238241 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 })
240243 if err != nil {
241244 logger .Error (err , "Failed to update Ingress" )
242245 }
@@ -383,43 +386,6 @@ func (r *RayClusterReconciler) SetupWithManager(mgr ctrl.Manager) error {
383386 Complete (r )
384387}
385388
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-
423389func serviceNameFromCluster (cluster * rayv1.RayCluster ) string {
424390 return cluster .Name + "-head-svc"
425391}
@@ -439,9 +405,7 @@ func createRoute(cluster *rayv1.RayCluster) *routeapply.RouteApplyConfiguration
439405}
440406
441407// 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 {
445409 return networkingv1ac .Ingress (cluster .Name , cluster .Namespace ).
446410 WithLabels (map [string ]string {"ray.io/cluster-name" : cluster .Name }).
447411 WithOwnerReferences (v1 .OwnerReference ().
@@ -451,16 +415,16 @@ func createIngressApplyConfiguration(cluster *rayv1.RayCluster) *networkingv1ac.
451415 WithUID (types .UID (cluster .UID ))).
452416 WithSpec (networkingv1ac .IngressSpec ().
453417 WithRules (networkingv1ac .IngressRule ().
454- WithHost ("kind" ). // Specify the host name here
418+ WithHost (ingressHost ). // host name for specific cluster type
455419 WithHTTP (networkingv1ac .HTTPIngressRuleValue ().
456420 WithPaths (networkingv1ac .HTTPIngressPath ().
457- WithPath ("/" ). // Specify the path here
458- WithPathType (pt ).
421+ WithPath (defaultIngressPath ).
422+ WithPathType (defaultIngressPathType ).
459423 WithBackend (networkingv1ac .IngressBackend ().
460424 WithService (networkingv1ac .IngressServiceBackend ().
461425 WithName (serviceNameFromCluster (cluster )).
462426 WithPort (networkingv1ac .ServiceBackendPort ().
463- WithName (RegularServicePortName ), // Assuming RegularServicePortName is a string constant defining the port name
427+ WithName (RegularServicePortName ),
464428 ),
465429 ),
466430 ),
@@ -471,6 +435,63 @@ func createIngressApplyConfiguration(cluster *rayv1.RayCluster) *networkingv1ac.
471435 // Optionally, add TLS configuration here if needed
472436}
473437
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+
474495// Need to create route for Ray Client for local_interactive
475496// 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