From 4538032aa7752b381dbf7509042420fcea019c6f Mon Sep 17 00:00:00 2001 From: Jayapriya Pai Date: Thu, 27 Jul 2023 19:50:34 +0530 Subject: [PATCH] pkg/manifests: Deploy metrics-server through operator Signed-off-by: Jayapriya Pai --- Documentation/api.md | 20 ++ Documentation/openshiftdocs/index.adoc | 1 + .../clustermonitoringconfiguration.adoc | 2 + .../modules/metricsserverconfig.adoc | 31 ++ hack/build-jsonnet.sh | 2 +- manifests/image-references | 4 + pkg/manifests/config.go | 7 + pkg/manifests/manifests.go | 81 +++++ pkg/manifests/types.go | 14 + pkg/operator/operator.go | 1 + pkg/tasks/metricsserver.go | 285 ++++++++++++++++++ pkg/tasks/prometheusadapter.go | 10 + 12 files changed, 457 insertions(+), 1 deletion(-) create mode 100644 Documentation/openshiftdocs/modules/metricsserverconfig.adoc create mode 100644 pkg/tasks/metricsserver.go diff --git a/Documentation/api.md b/Documentation/api.md index e6fc8dada1..0a9eaf7d75 100644 --- a/Documentation/api.md +++ b/Documentation/api.md @@ -25,6 +25,7 @@ Configuring Cluster Monitoring is optional. If the config does not exist or is e * [DedicatedServiceMonitors](#dedicatedservicemonitors) * [K8sPrometheusAdapter](#k8sprometheusadapter) * [KubeStateMetricsConfig](#kubestatemetricsconfig) +* [MetricsServerConfig](#metricsserverconfig) * [MonitoringPluginConfig](#monitoringpluginconfig) * [NodeExporterCollectorBuddyInfoConfig](#nodeexportercollectorbuddyinfoconfig) * [NodeExporterCollectorConfig](#nodeexportercollectorconfig) @@ -128,6 +129,7 @@ The `ClusterMonitoringConfiguration` resource defines settings that customize th | alertmanagerMain | *[AlertmanagerMainConfig](#alertmanagermainconfig) | `AlertmanagerMainConfig` defines settings for the Alertmanager component in the `openshift-monitoring` namespace. | | enableUserWorkload | *bool | `UserWorkloadEnabled` is a Boolean flag that enables monitoring for user-defined projects. | | k8sPrometheusAdapter | *[K8sPrometheusAdapter](#k8sprometheusadapter) | `K8sPrometheusAdapter` defines settings for the Prometheus Adapter component. | +| metricsServer | *[MetricsServerConfig](#metricsserverconfig) | `MetricsServer` defines settings for the MetricsServer component. | | kubeStateMetrics | *[KubeStateMetricsConfig](#kubestatemetricsconfig) | `KubeStateMetricsConfig` defines settings for the `kube-state-metrics` agent. | | prometheusK8s | *[PrometheusK8sConfig](#prometheusk8sconfig) | `PrometheusK8sConfig` defines settings for the Prometheus component. | | prometheusOperator | *[PrometheusOperatorConfig](#prometheusoperatorconfig) | `PrometheusOperatorConfig` defines settings for the Prometheus Operator component. | @@ -190,6 +192,24 @@ The `KubeStateMetricsConfig` resource defines settings for the `kube-state-metri [Back to TOC](#table-of-contents) +## MetricsServerConfig + +#### Description + +The `MetricsServerConfig` resource defines settings for the MetricsServer component. + + +appears in: [ClusterMonitoringConfiguration](#clustermonitoringconfiguration) + +| Property | Type | Description | +| -------- | ---- | ----------- | +| enabled | *bool | `Enabled` is a Boolean flag that enables or disables metrics-server. | +| nodeSelector | map[string]string | Defines the nodes on which the pods are scheduled. | +| tolerations | [][v1.Toleration](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.27/#toleration-v1-core) | Defines tolerations for the pods. | +| resources | *[v1.ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.27/#resourcerequirements-v1-core) | Defines resource requests and limits for the Metrics Server container. | + +[Back to TOC](#table-of-contents) + ## MonitoringPluginConfig #### Description diff --git a/Documentation/openshiftdocs/index.adoc b/Documentation/openshiftdocs/index.adoc index 685bd1d44c..89fbc7b73d 100644 --- a/Documentation/openshiftdocs/index.adoc +++ b/Documentation/openshiftdocs/index.adoc @@ -45,6 +45,7 @@ The configuration file itself is always defined under the `config.yaml` key in t * link:modules/dedicatedservicemonitors.adoc[DedicatedServiceMonitors] * link:modules/k8sprometheusadapter.adoc[K8sPrometheusAdapter] * link:modules/kubestatemetricsconfig.adoc[KubeStateMetricsConfig] +* link:modules/metricsserverconfig.adoc[MetricsServerConfig] * link:modules/monitoringpluginconfig.adoc[MonitoringPluginConfig] * link:modules/nodeexportercollectorbuddyinfoconfig.adoc[NodeExporterCollectorBuddyInfoConfig] * link:modules/nodeexportercollectorconfig.adoc[NodeExporterCollectorConfig] diff --git a/Documentation/openshiftdocs/modules/clustermonitoringconfiguration.adoc b/Documentation/openshiftdocs/modules/clustermonitoringconfiguration.adoc index 3b858af873..fdcc449da1 100644 --- a/Documentation/openshiftdocs/modules/clustermonitoringconfiguration.adoc +++ b/Documentation/openshiftdocs/modules/clustermonitoringconfiguration.adoc @@ -21,6 +21,8 @@ The `ClusterMonitoringConfiguration` resource defines settings that customize th |k8sPrometheusAdapter|*link:k8sprometheusadapter.adoc[K8sPrometheusAdapter]|`K8sPrometheusAdapter` defines settings for the Prometheus Adapter component. +|metricsServer|*link:metricsserverconfig.adoc[MetricsServerConfig]|`MetricsServer` defines settings for the MetricsServer component. + |kubeStateMetrics|*link:kubestatemetricsconfig.adoc[KubeStateMetricsConfig]|`KubeStateMetricsConfig` defines settings for the `kube-state-metrics` agent. |prometheusK8s|*link:prometheusk8sconfig.adoc[PrometheusK8sConfig]|`PrometheusK8sConfig` defines settings for the Prometheus component. diff --git a/Documentation/openshiftdocs/modules/metricsserverconfig.adoc b/Documentation/openshiftdocs/modules/metricsserverconfig.adoc new file mode 100644 index 0000000000..76797cd1b8 --- /dev/null +++ b/Documentation/openshiftdocs/modules/metricsserverconfig.adoc @@ -0,0 +1,31 @@ +// DO NOT EDIT THE CONTENT IN THIS FILE. It is automatically generated from the + // source code for the Cluster Monitoring Operator. Any changes made to this + // file will be overwritten when the content is re-generated. If you wish to + // make edits, read the docgen utility instructions in the source code for the + // CMO. + :_content-type: ASSEMBLY + +== MetricsServerConfig + +=== Description + +The `MetricsServerConfig` resource defines settings for the MetricsServer component. + + + +Appears in: link:clustermonitoringconfiguration.adoc[ClusterMonitoringConfiguration] + +[options="header"] +|=== +| Property | Type | Description +|enabled|*bool|`Enabled` is a Boolean flag that enables or disables metrics-server. + +|nodeSelector|map[string]string|Defines the nodes on which the pods are scheduled. + +|tolerations|[]v1.Toleration|Defines tolerations for the pods. + +|resources|*v1.ResourceRequirements|Defines resource requests and limits for the Metrics Server container. + +|=== + +link:../index.adoc[Back to TOC] diff --git a/hack/build-jsonnet.sh b/hack/build-jsonnet.sh index e266d7d7a8..79689a8d55 100755 --- a/hack/build-jsonnet.sh +++ b/hack/build-jsonnet.sh @@ -37,7 +37,7 @@ for file in "${files[@]}"; do }& # wait for at least one of the jobs to finish if there are more than maxProc jobs - while [[ $(jobs -r | wc -l ) -ge "$maxProc" ]]; do wait -n; done + while [[ $(jobs -r | wc -l ) -ge "$maxProc" ]]; do wait; done done # wait for all jobs to finish wait diff --git a/manifests/image-references b/manifests/image-references index edfbe97356..0612b3819e 100644 --- a/manifests/image-references +++ b/manifests/image-references @@ -70,3 +70,7 @@ spec: from: kind: DockerImage name: quay.io/openshift/origin-monitoring-plugin:latest + - name: kube-metrics-server + from: + kind: DockerImage + name: quay.io/openshift/origin-kube-metrics-server:latest diff --git a/pkg/manifests/config.go b/pkg/manifests/config.go index 1bb39fa7a2..ee2725edb7 100644 --- a/pkg/manifests/config.go +++ b/pkg/manifests/config.go @@ -128,6 +128,7 @@ func (c Config) GetThanosRulerAlertmanagerConfigs() []AdditionalAlertmanagerConf type Images struct { K8sPrometheusAdapter string + MetricsServer string PromLabelProxy string PrometheusOperatorAdmissionWebhook string PrometheusOperator string @@ -208,6 +209,10 @@ func NewConfig(content io.Reader, tp bool) (*Config, error) { return nil, errors.Wrap(ErrConfigValidation, "collectionProfiles is a TechPreview feature, to be able to use a profile different from the default (\"full\") please enable TechPreview") } + if c.ClusterMonitoringConfiguration.MetricsServerConfig != nil && !tp { + return nil, errors.Wrap(ErrConfigValidation, "Metrics Server is a TechPreview feature, to be able to deploy it please enable TechPreview") + } + // Validate the configured collection profile iff tech preview is enabled, even if the default profile is set. if tp { for _, profile := range SupportedCollectionProfiles { @@ -345,6 +350,8 @@ func (c *Config) SetImages(images map[string]string) { c.Images.TelemeterClient = images["telemeter-client"] c.Images.PromLabelProxy = images["prom-label-proxy"] c.Images.K8sPrometheusAdapter = images["k8s-prometheus-adapter"] + c.Images.MetricsServer = images["kube-metrics-server"] + // c.Images.MetricsServer = "registry.k8s.io/metrics-server/metrics-server:v0.6.4" c.Images.OpenShiftStateMetrics = images["openshift-state-metrics"] c.Images.Thanos = images["thanos"] c.Images.MonitoringPlugin = images["monitoring-plugin"] diff --git a/pkg/manifests/manifests.go b/pkg/manifests/manifests.go index 1ca302aa69..3b5551de6f 100644 --- a/pkg/manifests/manifests.go +++ b/pkg/manifests/manifests.go @@ -197,6 +197,18 @@ var ( PrometheusAdapterMinimalServiceMonitor = "prometheus-adapter/minimal-service-monitor.yaml" PrometheusAdapterServiceAccount = "prometheus-adapter/service-account.yaml" + MetricsServerAPIService = "metrics-server/api-service.yaml" + MetricsServerServiceAccount = "metrics-server/service-account.yaml" + MetricsServerClusterRole = "metrics-server/cluster-role.yaml" + MetricsServerClusterRoleBinding = "metrics-server/cluster-role-binding.yaml" + MetricsServerClusterRoleAggregatedMetricsReader = "metrics-server/cluster-role-aggregated-metrics-reader.yaml" + MetricsServerClusterRoleBindingAuthDelegator = "metrics-server/cluster-role-binding-auth-delegator.yaml" + MetricsServerRoleBindingAuthReader = "metrics-server/role-binding-auth-reader.yaml" + MetricsServerDeployment = "metrics-server/deployment.yaml" + MetricsServerService = "metrics-server/service.yaml" + MetricsServerServiceMonitor = "metrics-server/service-monitor.yaml" + MetricsServerPodDisruptionBudget = "metrics-server/pod-disruption-budget.yaml" + AdmissionWebhookRuleValidatingWebhook = "admission-webhook/prometheus-rule-validating-webhook.yaml" AdmissionWebhookAlertmanagerConfigValidatingWebhook = "admission-webhook/alertmanager-config-validating-webhook.yaml" AdmissionWebhookDeployment = "admission-webhook/deployment.yaml" @@ -2079,6 +2091,75 @@ func (f *Factory) PrometheusAdapterAPIService() (*apiregistrationv1.APIService, return f.NewAPIService(f.assets.MustNewAssetReader(PrometheusAdapterAPIService)) } +func (f *Factory) MetricsServerServiceAccount() (*v1.ServiceAccount, error) { + return f.NewServiceAccount(f.assets.MustNewAssetReader(MetricsServerServiceAccount)) +} + +func (f *Factory) MetricsServerClusterRole() (*rbacv1.ClusterRole, error) { + return f.NewClusterRole(f.assets.MustNewAssetReader(MetricsServerClusterRole)) +} + +func (f *Factory) MetricsServerClusterRoleBinding() (*rbacv1.ClusterRoleBinding, error) { + return f.NewClusterRoleBinding(f.assets.MustNewAssetReader(MetricsServerClusterRoleBinding)) +} + +func (f *Factory) MetricsServerClusterRoleAggregatedMetricsReader() (*rbacv1.ClusterRole, error) { + return f.NewClusterRole(f.assets.MustNewAssetReader(MetricsServerClusterRoleAggregatedMetricsReader)) +} + +func (f *Factory) MetricsServerClusterRoleBindingAuthDelegator() (*rbacv1.ClusterRoleBinding, error) { + return f.NewClusterRoleBinding(f.assets.MustNewAssetReader(MetricsServerClusterRoleBindingAuthDelegator)) +} + +func (f *Factory) MetricsServerRoleBindingAuthReader() (*rbacv1.RoleBinding, error) { + return f.NewRoleBinding(f.assets.MustNewAssetReader(MetricsServerRoleBindingAuthReader)) +} + +func (f *Factory) MetricsServerDeployment() (*appsv1.Deployment, error) { + d, err := f.NewDeployment(f.assets.MustNewAssetReader(MetricsServerDeployment)) + if err != nil { + return nil, err + } + for i, container := range d.Spec.Template.Spec.Containers { + switch container.Name { + case "metrics-server": + d.Spec.Template.Spec.Containers[i].Image = f.config.Images.MetricsServer + + if f.config.ClusterMonitoringConfiguration.MetricsServerConfig != nil { + if f.config.ClusterMonitoringConfiguration.MetricsServerConfig.Resources != nil { + d.Spec.Template.Spec.Containers[i].Resources = *f.config.ClusterMonitoringConfiguration.MetricsServerConfig.Resources + } + + if f.config.ClusterMonitoringConfiguration.MetricsServerConfig.NodeSelector != nil { + d.Spec.Template.Spec.NodeSelector = f.config.ClusterMonitoringConfiguration.MetricsServerConfig.NodeSelector + } + + if f.config.ClusterMonitoringConfiguration.MetricsServerConfig.Tolerations != nil { + d.Spec.Template.Spec.Tolerations = f.config.ClusterMonitoringConfiguration.MetricsServerConfig.Tolerations + } + } + } + } + + return d, nil +} + +func (f *Factory) MetricsServerPodDisruptionBudget() (*policyv1.PodDisruptionBudget, error) { + return f.NewPodDisruptionBudget(f.assets.MustNewAssetReader(MetricsServerPodDisruptionBudget)) +} + +func (f *Factory) MetricsServerService() (*v1.Service, error) { + return f.NewService(f.assets.MustNewAssetReader(MetricsServerService)) +} + +func (f *Factory) MetricsServerServiceMonitor() (*monv1.ServiceMonitor, error) { + return f.NewServiceMonitor(f.assets.MustNewAssetReader(MetricsServerServiceMonitor)) +} + +func (f *Factory) MetricsServerAPIService() (*apiregistrationv1.APIService, error) { + return f.NewAPIService(f.assets.MustNewAssetReader(MetricsServerAPIService)) +} + func (f *Factory) PrometheusOperatorServiceMonitor() (*monv1.ServiceMonitor, error) { return f.NewServiceMonitor(f.assets.MustNewAssetReader(PrometheusOperatorServiceMonitor)) } diff --git a/pkg/manifests/types.go b/pkg/manifests/types.go index 3d456bb9c4..e2758cefe8 100644 --- a/pkg/manifests/types.go +++ b/pkg/manifests/types.go @@ -43,6 +43,8 @@ type ClusterMonitoringConfiguration struct { HTTPConfig *HTTPConfig `json:"http,omitempty"` // `K8sPrometheusAdapter` defines settings for the Prometheus Adapter component. K8sPrometheusAdapter *K8sPrometheusAdapter `json:"k8sPrometheusAdapter,omitempty"` + // `MetricsServer` defines settings for the MetricsServer component. + MetricsServerConfig *MetricsServerConfig `json:"metricsServer,omitempty"` // `KubeStateMetricsConfig` defines settings for the `kube-state-metrics` agent. KubeStateMetricsConfig *KubeStateMetricsConfig `json:"kubeStateMetrics,omitempty"` // `PrometheusK8sConfig` defines settings for the Prometheus component. @@ -115,6 +117,18 @@ type K8sPrometheusAdapter struct { DedicatedServiceMonitors *DedicatedServiceMonitors `json:"dedicatedServiceMonitors,omitempty"` } +// The `MetricsServerConfig` resource defines settings for the MetricsServer component. +type MetricsServerConfig struct { + // `Enabled` is a Boolean flag that enables or disables metrics-server. + Enabled *bool `json:"enabled,omitempty"` + // Defines the nodes on which the pods are scheduled. + NodeSelector map[string]string `json:"nodeSelector,omitempty"` + // Defines tolerations for the pods. + Tolerations []v1.Toleration `json:"tolerations,omitempty"` + // Defines resource requests and limits for the Metrics Server container. + Resources *v1.ResourceRequirements `json:"resources,omitempty"` +} + // You can use the `DedicatedServiceMonitors` resource to configure dedicated // Service Monitors for the Prometheus Adapter type DedicatedServiceMonitors struct { diff --git a/pkg/operator/operator.go b/pkg/operator/operator.go index 98292d5de8..1526d0c99c 100644 --- a/pkg/operator/operator.go +++ b/pkg/operator/operator.go @@ -724,6 +724,7 @@ func (o *Operator) sync(ctx context.Context, key string) error { tasks.NewTaskSpec("Updating kube-state-metrics", tasks.NewKubeStateMetricsTask(o.client, factory)), tasks.NewTaskSpec("Updating openshift-state-metrics", tasks.NewOpenShiftStateMetricsTask(o.client, factory)), tasks.NewTaskSpec("Updating prometheus-adapter", tasks.NewPrometheusAdapterTask(ctx, o.namespace, o.client, factory, config)), + tasks.NewTaskSpec("Updating metrics-server", tasks.NewMetricsServerTask(ctx, o.namespace, o.client, factory, config)), tasks.NewTaskSpec("Updating Telemeter client", tasks.NewTelemeterClientTask(o.client, factory, config)), tasks.NewTaskSpec("Updating Thanos Querier", tasks.NewThanosQuerierTask(o.client, factory, config)), tasks.NewTaskSpec("Updating User Workload Thanos Ruler", tasks.NewThanosRulerUserWorkloadTask(o.client, factory, config)), diff --git a/pkg/tasks/metricsserver.go b/pkg/tasks/metricsserver.go new file mode 100644 index 0000000000..4fac088313 --- /dev/null +++ b/pkg/tasks/metricsserver.go @@ -0,0 +1,285 @@ +package tasks + +import ( + "context" + + "github.com/openshift/cluster-monitoring-operator/pkg/client" + "github.com/openshift/cluster-monitoring-operator/pkg/manifests" + "github.com/pkg/errors" + appsv1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type MetricsServerTask struct { + client *client.Client + ctx context.Context + factory *manifests.Factory + config *manifests.Config + namespace string +} + +func NewMetricsServerTask(ctx context.Context, namespace string, client *client.Client, factory *manifests.Factory, config *manifests.Config) *MetricsServerTask { + return &MetricsServerTask{ + client: client, + factory: factory, + config: config, + namespace: namespace, + ctx: ctx, + } +} + +func (t *MetricsServerTask) Run(ctx context.Context) error { + if t.config.ClusterMonitoringConfiguration.MetricsServerConfig != nil && *t.config.ClusterMonitoringConfiguration.MetricsServerConfig.Enabled { + return t.create(ctx) + } + return t.destroy(ctx) +} + +func (t *MetricsServerTask) create(ctx context.Context) error { + { + sa, err := t.factory.MetricsServerServiceAccount() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer ServiceAccount failed") + } + + err = t.client.CreateOrUpdateServiceAccount(ctx, sa) + if err != nil { + return errors.Wrap(err, "reconciling MetricsServer ServiceAccount failed") + } + } + { + cr, err := t.factory.MetricsServerClusterRole() + if err != nil { + return errors.Wrap(err, "initializing metrics-server ClusterRolefailed") + } + + err = t.client.CreateOrUpdateClusterRole(ctx, cr) + if err != nil { + return errors.Wrap(err, "reconciling metrics-server ClusterRole failed") + } + } + { + crb, err := t.factory.MetricsServerClusterRoleBinding() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer ClusterRoleBinding failed") + } + + err = t.client.CreateOrUpdateClusterRoleBinding(ctx, crb) + if err != nil { + return errors.Wrap(err, "reconciling MetricsServer ClusterRoleBinding failed") + } + } + { + cr, err := t.factory.MetricsServerClusterRoleAggregatedMetricsReader() + if err != nil { + return errors.Wrap(err, "initializing system:aggregated-metrics-reader ClusterRolefailed") + } + + err = t.client.CreateOrUpdateClusterRole(ctx, cr) + if err != nil { + return errors.Wrap(err, "reconciling system:aggregated-metrics-reader ClusterRole failed") + } + } + { + crb, err := t.factory.MetricsServerClusterRoleBindingAuthDelegator() + if err != nil { + return errors.Wrap(err, "initializing metrics-server:system:auth-delegator ClusterRoleBinding failed") + } + + err = t.client.CreateOrUpdateClusterRoleBinding(ctx, crb) + if err != nil { + return errors.Wrap(err, "reconciling metrics-server:system:auth-delegator ClusterRoleBinding failed") + } + } + { + rb, err := t.factory.MetricsServerRoleBindingAuthReader() + if err != nil { + return errors.Wrap(err, "initializing metrics-server-auth-reader RoleBinding failed") + } + + err = t.client.CreateOrUpdateRoleBinding(ctx, rb) + if err != nil { + return errors.Wrap(err, "reconciling metrics-server-auth-reader RoleBinding failed") + } + } + { + s, err := t.factory.MetricsServerService() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer Service failed") + } + + err = t.client.CreateOrUpdateService(ctx, s) + if err != nil { + return errors.Wrap(err, "reconciling MetricsServer Service failed") + } + } + { + dep, err := t.factory.MetricsServerDeployment() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer Deployment failed") + } + + err = t.client.CreateOrUpdateDeployment(ctx, dep) + if err != nil { + return errors.Wrap(err, "reconciling MetricsServer Deployment failed") + } + } + { + sm, err := t.factory.MetricsServerServiceMonitor() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer ServiceMonitors failed") + } + + err = t.client.CreateOrUpdateServiceMonitor(ctx, sm) + if err != nil { + return errors.Wrapf(err, "reconciling %s/%s ServiceMonitor failed", sm.Namespace, sm.Name) + } + } + { + pdb, err := t.factory.MetricsServerPodDisruptionBudget() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer PodDisruptionBudget failed") + } + + if pdb != nil { + err = t.client.CreateOrUpdatePodDisruptionBudget(ctx, pdb) + if err != nil { + return errors.Wrap(err, "reconciling MetricsServer PodDisruptionBudget failed") + } + } + } + { + api, err := t.factory.MetricsServerAPIService() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer APIService failed") + } + + err = t.client.CreateOrUpdateAPIService(ctx, api) + if err != nil { + return errors.Wrap(err, "reconciling MetricsServer APIService failed") + } + } + + return t.removePrometheusAdapterResources() +} + +func (t *MetricsServerTask) destroy(ctx context.Context) error { + { + pdb, err := t.factory.MetricsServerPodDisruptionBudget() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer PodDisruptionBudget failed") + } + + if pdb != nil { + err = t.client.DeletePodDisruptionBudget(ctx, pdb) + if err != nil { + return errors.Wrap(err, "deleting MetricsServer PodDisruptionBudget failed") + } + } + } + { + dep, err := t.factory.MetricsServerDeployment() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer Deployment failed") + } + + err = t.client.DeleteDeployment(ctx, dep) + if err != nil { + return errors.Wrap(err, "deleting MetricsServer Deployment failed") + } + } + { + cr, err := t.factory.MetricsServerClusterRole() + if err != nil { + return errors.Wrap(err, "initializing metrics-server ClusterRolefailed") + } + + err = t.client.DeleteClusterRole(ctx, cr) + if err != nil { + return errors.Wrap(err, "deleting metrics-server ClusterRole failed") + } + } + { + crb, err := t.factory.MetricsServerClusterRoleBinding() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer ClusterRoleBinding failed") + } + + err = t.client.DeleteClusterRoleBinding(ctx, crb) + if err != nil { + return errors.Wrap(err, "deleting MetricsServer ClusterRoleBinding failed") + } + } + { + cr, err := t.factory.MetricsServerClusterRoleAggregatedMetricsReader() + if err != nil { + return errors.Wrap(err, "initializing system:aggregated-metrics-reader ClusterRolefailed") + } + + err = t.client.DeleteClusterRole(ctx, cr) + if err != nil { + return errors.Wrap(err, "deleting system:aggregated-metrics-reader ClusterRole failed") + } + } + { + crb, err := t.factory.MetricsServerClusterRoleBindingAuthDelegator() + if err != nil { + return errors.Wrap(err, "initializing metrics-server:system:auth-delegator ClusterRoleBinding failed") + } + + err = t.client.DeleteClusterRoleBinding(ctx, crb) + if err != nil { + return errors.Wrap(err, "deleting metrics-server:system:auth-delegator ClusterRoleBinding failed") + } + } + { + rb, err := t.factory.MetricsServerRoleBindingAuthReader() + if err != nil { + return errors.Wrap(err, "initializing metrics-server-auth-reader RoleBinding failed") + } + + err = t.client.DeleteRoleBinding(ctx, rb) + if err != nil { + return errors.Wrap(err, "deleting metrics-server-auth-reader RoleBinding failed") + } + } + { + sm, err := t.factory.MetricsServerServiceMonitor() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer ServiceMonitors failed") + } + + err = t.client.DeleteServiceMonitor(ctx, sm) + if err != nil { + return errors.Wrapf(err, "deleting %s/%s ServiceMonitor failed", sm.Namespace, sm.Name) + } + } + { + s, err := t.factory.MetricsServerService() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer Service failed") + } + + err = t.client.DeleteService(ctx, s) + if err != nil { + return errors.Wrap(err, "deleting MetricsServer Service failed") + } + } + return nil +} + +func (t *MetricsServerTask) removePrometheusAdapterResources() error { + d := &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "prometheus-adapter", + Namespace: "openshift-monitoring", + }, + } + err := t.client.DeleteDeployment(t.ctx, d) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter Deployment failed") + } + + // TODO Add steps to remove other resources + return nil +} diff --git a/pkg/tasks/prometheusadapter.go b/pkg/tasks/prometheusadapter.go index 7f10a76f2c..8e19a77d00 100644 --- a/pkg/tasks/prometheusadapter.go +++ b/pkg/tasks/prometheusadapter.go @@ -30,6 +30,16 @@ func NewPrometheusAdapterTask(ctx context.Context, namespace string, client *cli } func (t *PrometheusAdapterTask) Run(ctx context.Context) error { + if t.config.TechPreview { + if t.config.ClusterMonitoringConfiguration.MetricsServerConfig != nil && *t.config.ClusterMonitoringConfiguration.MetricsServerConfig.Enabled { + return nil + } + } + + return t.create(ctx) +} + +func (t *PrometheusAdapterTask) create(ctx context.Context) error { { cr, err := t.factory.PrometheusAdapterClusterRole() if err != nil {