diff --git a/pkg/karmadactl/addons/descheduler/descheduler.go b/pkg/karmadactl/addons/descheduler/descheduler.go index fd6375044..81aafe642 100644 --- a/pkg/karmadactl/addons/descheduler/descheduler.go +++ b/pkg/karmadactl/addons/descheduler/descheduler.go @@ -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) diff --git a/pkg/karmadactl/addons/descheduler/descheduler_test.go b/pkg/karmadactl/addons/descheduler/descheduler_test.go index e2e7884fb..bbd0bdf27 100644 --- a/pkg/karmadactl/addons/descheduler/descheduler_test.go +++ b/pkg/karmadactl/addons/descheduler/descheduler_test.go @@ -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) diff --git a/pkg/karmadactl/addons/descheduler/manifests.go b/pkg/karmadactl/addons/descheduler/manifests.go index 4560da0f3..b6f9b4e3f 100644 --- a/pkg/karmadactl/addons/descheduler/manifests.go +++ b/pkg/karmadactl/addons/descheduler/manifests.go @@ -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 } diff --git a/pkg/karmadactl/addons/enable.go b/pkg/karmadactl/addons/enable.go index 9f51de1c2..99dadb87a 100644 --- a/pkg/karmadactl/addons/enable.go +++ b/pkg/karmadactl/addons/enable.go @@ -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 } diff --git a/pkg/karmadactl/addons/estimator/estimator.go b/pkg/karmadactl/addons/estimator/estimator.go index 1e9402c53..0b4e47e43 100644 --- a/pkg/karmadactl/addons/estimator/estimator.go +++ b/pkg/karmadactl/addons/estimator/estimator.go @@ -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) diff --git a/pkg/karmadactl/addons/estimator/manifests.go b/pkg/karmadactl/addons/estimator/manifests.go index 1ee0e17f2..fc5c79fb3 100644 --- a/pkg/karmadactl/addons/estimator/manifests.go +++ b/pkg/karmadactl/addons/estimator/manifests.go @@ -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 diff --git a/pkg/karmadactl/addons/init/enable_option.go b/pkg/karmadactl/addons/init/enable_option.go index fb37dad17..40b3f2916 100644 --- a/pkg/karmadactl/addons/init/enable_option.go +++ b/pkg/karmadactl/addons/init/enable_option.go @@ -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 diff --git a/pkg/karmadactl/addons/init/global.go b/pkg/karmadactl/addons/init/global.go index a5107634c..80e760c21 100644 --- a/pkg/karmadactl/addons/init/global.go +++ b/pkg/karmadactl/addons/init/global.go @@ -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 diff --git a/pkg/karmadactl/addons/metricsadapter/manifests.go b/pkg/karmadactl/addons/metricsadapter/manifests.go index 05d424a96..72f0f4dcd 100644 --- a/pkg/karmadactl/addons/metricsadapter/manifests.go +++ b/pkg/karmadactl/addons/metricsadapter/manifests.go @@ -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 diff --git a/pkg/karmadactl/addons/metricsadapter/metricsadapter.go b/pkg/karmadactl/addons/metricsadapter/metricsadapter.go index 4c8f83301..b7710f261 100644 --- a/pkg/karmadactl/addons/metricsadapter/metricsadapter.go +++ b/pkg/karmadactl/addons/metricsadapter/metricsadapter.go @@ -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) diff --git a/pkg/karmadactl/addons/metricsadapter/metricsadapter_test.go b/pkg/karmadactl/addons/metricsadapter/metricsadapter_test.go index bd65f44ad..11deec9c6 100644 --- a/pkg/karmadactl/addons/metricsadapter/metricsadapter_test.go +++ b/pkg/karmadactl/addons/metricsadapter/metricsadapter_test.go @@ -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) diff --git a/pkg/karmadactl/addons/search/manifests.go b/pkg/karmadactl/addons/search/manifests.go index fa3ee5915..2c11f3d1d 100644 --- a/pkg/karmadactl/addons/search/manifests.go +++ b/pkg/karmadactl/addons/search/manifests.go @@ -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 diff --git a/pkg/karmadactl/addons/search/search.go b/pkg/karmadactl/addons/search/search.go index e95e30cc0..1a73b2f18 100644 --- a/pkg/karmadactl/addons/search/search.go +++ b/pkg/karmadactl/addons/search/search.go @@ -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) diff --git a/pkg/karmadactl/addons/search/search_test.go b/pkg/karmadactl/addons/search/search_test.go index fca1b0d29..876e06153 100644 --- a/pkg/karmadactl/addons/search/search_test.go +++ b/pkg/karmadactl/addons/search/search_test.go @@ -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)