karmada operator: add karmada defaults
Signed-off-by: calvin <wen.chen@daocloud.io>
This commit is contained in:
parent
7f9dd0fd37
commit
0df9e6a5e9
|
@ -0,0 +1,208 @@
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
"k8s.io/utils/pointer"
|
||||||
|
|
||||||
|
"github.com/karmada-io/karmada/operator/pkg/constants"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
etcdImageRepository = fmt.Sprintf("%s/%s", constants.KubeDefaultRepository, constants.Etcd)
|
||||||
|
karmadaAPIServiceImageRepository = fmt.Sprintf("%s/%s", constants.KubeDefaultRepository, constants.KarmadaAPIServer)
|
||||||
|
karmadaAggregratedAPIServerImageRepository = fmt.Sprintf("%s/%s", constants.KarmadaDefaultRepository, constants.KarmadaAggregatedAPIServer)
|
||||||
|
kubeControllerManagerImageRepository = fmt.Sprintf("%s/%s", constants.KubeDefaultRepository, constants.KubeControllerManager)
|
||||||
|
karmadaControllerManagerImageRepository = fmt.Sprintf("%s/%s", constants.KarmadaDefaultRepository, constants.KarmadaControllerManager)
|
||||||
|
karmadaSchedulerImageRepository = fmt.Sprintf("%s/%s", constants.KarmadaDefaultRepository, constants.KarmadaScheduler)
|
||||||
|
karmadaWebhookImageRepository = fmt.Sprintf("%s/%s", constants.KarmadaDefaultRepository, constants.KarmadaWebhook)
|
||||||
|
)
|
||||||
|
|
||||||
|
func addDefaultingFuncs(scheme *runtime.Scheme) error {
|
||||||
|
return RegisterDefaults(scheme)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterDefaults adds defaulters functions to the given scheme.
|
||||||
|
// Public to allow building arbitrary schemes.
|
||||||
|
// All generated defaulters are covering - they call all nested defaulters.
|
||||||
|
func RegisterDefaults(scheme *runtime.Scheme) error {
|
||||||
|
scheme.AddTypeDefaultingFunc(&Karmada{}, func(obj interface{}) { SetObjectDefaultsKarmada(obj.(*Karmada)) })
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetObjectDefaultsKarmada set defaults for karmada
|
||||||
|
func SetObjectDefaultsKarmada(in *Karmada) {
|
||||||
|
setDefaultsKarmada(in)
|
||||||
|
}
|
||||||
|
|
||||||
|
func setDefaultsKarmada(obj *Karmada) {
|
||||||
|
setDefaultsHostCluster(obj)
|
||||||
|
setDefaultsKarmadaComponents(obj)
|
||||||
|
}
|
||||||
|
|
||||||
|
func setDefaultsKarmadaComponents(obj *Karmada) {
|
||||||
|
if obj.Spec.Components == nil {
|
||||||
|
obj.Spec.Components = &KarmadaComponents{}
|
||||||
|
}
|
||||||
|
|
||||||
|
setDefaultsEtcd(obj.Spec.Components)
|
||||||
|
setDefaultsKarmadaAPIServer(obj.Spec.Components)
|
||||||
|
setDefaultsKarmadaAggregratedAPIServer(obj.Spec.Components)
|
||||||
|
setDefaultsKubeControllerManager(obj.Spec.Components)
|
||||||
|
setDefaultsKarmadaControllerManager(obj.Spec.Components)
|
||||||
|
setDefaultsKarmadaScheduler(obj.Spec.Components)
|
||||||
|
setDefaultsKarmadaWebhook(obj.Spec.Components)
|
||||||
|
}
|
||||||
|
|
||||||
|
func setDefaultsHostCluster(obj *Karmada) {
|
||||||
|
if obj.Spec.HostCluster == nil {
|
||||||
|
obj.Spec.HostCluster = &HostCluster{}
|
||||||
|
}
|
||||||
|
|
||||||
|
hc := obj.Spec.HostCluster
|
||||||
|
if hc.Networking == nil {
|
||||||
|
hc.Networking = &Networking{}
|
||||||
|
}
|
||||||
|
if hc.Networking.DNSDomain == nil {
|
||||||
|
hc.Networking.DNSDomain = pointer.String(constants.KarmadaDefaultDNSDomain)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func setDefaultsEtcd(obj *KarmadaComponents) {
|
||||||
|
if obj.Etcd == nil {
|
||||||
|
obj.Etcd = &Etcd{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if obj.Etcd.External == nil {
|
||||||
|
if obj.Etcd.Local == nil {
|
||||||
|
obj.Etcd.Local = &LocalEtcd{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if obj.Etcd.Local.Replicas == nil {
|
||||||
|
obj.Etcd.Local.Replicas = pointer.Int32(1)
|
||||||
|
}
|
||||||
|
if len(obj.Etcd.Local.Image.ImageRepository) == 0 {
|
||||||
|
obj.Etcd.Local.Image.ImageRepository = etcdImageRepository
|
||||||
|
}
|
||||||
|
if len(obj.Etcd.Local.Image.ImageTag) == 0 {
|
||||||
|
obj.Etcd.Local.Image.ImageTag = constants.EtcdDefaultVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
if obj.Etcd.Local.VolumeData == nil {
|
||||||
|
obj.Etcd.Local.VolumeData = &VolumeData{}
|
||||||
|
}
|
||||||
|
if obj.Etcd.Local.VolumeData.EmptyDir == nil && obj.Etcd.Local.VolumeData.HostPath == nil && obj.Etcd.Local.VolumeData.VolumeClaim == nil {
|
||||||
|
obj.Etcd.Local.VolumeData.EmptyDir = &corev1.EmptyDirVolumeSource{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func setDefaultsKarmadaAPIServer(obj *KarmadaComponents) {
|
||||||
|
if obj.KarmadaAPIServer == nil {
|
||||||
|
obj.KarmadaAPIServer = &KarmadaAPIServer{}
|
||||||
|
}
|
||||||
|
|
||||||
|
apiserver := obj.KarmadaAPIServer
|
||||||
|
if len(apiserver.Image.ImageRepository) == 0 {
|
||||||
|
apiserver.Image.ImageRepository = karmadaAPIServiceImageRepository
|
||||||
|
}
|
||||||
|
if len(apiserver.Image.ImageTag) == 0 {
|
||||||
|
apiserver.Image.ImageTag = constants.KubeDefaultVersion
|
||||||
|
}
|
||||||
|
if apiserver.Replicas == nil {
|
||||||
|
apiserver.Replicas = pointer.Int32(1)
|
||||||
|
}
|
||||||
|
if apiserver.ServiceSubnet == nil {
|
||||||
|
apiserver.ServiceSubnet = pointer.String(constants.KarmadaDefaultServiceSubnet)
|
||||||
|
}
|
||||||
|
if len(apiserver.ServiceType) == 0 {
|
||||||
|
apiserver.ServiceType = corev1.ServiceTypeClusterIP
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func setDefaultsKarmadaAggregratedAPIServer(obj *KarmadaComponents) {
|
||||||
|
if obj.KarmadaAggregratedAPIServer == nil {
|
||||||
|
obj.KarmadaAggregratedAPIServer = &KarmadaAggregratedAPIServer{}
|
||||||
|
}
|
||||||
|
|
||||||
|
aggregrated := obj.KarmadaAggregratedAPIServer
|
||||||
|
if len(aggregrated.Image.ImageRepository) == 0 {
|
||||||
|
aggregrated.Image.ImageRepository = karmadaAggregratedAPIServerImageRepository
|
||||||
|
}
|
||||||
|
if len(aggregrated.Image.ImageTag) == 0 {
|
||||||
|
aggregrated.Image.ImageTag = constants.KarmadaDefaultVersion
|
||||||
|
}
|
||||||
|
if aggregrated.Replicas == nil {
|
||||||
|
aggregrated.Replicas = pointer.Int32(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func setDefaultsKubeControllerManager(obj *KarmadaComponents) {
|
||||||
|
if obj.KubeControllerManager == nil {
|
||||||
|
obj.KubeControllerManager = &KubeControllerManager{}
|
||||||
|
}
|
||||||
|
|
||||||
|
kubeControllerManager := obj.KubeControllerManager
|
||||||
|
if len(kubeControllerManager.Image.ImageRepository) == 0 {
|
||||||
|
kubeControllerManager.Image.ImageRepository = kubeControllerManagerImageRepository
|
||||||
|
}
|
||||||
|
if len(kubeControllerManager.Image.ImageTag) == 0 {
|
||||||
|
kubeControllerManager.Image.ImageTag = constants.KubeDefaultVersion
|
||||||
|
}
|
||||||
|
if kubeControllerManager.Replicas == nil {
|
||||||
|
kubeControllerManager.Replicas = pointer.Int32(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func setDefaultsKarmadaControllerManager(obj *KarmadaComponents) {
|
||||||
|
if obj.KarmadaControllerManager == nil {
|
||||||
|
obj.KarmadaControllerManager = &KarmadaControllerManager{}
|
||||||
|
}
|
||||||
|
|
||||||
|
karmadaControllerManager := obj.KarmadaControllerManager
|
||||||
|
if len(karmadaControllerManager.Image.ImageRepository) == 0 {
|
||||||
|
karmadaControllerManager.Image.ImageRepository = karmadaControllerManagerImageRepository
|
||||||
|
}
|
||||||
|
if len(karmadaControllerManager.Image.ImageTag) == 0 {
|
||||||
|
karmadaControllerManager.Image.ImageTag = constants.KarmadaDefaultVersion
|
||||||
|
}
|
||||||
|
if karmadaControllerManager.Replicas == nil {
|
||||||
|
karmadaControllerManager.Replicas = pointer.Int32(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func setDefaultsKarmadaScheduler(obj *KarmadaComponents) {
|
||||||
|
if obj.KarmadaScheduler == nil {
|
||||||
|
obj.KarmadaScheduler = &KarmadaScheduler{}
|
||||||
|
}
|
||||||
|
|
||||||
|
scheduler := obj.KarmadaScheduler
|
||||||
|
if len(scheduler.Image.ImageRepository) == 0 {
|
||||||
|
scheduler.Image.ImageRepository = karmadaSchedulerImageRepository
|
||||||
|
}
|
||||||
|
if len(scheduler.Image.ImageTag) == 0 {
|
||||||
|
scheduler.Image.ImageTag = constants.KarmadaDefaultVersion
|
||||||
|
}
|
||||||
|
if scheduler.Replicas == nil {
|
||||||
|
scheduler.Replicas = pointer.Int32(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func setDefaultsKarmadaWebhook(obj *KarmadaComponents) {
|
||||||
|
if obj.KarmadaWebhook == nil {
|
||||||
|
obj.KarmadaWebhook = &KarmadaWebhook{}
|
||||||
|
}
|
||||||
|
|
||||||
|
webhook := obj.KarmadaWebhook
|
||||||
|
if len(webhook.Image.ImageRepository) == 0 {
|
||||||
|
webhook.Image.ImageRepository = karmadaWebhookImageRepository
|
||||||
|
}
|
||||||
|
if len(webhook.Image.ImageTag) == 0 {
|
||||||
|
webhook.Image.ImageTag = constants.KarmadaDefaultVersion
|
||||||
|
}
|
||||||
|
if webhook.Replicas == nil {
|
||||||
|
webhook.Replicas = pointer.Int32(1)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
// +k8s:deepcopy-gen=package
|
// +k8s:deepcopy-gen=package
|
||||||
|
// +k8s:defaulter-gen=ObjectMeta
|
||||||
// +groupName=operator.karmada.io
|
// +groupName=operator.karmada.io
|
||||||
|
|
||||||
package v1alpha1
|
package v1alpha1
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
// Code generated by register-gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package v1alpha1
|
package v1alpha1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -24,19 +22,19 @@ func Resource(resource string) schema.GroupResource {
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes.
|
// SchemeBuilder will stay in k8s.io/kubernetes.
|
||||||
SchemeBuilder runtime.SchemeBuilder
|
SchemeBuilder runtime.SchemeBuilder
|
||||||
|
// localSchemeBuilder will stay in k8s.io/kubernetes.
|
||||||
localSchemeBuilder = &SchemeBuilder
|
localSchemeBuilder = &SchemeBuilder
|
||||||
// Depreciated: use Install instead
|
// AddToScheme applies all the stored functions to the scheme
|
||||||
AddToScheme = localSchemeBuilder.AddToScheme
|
AddToScheme = localSchemeBuilder.AddToScheme
|
||||||
Install = localSchemeBuilder.AddToScheme
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
// We only register manually written functions here. The registration of the
|
// We only register manually written functions here. The registration of the
|
||||||
// generated functions takes place in the generated files. The separation
|
// generated functions takes place in the generated files. The separation
|
||||||
// makes the code compile even when the generated files are missing.
|
// makes the code compile even when the generated files are missing.
|
||||||
localSchemeBuilder.Register(addKnownTypes)
|
localSchemeBuilder.Register(addKnownTypes, addDefaultingFuncs)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adds the list of known types to Scheme.
|
// Adds the list of known types to Scheme.
|
|
@ -17,6 +17,10 @@ const (
|
||||||
KarmadaDefaultVersion = "v1.4.0"
|
KarmadaDefaultVersion = "v1.4.0"
|
||||||
// KubeDefaultVersion defines the default of the karmada apiserver and kubeControllerManager image tag
|
// KubeDefaultVersion defines the default of the karmada apiserver and kubeControllerManager image tag
|
||||||
KubeDefaultVersion = "v1.25.2"
|
KubeDefaultVersion = "v1.25.2"
|
||||||
|
// KarmadaDefaultServiceSubnet defines the default of the subnet used by k8s services.
|
||||||
|
KarmadaDefaultServiceSubnet = "10.96.0.0/12"
|
||||||
|
// KarmadaDefaultDNSDomain defines the default of the DNSDomain
|
||||||
|
KarmadaDefaultDNSDomain = "cluster.local"
|
||||||
|
|
||||||
// KarmadaOperator defines the name of the karmada operator.
|
// KarmadaOperator defines the name of the karmada operator.
|
||||||
KarmadaOperator = "karmada-operator"
|
KarmadaOperator = "karmada-operator"
|
||||||
|
|
|
@ -2,6 +2,7 @@ package karmada
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"reflect"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
|
@ -13,6 +14,7 @@ import (
|
||||||
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
|
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
|
||||||
|
|
||||||
operatorv1alpha1 "github.com/karmada-io/karmada/operator/pkg/apis/operator/v1alpha1"
|
operatorv1alpha1 "github.com/karmada-io/karmada/operator/pkg/apis/operator/v1alpha1"
|
||||||
|
operatorscheme "github.com/karmada-io/karmada/operator/pkg/scheme"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -52,14 +54,8 @@ func (ctrl *Controller) Reconcile(ctx context.Context, req controllerruntime.Req
|
||||||
|
|
||||||
// examine DeletionTimestamp to determine if object is under deletion
|
// examine DeletionTimestamp to determine if object is under deletion
|
||||||
if karmada.DeletionTimestamp.IsZero() {
|
if karmada.DeletionTimestamp.IsZero() {
|
||||||
// The object is not being deleted, so if it does not have our finalizer,
|
if err := ctrl.ensureKarmada(ctx, karmada); err != nil {
|
||||||
// then lets add the finalizer and update the object. This is equivalent
|
return controllerruntime.Result{}, err
|
||||||
// registering our finalizer.
|
|
||||||
if !controllerutil.ContainsFinalizer(karmada, ControllerFinalizerName) {
|
|
||||||
controllerutil.AddFinalizer(karmada, ControllerFinalizerName)
|
|
||||||
if err := ctrl.Update(ctx, karmada); err != nil {
|
|
||||||
return controllerruntime.Result{}, err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,6 +88,25 @@ func (ctrl *Controller) removeFinalizer(ctx context.Context, karmada *operatorv1
|
||||||
return controllerruntime.Result{}, nil
|
return controllerruntime.Result{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ctrl *Controller) ensureKarmada(ctx context.Context, karmada *operatorv1alpha1.Karmada) error {
|
||||||
|
// The object is not being deleted, so if it does not have our finalizer,
|
||||||
|
// then lets add the finalizer and update the object. This is equivalent
|
||||||
|
// registering our finalizer.
|
||||||
|
updated := controllerutil.AddFinalizer(karmada, ControllerFinalizerName)
|
||||||
|
older := karmada.DeepCopy()
|
||||||
|
|
||||||
|
// Set the defaults for karmada
|
||||||
|
operatorscheme.Scheme.Default(karmada)
|
||||||
|
|
||||||
|
if updated || !reflect.DeepEqual(karmada.Spec, older.Spec) {
|
||||||
|
if err := ctrl.Update(ctx, karmada); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// SetupWithManager creates a controller and register to controller manager.
|
// SetupWithManager creates a controller and register to controller manager.
|
||||||
func (ctrl *Controller) SetupWithManager(mgr controllerruntime.Manager) error {
|
func (ctrl *Controller) SetupWithManager(mgr controllerruntime.Manager) error {
|
||||||
return controllerruntime.NewControllerManagedBy(mgr).For(&operatorv1alpha1.Karmada{}).Complete(ctrl)
|
return controllerruntime.NewControllerManagedBy(mgr).For(&operatorv1alpha1.Karmada{}).Complete(ctrl)
|
||||||
|
|
|
@ -6,16 +6,15 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
corev1 "k8s.io/api/core/v1"
|
|
||||||
utilversion "k8s.io/apimachinery/pkg/util/version"
|
utilversion "k8s.io/apimachinery/pkg/util/version"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/client-go/rest"
|
"k8s.io/client-go/rest"
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
"k8s.io/utils/pointer"
|
|
||||||
|
|
||||||
operatorv1alpha1 "github.com/karmada-io/karmada/operator/pkg/apis/operator/v1alpha1"
|
operatorv1alpha1 "github.com/karmada-io/karmada/operator/pkg/apis/operator/v1alpha1"
|
||||||
"github.com/karmada-io/karmada/operator/pkg/certs"
|
"github.com/karmada-io/karmada/operator/pkg/certs"
|
||||||
"github.com/karmada-io/karmada/operator/pkg/constants"
|
"github.com/karmada-io/karmada/operator/pkg/constants"
|
||||||
|
operatorscheme "github.com/karmada-io/karmada/operator/pkg/scheme"
|
||||||
tasks "github.com/karmada-io/karmada/operator/pkg/tasks/init"
|
tasks "github.com/karmada-io/karmada/operator/pkg/tasks/init"
|
||||||
workflow "github.com/karmada-io/karmada/operator/pkg/workflow"
|
workflow "github.com/karmada-io/karmada/operator/pkg/workflow"
|
||||||
)
|
)
|
||||||
|
@ -26,16 +25,13 @@ var (
|
||||||
|
|
||||||
// InitOptions defines all the init workflow options.
|
// InitOptions defines all the init workflow options.
|
||||||
type InitOptions struct {
|
type InitOptions struct {
|
||||||
Name string
|
Name string
|
||||||
Namespace string
|
Namespace string
|
||||||
Kubeconfig *rest.Config
|
Kubeconfig *rest.Config
|
||||||
KarmadaVersion string
|
KarmadaVersion string
|
||||||
CrdRemoteURL string
|
CrdRemoteURL string
|
||||||
KarmadaDataDir string
|
KarmadaDataDir string
|
||||||
PrivateRegistry string
|
Karmada *operatorv1alpha1.Karmada
|
||||||
HostCluster *operatorv1alpha1.HostCluster
|
|
||||||
Components *operatorv1alpha1.KarmadaComponents
|
|
||||||
FeatureGates map[string]bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// InitOpt defines a type of function to set InitOptions values.
|
// InitOpt defines a type of function to set InitOptions values.
|
||||||
|
@ -81,60 +77,70 @@ func NewInitJob(opt *InitOptions) *workflow.Job {
|
||||||
initJob.AppendTask(tasks.NewWaitControlPlaneTask())
|
initJob.AppendTask(tasks.NewWaitControlPlaneTask())
|
||||||
|
|
||||||
initJob.SetDataInitializer(func() (workflow.RunData, error) {
|
initJob.SetDataInitializer(func() (workflow.RunData, error) {
|
||||||
// if there is no endpoint info, we are consider that the local cluster
|
return newRunData(opt)
|
||||||
// is remote cluster to install karmada.
|
|
||||||
var remoteClient clientset.Interface
|
|
||||||
if opt.HostCluster.SecretRef == nil && len(opt.HostCluster.APIEndpoint) == 0 {
|
|
||||||
client, err := clientset.NewForConfig(opt.Kubeconfig)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("error when create cluster client to install karmada, err: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
remoteClient = client
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(opt.Name) == 0 || len(opt.Namespace) == 0 {
|
|
||||||
return nil, errors.New("unexpected empty name or namespace")
|
|
||||||
}
|
|
||||||
|
|
||||||
version, err := utilversion.ParseGeneric(opt.KarmadaVersion)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("unexpected karmada invalid version %s", opt.KarmadaVersion)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(opt.CrdRemoteURL) > 0 {
|
|
||||||
if _, err := url.Parse(opt.CrdRemoteURL); err != nil {
|
|
||||||
return nil, fmt.Errorf("unexpected invalid crds remote url %s", opt.CrdRemoteURL)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if opt.Components.Etcd.Local != nil && opt.Components.Etcd.Local.CommonSettings.Replicas != nil {
|
|
||||||
replicas := *opt.Components.Etcd.Local.CommonSettings.Replicas
|
|
||||||
if (replicas % 2) == 0 {
|
|
||||||
klog.Warningf("invalid etcd replicas %d, expected an odd number", replicas)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Verify whether important values of initData is valid
|
|
||||||
|
|
||||||
return &initData{
|
|
||||||
name: opt.Name,
|
|
||||||
namespace: opt.Namespace,
|
|
||||||
karmadaVersion: version,
|
|
||||||
remoteClient: remoteClient,
|
|
||||||
crdRemoteURL: opt.CrdRemoteURL,
|
|
||||||
karmadaDataDir: opt.KarmadaDataDir,
|
|
||||||
privateRegistry: opt.PrivateRegistry,
|
|
||||||
components: opt.Components,
|
|
||||||
featureGates: opt.FeatureGates,
|
|
||||||
dnsDomain: *opt.HostCluster.Networking.DNSDomain,
|
|
||||||
CertStore: certs.NewCertStore(),
|
|
||||||
}, nil
|
|
||||||
})
|
})
|
||||||
|
|
||||||
return initJob
|
return initJob
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newRunData(opt *InitOptions) (*initData, error) {
|
||||||
|
// if there is no endpoint info, we are consider that the local cluster
|
||||||
|
// is remote cluster to install karmada.
|
||||||
|
var remoteClient clientset.Interface
|
||||||
|
if opt.Karmada.Spec.HostCluster.SecretRef == nil && len(opt.Karmada.Spec.HostCluster.APIEndpoint) == 0 {
|
||||||
|
client, err := clientset.NewForConfig(opt.Kubeconfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("error when create cluster client to install karmada, err: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
remoteClient = client
|
||||||
|
}
|
||||||
|
|
||||||
|
var privateRegistry string
|
||||||
|
if opt.Karmada.Spec.PrivateRegistry != nil {
|
||||||
|
privateRegistry = opt.Karmada.Spec.PrivateRegistry.Registry
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(opt.Name) == 0 || len(opt.Namespace) == 0 {
|
||||||
|
return nil, errors.New("unexpected empty name or namespace")
|
||||||
|
}
|
||||||
|
|
||||||
|
version, err := utilversion.ParseGeneric(opt.KarmadaVersion)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("unexpected karmada invalid version %s", opt.KarmadaVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(opt.CrdRemoteURL) > 0 {
|
||||||
|
if _, err := url.Parse(opt.CrdRemoteURL); err != nil {
|
||||||
|
return nil, fmt.Errorf("unexpected invalid crds remote url %s", opt.CrdRemoteURL)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if opt.Karmada.Spec.Components.Etcd.Local != nil && opt.Karmada.Spec.Components.Etcd.Local.CommonSettings.Replicas != nil {
|
||||||
|
replicas := *opt.Karmada.Spec.Components.Etcd.Local.CommonSettings.Replicas
|
||||||
|
|
||||||
|
if (replicas % 2) == 0 {
|
||||||
|
klog.Warningf("invalid etcd replicas %d, expected an odd number", replicas)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Verify whether important values of initData is valid
|
||||||
|
|
||||||
|
return &initData{
|
||||||
|
name: opt.Name,
|
||||||
|
namespace: opt.Namespace,
|
||||||
|
karmadaVersion: version,
|
||||||
|
remoteClient: remoteClient,
|
||||||
|
crdRemoteURL: opt.CrdRemoteURL,
|
||||||
|
karmadaDataDir: opt.KarmadaDataDir,
|
||||||
|
privateRegistry: privateRegistry,
|
||||||
|
components: opt.Karmada.Spec.Components,
|
||||||
|
featureGates: opt.Karmada.Spec.FeatureGates,
|
||||||
|
dnsDomain: *opt.Karmada.Spec.HostCluster.Networking.DNSDomain,
|
||||||
|
CertStore: certs.NewCertStore(),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (data *initData) GetName() string {
|
func (data *initData) GetName() string {
|
||||||
return data.name
|
return data.name
|
||||||
}
|
}
|
||||||
|
@ -197,120 +203,25 @@ func NewJobInitOptions(opts ...InitOpt) *InitOptions {
|
||||||
}
|
}
|
||||||
|
|
||||||
func defaultJobInitOptions() *InitOptions {
|
func defaultJobInitOptions() *InitOptions {
|
||||||
|
karmada := &operatorv1alpha1.Karmada{}
|
||||||
|
|
||||||
|
// set defaults for karmada.
|
||||||
|
operatorscheme.Scheme.Default(karmada)
|
||||||
|
|
||||||
return &InitOptions{
|
return &InitOptions{
|
||||||
CrdRemoteURL: fmt.Sprintf(defaultCrdURL, constants.KarmadaDefaultVersion),
|
CrdRemoteURL: fmt.Sprintf(defaultCrdURL, constants.KarmadaDefaultVersion),
|
||||||
Name: "karmada",
|
|
||||||
Namespace: constants.KarmadaSystemNamespace,
|
|
||||||
KarmadaVersion: constants.KarmadaDefaultVersion,
|
KarmadaVersion: constants.KarmadaDefaultVersion,
|
||||||
KarmadaDataDir: constants.KarmadaDataDir,
|
KarmadaDataDir: constants.KarmadaDataDir,
|
||||||
Components: defaultComponents(),
|
Karmada: karmada,
|
||||||
HostCluster: defaultHostCluster(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func defaultHostCluster() *operatorv1alpha1.HostCluster {
|
|
||||||
return &operatorv1alpha1.HostCluster{
|
|
||||||
Networking: &operatorv1alpha1.Networking{
|
|
||||||
DNSDomain: pointer.String("cluster.local"),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func defaultComponents() *operatorv1alpha1.KarmadaComponents {
|
|
||||||
return &operatorv1alpha1.KarmadaComponents{
|
|
||||||
Etcd: &operatorv1alpha1.Etcd{
|
|
||||||
Local: &operatorv1alpha1.LocalEtcd{
|
|
||||||
CommonSettings: operatorv1alpha1.CommonSettings{
|
|
||||||
Image: operatorv1alpha1.Image{
|
|
||||||
ImageRepository: fmt.Sprintf("%s/%s", constants.KubeDefaultRepository, constants.Etcd),
|
|
||||||
ImageTag: constants.EtcdDefaultVersion,
|
|
||||||
},
|
|
||||||
Replicas: pointer.Int32(1),
|
|
||||||
},
|
|
||||||
|
|
||||||
VolumeData: &operatorv1alpha1.VolumeData{
|
|
||||||
EmptyDir: &corev1.EmptyDirVolumeSource{},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
KarmadaAPIServer: &operatorv1alpha1.KarmadaAPIServer{
|
|
||||||
CommonSettings: operatorv1alpha1.CommonSettings{
|
|
||||||
Replicas: pointer.Int32(1),
|
|
||||||
Image: operatorv1alpha1.Image{
|
|
||||||
ImageRepository: fmt.Sprintf("%s/%s", constants.KubeDefaultRepository, constants.KarmadaAPIServer),
|
|
||||||
ImageTag: constants.KubeDefaultVersion,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
ServiceSubnet: pointer.String("10.96.0.0/12"),
|
|
||||||
ServiceType: corev1.ServiceTypeClusterIP,
|
|
||||||
},
|
|
||||||
KarmadaAggregratedAPIServer: &operatorv1alpha1.KarmadaAggregratedAPIServer{
|
|
||||||
CommonSettings: operatorv1alpha1.CommonSettings{
|
|
||||||
Replicas: pointer.Int32(1),
|
|
||||||
Image: operatorv1alpha1.Image{
|
|
||||||
ImageRepository: fmt.Sprintf("%s/%s", constants.KarmadaDefaultRepository, constants.KarmadaAggregatedAPIServer),
|
|
||||||
ImageTag: constants.KarmadaDefaultVersion,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
KubeControllerManager: &operatorv1alpha1.KubeControllerManager{
|
|
||||||
CommonSettings: operatorv1alpha1.CommonSettings{
|
|
||||||
Replicas: pointer.Int32(1),
|
|
||||||
Image: operatorv1alpha1.Image{
|
|
||||||
ImageRepository: fmt.Sprintf("%s/%s", constants.KubeDefaultRepository, constants.KubeControllerManager),
|
|
||||||
ImageTag: constants.KubeDefaultVersion,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
KarmadaControllerManager: &operatorv1alpha1.KarmadaControllerManager{
|
|
||||||
CommonSettings: operatorv1alpha1.CommonSettings{
|
|
||||||
Replicas: pointer.Int32(1),
|
|
||||||
Image: operatorv1alpha1.Image{
|
|
||||||
ImageRepository: fmt.Sprintf("%s/%s", constants.KarmadaDefaultRepository, constants.KarmadaControllerManager),
|
|
||||||
ImageTag: constants.KarmadaDefaultVersion,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
KarmadaScheduler: &operatorv1alpha1.KarmadaScheduler{
|
|
||||||
CommonSettings: operatorv1alpha1.CommonSettings{
|
|
||||||
Replicas: pointer.Int32(1),
|
|
||||||
Image: operatorv1alpha1.Image{
|
|
||||||
ImageRepository: fmt.Sprintf("%s/%s", constants.KarmadaDefaultRepository, constants.KarmadaScheduler),
|
|
||||||
ImageTag: constants.KarmadaDefaultVersion,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
KarmadaWebhook: &operatorv1alpha1.KarmadaWebhook{
|
|
||||||
CommonSettings: operatorv1alpha1.CommonSettings{
|
|
||||||
Replicas: pointer.Int32(1),
|
|
||||||
Image: operatorv1alpha1.Image{
|
|
||||||
ImageRepository: fmt.Sprintf("%s/%s", constants.KarmadaDefaultRepository, constants.KarmadaWebhook),
|
|
||||||
ImageTag: constants.KarmadaDefaultVersion,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewInitOptWithKarmada returns a InitOpt function to initialize InitOptions with karmada resource
|
// NewInitOptWithKarmada returns a InitOpt function to initialize InitOptions with karmada resource
|
||||||
func NewInitOptWithKarmada(karmada *operatorv1alpha1.Karmada) InitOpt {
|
func NewInitOptWithKarmada(karmada *operatorv1alpha1.Karmada) InitOpt {
|
||||||
return func(opt *InitOptions) {
|
return func(opt *InitOptions) {
|
||||||
|
opt.Karmada = karmada
|
||||||
opt.Name = karmada.GetName()
|
opt.Name = karmada.GetName()
|
||||||
opt.Namespace = karmada.GetNamespace()
|
opt.Namespace = karmada.GetNamespace()
|
||||||
opt.FeatureGates = karmada.Spec.FeatureGates
|
|
||||||
|
|
||||||
if karmada.Spec.PrivateRegistry != nil && len(karmada.Spec.PrivateRegistry.Registry) > 0 {
|
|
||||||
opt.PrivateRegistry = karmada.Spec.PrivateRegistry.Registry
|
|
||||||
}
|
|
||||||
|
|
||||||
if karmada.Spec.Components != nil {
|
|
||||||
opt.Components = karmada.Spec.Components
|
|
||||||
}
|
|
||||||
|
|
||||||
if karmada.Spec.HostCluster != nil {
|
|
||||||
opt.HostCluster = karmada.Spec.HostCluster
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,6 @@ import (
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
kuberuntime "k8s.io/apimachinery/pkg/runtime"
|
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apimachinery/pkg/runtime/serializer"
|
"k8s.io/apimachinery/pkg/runtime/serializer"
|
||||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
|
@ -51,7 +50,7 @@ func aggregatedAPIService(client *aggregator.Clientset, name, namespace string)
|
||||||
}
|
}
|
||||||
|
|
||||||
apiService := &apiregistrationv1.APIService{}
|
apiService := &apiregistrationv1.APIService{}
|
||||||
if err := kuberuntime.DecodeInto(codecs.UniversalDecoder(), apiServiceBytes, apiService); err != nil {
|
if err := runtime.DecodeInto(codecs.UniversalDecoder(), apiServiceBytes, apiService); err != nil {
|
||||||
return fmt.Errorf("err when decoding AggregatedApiserver APIService: %w", err)
|
return fmt.Errorf("err when decoding AggregatedApiserver APIService: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,7 +73,7 @@ func aggregatedApiserverService(client clientset.Interface, name, namespace stri
|
||||||
}
|
}
|
||||||
|
|
||||||
aggregatedService := &corev1.Service{}
|
aggregatedService := &corev1.Service{}
|
||||||
if err := kuberuntime.DecodeInto(clientsetscheme.Codecs.UniversalDecoder(), aggregatedApiserverServiceBytes, aggregatedService); err != nil {
|
if err := runtime.DecodeInto(clientsetscheme.Codecs.UniversalDecoder(), aggregatedApiserverServiceBytes, aggregatedService); err != nil {
|
||||||
return fmt.Errorf("err when decoding AggregatedApiserver Service: %w", err)
|
return fmt.Errorf("err when decoding AggregatedApiserver Service: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue