mirror of
https://github.com/hanzo-ml/kserve.git
synced 2026-10-30 20:53:49 +00:00
144 lines
4.5 KiB
Go
144 lines
4.5 KiB
Go
/*
|
|
Copyright 2024 The KServe Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package main
|
|
|
|
import (
|
|
"flag"
|
|
"os"
|
|
|
|
"k8s.io/client-go/kubernetes"
|
|
typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
|
|
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
|
|
"k8s.io/client-go/tools/record"
|
|
ctrl "sigs.k8s.io/controller-runtime"
|
|
"sigs.k8s.io/controller-runtime/pkg/client/config"
|
|
"sigs.k8s.io/controller-runtime/pkg/log/zap"
|
|
"sigs.k8s.io/controller-runtime/pkg/manager"
|
|
"sigs.k8s.io/controller-runtime/pkg/manager/signals"
|
|
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
|
|
"sigs.k8s.io/controller-runtime/pkg/webhook"
|
|
|
|
localmodelnodecontroller "github.com/kserve/kserve/pkg/controller/v1alpha1/localmodelnode"
|
|
kservescheme "github.com/kserve/kserve/pkg/scheme"
|
|
)
|
|
|
|
var setupLog = ctrl.Log.WithName("setup")
|
|
|
|
const (
|
|
LeaderLockName = "kserve-local-model-node-manager-leader-lock"
|
|
)
|
|
|
|
// Options defines the program configurable options that may be passed on the command line.
|
|
type Options struct {
|
|
metricsAddr string
|
|
webhookPort int
|
|
enableLeaderElection bool
|
|
probeAddr string
|
|
zapOpts zap.Options
|
|
}
|
|
|
|
// DefaultOptions returns the default values for the program options.
|
|
func DefaultOptions() Options {
|
|
return Options{
|
|
metricsAddr: ":8080",
|
|
webhookPort: 9443,
|
|
enableLeaderElection: false,
|
|
probeAddr: ":8081",
|
|
zapOpts: zap.Options{},
|
|
}
|
|
}
|
|
|
|
// GetOptions parses the program flags and returns them as Options.
|
|
func GetOptions() Options {
|
|
opts := DefaultOptions()
|
|
flag.BoolVar(&opts.enableLeaderElection, "leader-elect", opts.enableLeaderElection,
|
|
"Enable leader election for kserve controller manager. "+
|
|
"Enabling this will ensure there is only one active kserve controller manager.")
|
|
opts.zapOpts.BindFlags(flag.CommandLine)
|
|
flag.Parse()
|
|
return opts
|
|
}
|
|
|
|
func main() {
|
|
options := GetOptions()
|
|
ctrl.SetLogger(zap.New(zap.UseFlagOptions(&options.zapOpts)))
|
|
|
|
// Get a config to talk to the apiserver
|
|
setupLog.Info("Setting up client for manager")
|
|
cfg, err := config.GetConfig()
|
|
if err != nil {
|
|
setupLog.Error(err, "unable to set up client config")
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Setup clientset to directly talk to the api server
|
|
clientSet, err := kubernetes.NewForConfig(cfg)
|
|
if err != nil {
|
|
setupLog.Error(err, "unable to create clientSet")
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Create a new Cmd to provide shared dependencies and start components
|
|
setupLog.Info("Setting up manager")
|
|
mgr, err := manager.New(cfg, manager.Options{
|
|
Metrics: metricsserver.Options{
|
|
BindAddress: options.metricsAddr,
|
|
},
|
|
WebhookServer: webhook.NewServer(webhook.Options{
|
|
Port: options.webhookPort,
|
|
}),
|
|
LeaderElection: options.enableLeaderElection,
|
|
LeaderElectionID: LeaderLockName,
|
|
HealthProbeBindAddress: options.probeAddr,
|
|
})
|
|
if err != nil {
|
|
setupLog.Error(err, "unable to set up overall controller manager")
|
|
os.Exit(1)
|
|
}
|
|
|
|
setupLog.Info("Registering Components.")
|
|
|
|
setupLog.Info("Setting up controller schemes")
|
|
if err := kservescheme.AddControllerAPIs(mgr.GetScheme()); err != nil {
|
|
setupLog.Error(err, "unable to add controller APIs to scheme")
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Setup LocalModelNode controller
|
|
localModelNodeEventBroadcaster := record.NewBroadcaster()
|
|
setupLog.Info("Setting up v1alpha1 LocalModelNode controller")
|
|
localModelNodeEventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: clientSet.CoreV1().Events("")})
|
|
reconciler := &localmodelnodecontroller.LocalModelNodeReconciler{
|
|
Client: mgr.GetClient(),
|
|
Clientset: clientSet,
|
|
Log: ctrl.Log.WithName("v1alpha1Controllers").WithName("LocalModelNode"),
|
|
Scheme: mgr.GetScheme(),
|
|
}
|
|
|
|
if err = reconciler.SetupWithManager(mgr); err != nil {
|
|
setupLog.Error(err, "unable to create controller", "v1alpha1Controllers", "LocalModelNode")
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Start the Cmd
|
|
setupLog.Info("Starting the Cmd.")
|
|
if err := mgr.Start(signals.SetupSignalHandler()); err != nil {
|
|
setupLog.Error(err, "unable to run the manager")
|
|
os.Exit(1)
|
|
}
|
|
}
|