Add Support for Component Priority Class Configuration in karmadactl addon

Signed-off-by: zhzhuang-zju <m17799853869@163.com>
This commit is contained in:
zhzhuang-zju 2025-02-19 10:46:34 +08:00
parent a8ea49c4b9
commit c1661cd33a
14 changed files with 94 additions and 60 deletions

View File

@ -60,9 +60,10 @@ var status = func(opts *addoninit.CommandAddonsListOption) (string, error) {
var enableDescheduler = func(opts *addoninit.CommandAddonsEnableOption) error {
// install karmada descheduler deployment on host cluster
karmadaDeschedulerDeploymentBytes, err := addonutils.ParseTemplate(karmadaDeschedulerDeployment, DeploymentReplace{
Namespace: opts.Namespace,
Replicas: &opts.KarmadaDeschedulerReplicas,
Image: addoninit.KarmadaDeschedulerImage(opts),
Namespace: opts.Namespace,
Replicas: &opts.KarmadaDeschedulerReplicas,
Image: addoninit.KarmadaDeschedulerImage(opts),
PriorityClassName: opts.KarmadaDeschedulerPriorityClass,
})
if err != nil {
return fmt.Errorf("error when parsing karmada descheduler deployment template :%v", err)

View File

@ -39,6 +39,7 @@ import (
func TestStatus(t *testing.T) {
name, namespace := names.KarmadaDeschedulerComponentName, "test"
var replicas int32 = 2
var priorityClass = "system-node-critical"
tests := []struct {
name string
listOpts *addoninit.CommandAddonsListOption
@ -80,7 +81,7 @@ func TestStatus(t *testing.T) {
},
},
prep: func(listOpts *addoninit.CommandAddonsListOption) error {
if err := createKarmadaDeschedulerDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace); err != nil {
if err := createKarmadaDeschedulerDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace, priorityClass); err != nil {
return fmt.Errorf("failed to create karmada descheduler deployment, got error: %v", err)
}
return addonutils.SimulateDeploymentUnready(listOpts.KubeClientSet, name, listOpts.Namespace)
@ -96,7 +97,7 @@ func TestStatus(t *testing.T) {
},
},
prep: func(listOpts *addoninit.CommandAddonsListOption) error {
if err := createKarmadaDeschedulerDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace); err != nil {
if err := createKarmadaDeschedulerDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace, priorityClass); err != nil {
return fmt.Errorf("failed to create karmada descheduler deployment, got error: %v", err)
}
return nil
@ -246,10 +247,11 @@ func TestDisableDescheduler(t *testing.T) {
// createKarmadaDeschedulerDeployment creates or updates a Deployment for the Karmada descheduler
// in the specified namespace with the provided number of replicas.
// It parses and decodes the template for the Deployment before applying it to the cluster.
func createKarmadaDeschedulerDeployment(c clientset.Interface, replicas int32, namespace string) error {
func createKarmadaDeschedulerDeployment(c clientset.Interface, replicas int32, namespace, priorityClass string) error {
karmadaDeschedulerDeploymentBytes, err := addonutils.ParseTemplate(karmadaDeschedulerDeployment, DeploymentReplace{
Namespace: namespace,
Replicas: ptr.To[int32](replicas),
Namespace: namespace,
Replicas: ptr.To[int32](replicas),
PriorityClassName: priorityClass,
})
if err != nil {
return fmt.Errorf("error when parsing karmada descheduler deployment template: %v", err)

View File

@ -38,6 +38,7 @@ spec:
- key: node-role.kubernetes.io/master
operator: Exists
automountServiceAccountToken: false
priorityClassName: {{ .PriorityClassName }}
containers:
- name: karmada-descheduler
image: {{ .Image }}
@ -83,7 +84,8 @@ spec:
// DeploymentReplace is a struct to help to concrete
// the karmada-descheduler deployment bytes with the deployment template
type DeploymentReplace struct {
Namespace string
Replicas *int32
Image string
Namespace string
Replicas *int32
Image string
PriorityClassName string
}

View File

@ -84,16 +84,28 @@ func NewCmdAddonsEnable(parentCommand string) *cobra.Command {
flags.StringVarP(&opts.ImageRegistry, "private-image-registry", "", "", "Private image registry where pull images from. If set, all required images will be downloaded from it, it would be useful in offline installation scenarios.")
flags.IntVar(&opts.WaitComponentReadyTimeout, "pod-timeout", options.WaitComponentReadyTimeout, "Wait pod ready timeout.")
flags.IntVar(&opts.WaitAPIServiceReadyTimeout, "apiservice-timeout", 30, "Wait apiservice ready timeout.")
flags.Int32Var(&opts.KarmadaSearchReplicas, "karmada-search-replicas", 1, "Karmada-search replica set")
flags.StringVar(&opts.KarmadaSearchImage, "karmada-search-image", addoninit.DefaultKarmadaSearchImage, "karmada-search image")
flags.Int32Var(&opts.KarmadaMetricsAdapterReplicas, "karmada-metrics-adapter-replicas", 1, "karmada-metrics-adapter replica set")
flags.StringVar(&opts.KarmadaMetricsAdapterImage, "karmada-metrics-adapter-image", addoninit.DefaultKarmadaMetricsAdapterImage, "karmada-metrics-adapter image")
flags.StringVar(&opts.KarmadaDeschedulerImage, "karmada-descheduler-image", addoninit.DefaultKarmadaDeschedulerImage, "karmada-descheduler image")
flags.Int32Var(&opts.KarmadaDeschedulerReplicas, "karmada-descheduler-replicas", 1, "karmada descheduler replica set")
flags.StringVar(&opts.KarmadaSchedulerEstimatorImage, "karmada-scheduler-estimator-image", addoninit.DefaultKarmadaSchedulerEstimatorImage, "karmada-scheduler-estimator image")
flags.Int32Var(&opts.KarmadaEstimatorReplicas, "karmada-estimator-replicas", 1, "karmada-scheduler-estimator replica set")
flags.StringVar(&opts.MemberKubeConfig, "member-kubeconfig", "", "Member cluster's kubeconfig which to deploy scheduler estimator")
flags.StringVar(&opts.MemberContext, "member-context", "", "Member cluster's context which to deploy scheduler estimator")
flags.StringVar(&opts.HostClusterDomain, "host-cluster-domain", globaloptions.DefaultHostClusterDomain, "The cluster domain of karmada host cluster. (e.g. --host-cluster-domain=host.karmada)")
// Karmada-descheduler config
flags.StringVar(&opts.KarmadaDeschedulerImage, "karmada-descheduler-image", addoninit.DefaultKarmadaDeschedulerImage, "karmada-descheduler image")
flags.Int32Var(&opts.KarmadaDeschedulerReplicas, "karmada-descheduler-replicas", 1, "karmada descheduler replica set")
flags.StringVar(&opts.KarmadaDeschedulerPriorityClass, "descheduler-priority-class", "system-node-critical", "The priority class name for the component karmada-descheduler.")
// Karmada-estimator config
flags.StringVar(&opts.KarmadaSchedulerEstimatorImage, "karmada-scheduler-estimator-image", addoninit.DefaultKarmadaSchedulerEstimatorImage, "karmada-scheduler-estimator image")
flags.Int32Var(&opts.KarmadaEstimatorReplicas, "karmada-estimator-replicas", 1, "karmada-scheduler-estimator replica set")
flags.StringVar(&opts.EstimatorPriorityClass, "estimator-priority-class", "system-node-critical", "The priority class name for the component karmada-scheduler-estimator.")
// Karmada-metrics-adapter config
flags.Int32Var(&opts.KarmadaMetricsAdapterReplicas, "karmada-metrics-adapter-replicas", 1, "karmada-metrics-adapter replica set")
flags.StringVar(&opts.KarmadaMetricsAdapterImage, "karmada-metrics-adapter-image", addoninit.DefaultKarmadaMetricsAdapterImage, "karmada-metrics-adapter image")
flags.StringVar(&opts.KarmadaMetricsAdapterPriorityClass, "metrics-adapter-priority-class", "system-node-critical", "The priority class name for the component karmada-metrics-adaptor.")
// Karmada-search config
flags.Int32Var(&opts.KarmadaSearchReplicas, "karmada-search-replicas", 1, "Karmada-search replica set")
flags.StringVar(&opts.KarmadaSearchImage, "karmada-search-image", addoninit.DefaultKarmadaSearchImage, "karmada-search image")
flags.StringVar(&opts.SearchPriorityClass, "search-priority-class", "system-node-critical", "The priority class name for the component karmada-search.")
return cmd
}

View File

@ -114,6 +114,7 @@ var enableEstimator = func(opts *addoninit.CommandAddonsEnableOption) error {
Replicas: &opts.KarmadaEstimatorReplicas,
Image: addoninit.KarmadaSchedulerEstimatorImage(opts),
MemberClusterName: opts.Cluster,
PriorityClassName: opts.EstimatorPriorityClass,
})
if err != nil {
return fmt.Errorf("error when parsing karmada scheduler estimator deployment template :%v", err)

View File

@ -40,6 +40,7 @@ spec:
- key: node-role.kubernetes.io/master
operator: Exists
automountServiceAccountToken: false
priorityClassName: {{ .PriorityClassName }}
containers:
- name: karmada-scheduler-estimator
image: {{ .Image }}
@ -108,6 +109,7 @@ type DeploymentReplace struct {
Replicas *int32
Image string
MemberClusterName string
PriorityClassName string
}
// ServiceReplace is a struct to help to concrete

View File

@ -36,21 +36,25 @@ import (
type CommandAddonsEnableOption struct {
GlobalCommandOptions
KarmadaSearchImage string
// Karmada-search config
KarmadaSearchImage string
KarmadaSearchReplicas int32
SearchPriorityClass string
KarmadaDeschedulerImage string
// Karmada-descheduler config
KarmadaDeschedulerImage string
KarmadaDeschedulerReplicas int32
KarmadaDeschedulerPriorityClass string
KarmadaDeschedulerReplicas int32
KarmadaMetricsAdapterImage string
KarmadaMetricsAdapterReplicas int32
// Karmada-metrics-adapter config
KarmadaMetricsAdapterImage string
KarmadaMetricsAdapterReplicas int32
KarmadaMetricsAdapterPriorityClass string
// Karmada-estimator config
KarmadaSchedulerEstimatorImage string
KarmadaEstimatorReplicas int32
KarmadaEstimatorReplicas int32
EstimatorPriorityClass string
KarmadaKubeClientSet *kubernetes.Clientset

View File

@ -33,7 +33,7 @@ type GlobalCommandOptions struct {
KubeConfig string
Context string
// KubeConfig holds karmada control plane KUBECONFIG file path.
// KarmadaConfig holds karmada control plane KUBECONFIG file path.
KarmadaConfig string
KarmadaContext string

View File

@ -39,6 +39,7 @@ spec:
apiserver: "true"
spec:
automountServiceAccountToken: false
priorityClassName: {{ .PriorityClassName }}
containers:
- name: karmada-metrics-adapter
image: {{ .Image }}
@ -141,9 +142,10 @@ spec:
// DeploymentReplace is a struct to help to concrete
// the karmada-metrics-adapter deployment bytes with the deployment template
type DeploymentReplace struct {
Namespace string
Replicas *int32
Image string
Namespace string
Replicas *int32
Image string
PriorityClassName string
}
// ServiceReplace is a struct to help to concrete

View File

@ -154,9 +154,10 @@ func installComponentsOnHostCluster(opts *addoninit.CommandAddonsEnableOption) e
// install karmada metrics adapter deployment on host clusters
karmadaMetricsAdapterDeploymentBytes, err := addonutils.ParseTemplate(karmadaMetricsAdapterDeployment, DeploymentReplace{
Namespace: opts.Namespace,
Replicas: &opts.KarmadaMetricsAdapterReplicas,
Image: addoninit.KarmadaMetricsAdapterImage(opts),
Namespace: opts.Namespace,
Replicas: &opts.KarmadaMetricsAdapterReplicas,
Image: addoninit.KarmadaMetricsAdapterImage(opts),
PriorityClassName: opts.KarmadaMetricsAdapterPriorityClass,
})
if err != nil {
return fmt.Errorf("error when parsing karmada metrics adapter deployment template :%v", err)

View File

@ -42,6 +42,7 @@ import (
func TestStatus(t *testing.T) {
name, namespace := names.KarmadaMetricsAdapterComponentName, "test"
var replicas int32 = 2
var priorityClassName = "system-node-critical"
tests := []struct {
name string
listOpts *addoninit.CommandAddonsListOption
@ -83,7 +84,7 @@ func TestStatus(t *testing.T) {
},
},
prep: func(listOpts *addoninit.CommandAddonsListOption) error {
if err := createKarmadaMetricsDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace); err != nil {
if err := createKarmadaMetricsDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace, priorityClassName); err != nil {
return fmt.Errorf("failed to create karmada metrics deployment, got error: %v", err)
}
return addonutils.SimulateDeploymentUnready(listOpts.KubeClientSet, name, listOpts.Namespace)
@ -100,7 +101,7 @@ func TestStatus(t *testing.T) {
},
},
prep: func(listOpts *addoninit.CommandAddonsListOption) error {
return createKarmadaMetricsDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace)
return createKarmadaMetricsDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace, priorityClassName)
},
wantStatus: addoninit.AddonDisabledStatus,
},
@ -114,7 +115,7 @@ func TestStatus(t *testing.T) {
},
},
prep: func(listOpts *addoninit.CommandAddonsListOption) error {
if err := createKarmadaMetricsDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace); err != nil {
if err := createKarmadaMetricsDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace, priorityClassName); err != nil {
return fmt.Errorf("failed to create karmada metrics deployment, got error: %v", err)
}
@ -136,7 +137,7 @@ func TestStatus(t *testing.T) {
},
},
prep: func(listOpts *addoninit.CommandAddonsListOption) error {
if err := createKarmadaMetricsDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace); err != nil {
if err := createKarmadaMetricsDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace, priorityClassName); err != nil {
return fmt.Errorf("failed to create karmada metrics deployment, got error: %v", err)
}
return createAndMarkAAAPIServicesAvailable(listOpts.KarmadaAggregatorClientSet)
@ -169,10 +170,11 @@ func TestStatus(t *testing.T) {
// createKarmadaMetricsDeployment creates or updates a Deployment for the Karmada metrics adapter
// in the specified namespace with the provided number of replicas.
// It parses and decodes the template for the Deployment before applying it to the cluster.
func createKarmadaMetricsDeployment(c clientset.Interface, replicas int32, namespace string) error {
func createKarmadaMetricsDeployment(c clientset.Interface, replicas int32, namespace, priorityClass string) error {
karmadaMetricsAdapterDeploymentBytes, err := addonutils.ParseTemplate(karmadaMetricsAdapterDeployment, DeploymentReplace{
Namespace: namespace,
Replicas: ptr.To[int32](replicas),
Namespace: namespace,
Replicas: ptr.To[int32](replicas),
PriorityClassName: priorityClass,
})
if err != nil {
return fmt.Errorf("error when parsing karmada metrics adapter deployment template :%v", err)

View File

@ -38,6 +38,7 @@ spec:
app: karmada-search
apiserver: "true"
spec:
priorityClassName: {{ .PriorityClassName }}
automountServiceAccountToken: false
containers:
- name: karmada-search
@ -138,11 +139,12 @@ spec:
// DeploymentReplace is a struct to help to concrete
// the karmada-search deployment bytes with the deployment template
type DeploymentReplace struct {
Namespace string
Replicas *int32
Image string
ETCDSevers string
KeyPrefix string
Namespace string
Replicas *int32
Image string
ETCDSevers string
KeyPrefix string
PriorityClassName string
}
// ServiceReplace is a struct to help to concrete

View File

@ -165,11 +165,12 @@ func installComponentsOnHostCluster(opts *addoninit.CommandAddonsEnableOption) e
// install karmada search deployment on host clusters
karmadaSearchDeploymentBytes, err := addonutils.ParseTemplate(karmadaSearchDeployment, DeploymentReplace{
Namespace: opts.Namespace,
Replicas: &opts.KarmadaSearchReplicas,
ETCDSevers: etcdServers,
KeyPrefix: keyPrefix,
Image: addoninit.KarmadaSearchImage(opts),
Namespace: opts.Namespace,
Replicas: &opts.KarmadaSearchReplicas,
ETCDSevers: etcdServers,
KeyPrefix: keyPrefix,
Image: addoninit.KarmadaSearchImage(opts),
PriorityClassName: opts.SearchPriorityClass,
})
if err != nil {
return fmt.Errorf("error when parsing karmada search deployment template :%v", err)

View File

@ -41,6 +41,7 @@ import (
func TestKarmadaSearchAddonStatus(t *testing.T) {
name, namespace := names.KarmadaSearchComponentName, "test"
var replicas int32 = 2
var priorityClass = "system-node-critical"
tests := []struct {
name string
listOpts *addoninit.CommandAddonsListOption
@ -82,7 +83,7 @@ func TestKarmadaSearchAddonStatus(t *testing.T) {
},
},
prep: func(listOpts *addoninit.CommandAddonsListOption) error {
if err := createKarmadaSearchDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace); err != nil {
if err := createKarmadaSearchDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace, priorityClass); err != nil {
return fmt.Errorf("failed to create karmada search deployment, got error: %v", err)
}
return addonutils.SimulateDeploymentUnready(listOpts.KubeClientSet, name, listOpts.Namespace)
@ -100,7 +101,7 @@ func TestKarmadaSearchAddonStatus(t *testing.T) {
},
},
prep: func(listOpts *addoninit.CommandAddonsListOption) error {
return createKarmadaSearchDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace)
return createKarmadaSearchDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace, priorityClass)
},
wantStatus: addoninit.AddonDisabledStatus,
},
@ -114,7 +115,7 @@ func TestKarmadaSearchAddonStatus(t *testing.T) {
},
},
prep: func(listOpts *addoninit.CommandAddonsListOption) error {
if err := createKarmadaSearchDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace); err != nil {
if err := createKarmadaSearchDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace, priorityClass); err != nil {
return fmt.Errorf("failed to create karmada search deployment, got error: %v", err)
}
@ -136,7 +137,7 @@ func TestKarmadaSearchAddonStatus(t *testing.T) {
},
},
prep: func(listOpts *addoninit.CommandAddonsListOption) error {
if err := createKarmadaSearchDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace); err != nil {
if err := createKarmadaSearchDeployment(listOpts.KubeClientSet, replicas, listOpts.Namespace, priorityClass); err != nil {
return fmt.Errorf("failed to create karmada search deployment, got error: %v", err)
}
return createAndMarkAAAPIServiceAvailable(listOpts.KarmadaAggregatorClientSet)
@ -169,10 +170,11 @@ func TestKarmadaSearchAddonStatus(t *testing.T) {
// createKarmadaSearchDeployment creates or updates a Deployment for the Karmada search deployment
// in the specified namespace with the provided number of replicas.
// It parses and decodes the template for the Deployment before applying it to the cluster.
func createKarmadaSearchDeployment(c clientset.Interface, replicas int32, namespace string) error {
func createKarmadaSearchDeployment(c clientset.Interface, replicas int32, namespace, priorityClass string) error {
karmadaSearchDeploymentBytes, err := addonutils.ParseTemplate(karmadaSearchDeployment, DeploymentReplace{
Namespace: namespace,
Replicas: ptr.To(replicas),
Namespace: namespace,
Replicas: ptr.To(replicas),
PriorityClassName: priorityClass,
})
if err != nil {
return fmt.Errorf("error when parsing karmada search deployment template :%v", err)