diff --git a/pkg/application/inject/fuse/injector.go b/pkg/application/inject/fuse/injector.go index 66c40b4906c..c9719b187d2 100644 --- a/pkg/application/inject/fuse/injector.go +++ b/pkg/application/inject/fuse/injector.go @@ -24,6 +24,7 @@ import ( "github.com/fluid-cloudnative/fluid/pkg/common" "github.com/fluid-cloudnative/fluid/pkg/ddc/base" "github.com/fluid-cloudnative/fluid/pkg/utils" + "github.com/fluid-cloudnative/fluid/pkg/utils/discovery" "github.com/fluid-cloudnative/fluid/pkg/utils/applications/defaultapp" podapp "github.com/fluid-cloudnative/fluid/pkg/utils/applications/pod" @@ -44,10 +45,24 @@ type Injector struct { } func NewInjector(client client.Client) *Injector { + configured := common.GetSidecarInjectionMode() + + if configured == common.SidecarInjectionMode_Default { + cfg, err := ctrl.GetConfig() + if err != nil { + // Fall back to legacy if we can't get config + ctrl.Log.WithName("fuse-injector").Error(err, "Failed to get k8s config, falling back to legacy sidecar mode") + configured = common.SidecarInjectionMode_Legacy + } else if discovery.SupportsNativeSidecar(cfg) { + configured = common.SidecarInjectionMode_NativeSidecar + } else { + configured = common.SidecarInjectionMode_Legacy + } + } return &Injector{ client: client, log: ctrl.Log.WithName("fuse-injector"), - sidecarInjectionMode: common.GetSidecarInjectionMode(), + sidecarInjectionMode: configured, } } diff --git a/pkg/common/types.go b/pkg/common/types.go index 5ae0c0d9459..9f0c438e1e3 100644 --- a/pkg/common/types.go +++ b/pkg/common/types.go @@ -189,6 +189,9 @@ func GetSidecarInjectionMode() SidecarInjectionMode { return SidecarInjectionMode_Legacy case "native-sidecar": return SidecarInjectionMode_NativeSidecar + case "": + // Backward compatibility: old behavior + return SidecarInjectionMode_Default default: return SidecarInjectionMode_Default } diff --git a/pkg/utils/discovery/api_discover.go b/pkg/utils/discovery/api_discover.go index 8fc1bf35f51..833e1924dee 100644 --- a/pkg/utils/discovery/api_discover.go +++ b/pkg/utils/discovery/api_discover.go @@ -60,11 +60,22 @@ func initDiscovery() { } func discoverFluidResourcesInCluster() { - restConfig := ctrl.GetConfigOrDie() - var discoveryClient discovery.DiscoveryInterface = discovery.NewDiscoveryClientForConfigOrDie(restConfig) + restConfig,err := ctrl.GetConfig() + if err!=nil{ + nativeLog.Fatalf("failed to get kubernetes config: %v", err) + } + + if restConfig == nil { + nativeLog.Fatalf("kubernetes config is nil") + } + + discoveryClient, err := discovery.NewDiscoveryClientForConfig(restConfig) + if err != nil { + nativeLog.Fatalf("failed to create discovery client: %v", err) + } fluidGroupVersion := fmt.Sprintf("%s/%s", datav1alpha1.Group, datav1alpha1.Version) - err := retry.OnError(backOff, func(err error) bool { return true }, func() error { + err = retry.OnError(backOff, func(err error) bool { return true }, func() error { resources, discoverErr := discoveryClient.ServerResourcesForGroupVersion(fluidGroupVersion) if discoverErr != nil { return discoverErr diff --git a/pkg/utils/discovery/sidecar.go b/pkg/utils/discovery/sidecar.go new file mode 100644 index 00000000000..8c4ad9153be --- /dev/null +++ b/pkg/utils/discovery/sidecar.go @@ -0,0 +1,56 @@ +package discovery + +import ( + "log" + "strconv" + "strings" + + "k8s.io/client-go/discovery" + "k8s.io/client-go/rest" +) + +func SupportsNativeSidecarOrDefault(cfg *rest.Config, defaultValue bool) bool { + if cfg == nil { + return defaultValue + } + return SupportsNativeSidecar(cfg) +} + +func SupportsNativeSidecar(cfg *rest.Config) bool { + // Add nil check + if cfg == nil { + return false + } + + // fmt.Printf("SupportsNativeSidecar: cfg.Host = %q\n", cfg.Host) + dc, err := discovery.NewDiscoveryClientForConfig(cfg) + if err != nil { + log.Printf("Failed to create discovery client for native sidecar detection: %v", err) + return false + } + + info, err := dc.ServerVersion() + if err != nil { + return false + } + + majorStr := strings.TrimPrefix(info.Major, "v") + minorStr := strings.TrimSuffix(info.Minor, "+") + + major, err := strconv.Atoi(majorStr) + if err != nil { + return false + } + + minor, err := strconv.Atoi(minorStr) + if err != nil { + return false + } + + // native sidecar supported from k8s 1.29+ + if major > 1 { + return true + } + + return major == 1 && minor >= 29 +} \ No newline at end of file