Skip to content

Commit f415ce9

Browse files
Add default values for ingress, add isOnKindCluster(), setting adaptable ingressHost
1 parent a47d660 commit f415ce9

File tree

1 file changed

+69
-48
lines changed

1 file changed

+69
-48
lines changed

controllers/raycluster_controller.go

Lines changed: 69 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -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

6666
type 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

9295
var (
@@ -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-
423389
func 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

Comments
 (0)