From 0e3499ecfa7be0c55abacace319a4a0cc207e47f Mon Sep 17 00:00:00 2001 From: Mario Fernandez Date: Tue, 30 Apr 2024 13:03:15 +0200 Subject: [PATCH] Monitoring config CR migration Add Proposal Signed-off-by: Mario Fernandez --- .../assets/monitoring_config_phase2.png | Bin 0 -> 37259 bytes enhancements/monitoring/monitoring-config.md | 309 ++++++++++++++++++ 2 files changed, 309 insertions(+) create mode 100644 enhancements/monitoring/assets/monitoring_config_phase2.png create mode 100644 enhancements/monitoring/monitoring-config.md diff --git a/enhancements/monitoring/assets/monitoring_config_phase2.png b/enhancements/monitoring/assets/monitoring_config_phase2.png new file mode 100644 index 0000000000000000000000000000000000000000..38dffc9a760bb30d3567bda1e48944a5309952ca GIT binary patch literal 37259 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 literal 0 HcmV?d00001 diff --git a/enhancements/monitoring/monitoring-config.md b/enhancements/monitoring/monitoring-config.md new file mode 100644 index 0000000000..c7bb56c135 --- /dev/null +++ b/enhancements/monitoring/monitoring-config.md @@ -0,0 +1,309 @@ +--- +title: monitoring-config +authors: + - "@marioferh" + - "@danielmellado" + - "@jan--f" + - "@moadz" + - "@simonpasquier" +reviewers: + - "@jan--f" + - "@moadz" + - "@simonpasquier" +approvers: + - "@jan--f" + - "@moadz" + - "@simonpasquier" + - "@openshift/openshift-team-monitoring" +api-approvers: + - "@deads2k" + - "@JoelSpeed" +creation-date: 2024-04-26 +last-updated: 20204-26 +tracking-link: +- "https://issues.redhat.com/browse/MON-1100" + +--- + +# CRD ClusterMonitoring + +## Release Signoff Checklist + +- [ ] Enhancement is `implementable` +- [ ] Design details are appropriately documented from clear requirements +- [ ] Test plan is defined +- [ ] Graduation criteria for dev preview, tech preview, GA +- [ ] User-facing documentation is created in [openshift-docs](https://github.com/openshift/openshift-docs/) + +## Summary + +* Currently, the OCP monitoring stacks are configured using ConfigMaps (1 for platform monitoring and 1 for user-defined monitoring). In OpenShift though the best practice is to configure operators using custom resources. + + +## Motivation + +* The specification is well known and largely self-documenting. +* The Kubernetes API Server validates custom resources based on their API specification, so users get immediate feedback on errors instead of checking the ClusterOperator object and the cluster monitoring operator's logs. Common expressions language even allows to write complex validation logic, including cross-field tests. +* Many users expect to interact with operators through a CRD. +* Custom resources play better with GitOps workflows. +* CRDs supports multiple actors managing the same resource which is a key property for the Observability service of Advanced Cluster Management. + +### User Stories + +As a cluster administrator, I want to be able to add a CRD so that I can configure monitoring stack. +as a cluster administrator, I want to create a CR (possibly via gitops style systems) and observe the status of the created CR. Today this is spread over the config map and feedback via CMO status conditions and CMO logs. + + +### Goals + +- Replace the existing ConfigMaps with CRDs. +- Automated and friction-less upgrade for users. + +### Non-Goals + +- Make things more complicated and easy to break. +- Change any behavior of monitoring stack + +## Proposal + +Currently in CMO, a config map provides a way to inject configuration data into pods. There are two configmaps for the different stacks: + + cluster-monitoring-config: Default platform monitoring components. A set of platform monitoring components are installed in the openshift-monitoring project by default during an OpenShift Container Platform installation. This provides monitoring for core cluster components including Kubernetes services. The default monitoring stack also enables remote health monitoring for clusters. + + user-workload-monitoring-config: Components for monitoring user-defined projects. After optionally enabling monitoring for user-defined projects, additional monitoring components are installed in the openshift-user-workload-monitoring project. This provides monitoring for user-defined projects. These components are illustrated in the User section in the following diagram. + + +Two distinct CRDs are necessary because they are managed by different personas with specific roles and responsibilities: + + - UWM admins: manage the configuration of the UWM components (edit permissions on the openshift-user-workload-monitoring/user-workload-monitoring-config ConfigMap). + - Cluster admins: manage the configuration of the Platform monitoring components. + +In managed OpenShift clusters like OSD/ROSA, two separate CRDs are necessary because platform SREs manage the cluster's platform monitoring stack, while customers manage the user-defined monitoring stack. This separation ensures that each group maintains control over their specific monitoring configurations, reducing conflicts and enhancing system management. + +[More info](https://github.com/openshift/enhancements/blob/master/enhancements/monitoring/multi-tenant-alerting.md) + + +- Replace configmaps with CRD: + +Current Config struct in CMO + +``` + type Config struct { + Images *Images `json:"-"` + RemoteWrite bool `json:"-"` + CollectionProfilesFeatureGateEnabled bool `json:"-"` + + ClusterMonitoringConfiguration *ClusterMonitoringConfiguration `json:"-"` + UserWorkloadConfiguration *UserWorkloadConfiguration `json:"-"` +} +``` + +We will strive to maintain the previous structure as much as possible while adapting it to OpenShift API standards. + +[Current ClusterMonitoringConfiguration struct:]( +https://github.com/openshift/cluster-monitoring-operator/blob/eca25a9571d721a90f1b7f8d26931c679ae93aec/pkg/manifests/types.go#L36) +``` +type ClusterMonitoringConfiguration struct { + AlertmanagerMainConfig *AlertmanagerMainConfig `json:"alertmanagerMain,omitempty"` + UserWorkloadEnabled *bool `json:"enableUserWorkload,omitempty"` + HTTPConfig *HTTPConfig `json:"http,omitempty"` + K8sPrometheusAdapter *K8sPrometheusAdapter `json:"k8sPrometheusAdapter,omitempty"` + MetricsServerConfig *MetricsServerConfig `json:"metricsServer,omitempty"` + KubeStateMetricsConfig *KubeStateMetricsConfig `json:"kubeStateMetrics,omitempty"` + PrometheusK8sConfig *PrometheusK8sConfig `json:"prometheusK8s,omitempty"` + PrometheusOperatorConfig *PrometheusOperatorConfig `json:"prometheusOperator,omitempty"` + PrometheusOperatorAdmissionWebhookConfig *PrometheusOperatorAdmissionWebhookConfig `json:"prometheusOperatorAdmissionWebhook,omitempty"` + OpenShiftMetricsConfig *OpenShiftStateMetricsConfig `json:"openshiftStateMetrics,omitempty"` + TelemeterClientConfig *TelemeterClientConfig `json:"telemeterClient,omitempty"` + ThanosQuerierConfig *ThanosQuerierConfig `json:"thanosQuerier,omitempty"` + NodeExporterConfig NodeExporterConfig `json:"nodeExporter,omitempty"` + MonitoringPluginConfig *MonitoringPluginConfig `json:"monitoringPlugin,omitempty"` +} +``` + + +Each component within the ConfigMap will be migrated to the OpenShift API in separate PRs. This approach allows for a thorough review, improvement, and modification of each ConfigMap component to ensure it aligns with OpenShift API standards. As part of this process, types will be modified, outdated elements will be removed and names and configurations will be refined. + + +## Design Details + +To initiate the process, let's establish a feature gate that will serve as the entry point for implementing a CRD configuration approach. This strategy enables us to make incremental advancements without the immediate burden of achieving complete feature equivalence with the config map. We can commence with the basics and progressively incorporate additional functionalities as they develop. + +One proposal for a minimal DoD was: +- Feature gate in openshift/api +- API types moved to openshift/api +- Client-go codegen +- Reconcile logic: https://github.com/openshift/cluster-monitoring-operator/pull/2350 +- Add merge ConfigMap / CustomResource for phase 1 + + +### Example configuration + + +#### current ConfigMap + +``` +apiVersion: v1 +kind: ConfigMap +metadata: + name: cluster-monitoring-config + namespace: openshift-monitoring +data: + config.yaml: | + telemeterClient: + enabled: false + prometheusK8s: + volumeClaimTemplate: + metadata: + name: prometheus-data + annotations: + openshift.io/cluster-monitoring-drop-pvc: "yes" + spec: + resources: + requests: + storage: 20Gi +``` + +### CRD + +``` +apiVersion: clustermonitoring.config.openshift.io +kind: ClusterMonitoring +metadata: + name: cluster + namespace: openshift-monitoring +spec: + prometheusK8s: + volumeClaimTemplate: + metadata: + name: prometheus-data + annotations: + openshift.io/cluster-monitoring-drop-pvc: "yes" + spec: + resources: + requests: + storage: 20G +``` + + +### Workflow Description + +See example in the [Proposal](#Proposal) for details. + +### API Extensions + +Add two new CRD's: +- ClusterMonitoring +- UserWorkloadClusterMonitoring + +### Topology Considerations + +Will function identically in all topologies. + +#### Hypershift / Hosted Control Planes + +For hosted control planes the current direction is to hand off CMO completely to the cluster admin Persona. In that scenario the monitoring config would live solely within the guest cluster. Still Hypershift has an API knob within the HostedCluster for openshift/api targeted types. If desired at any time, the new monitoring config could be exposed there and reconciled down to the guest cluster. + +#### Standalone Clusters +No special considerations. + +#### Single-node Deployments or MicroShift +No special considerations. + +### Implementation Details/Notes/Constraints + + +### Migration path + +Migration path it will be split in three phases + +- Phase 1: Pre-GA (Gradual Migration for Developers) + - In this phase only developers are expected to use CRD. + - Both ConfigMap and CRD will coexist for a while until the transition is complete. + - Work with a Feature flag. + - Two options: ConfigMap or CRD. + Preference is to use ConfigMap over CRD during this phase. + - The merge process look at top-level fields + - Behavior: If an entry exists in the ConfigMap, ignore the CRD. + If there’s no entry in the ConfigMap, use the CRD. + - Merge Process (only for phase 1) + Top-level fields (e.g., AlertmanagerMainConfig *AlertmanagerMainConfig || spec.AlertmanagerMainConfig): + If a field is nil in the ConfigMap, use the CRD; otherwise, stick with the ConfigMap. + +- Phase 2: Transition (User Control) + Keep dual support for a at least 2 releases. + - New Logic: + Allow users to choose the source of configuration (ConfigMap or CRD, warn about CRD preference). + If a CRD exists, prioritize it over the ConfigMap. + Add logic for users to manually switch to CRD if desired. + No merge process. + + ![h](assets/monitoring_config_phase2.png) + +- Phase 3: Full Migration (CRD as Default) + After a few releases, the migration from ConfigMap to CRD will be complete. + ConfigMap will be deprecated, with CRD becoming the default configuration source. + + - To start with deprecation we follow these steps: + Documentation and release notes to warn user about changes. + Cluster Fleet Evaluation to check how many user already use CRD instead of ConfigMap + Eventually you can mark CMO as upgradeable=false if the ConfigMap exist + + +- Extensive testing will be required to validate the new behavior. +- Some fields in CRD and ConfigMap diverge due to API requirements. Helper functions will be needed to resolve this. + +### Risks and Mitigations + +- Issues when ConfigMap and CRD coexist, as ConfigMap and CRD will be merged in a single structure, this could be error prone and an extensive testing should be done. +- Mismatch in the configuration of operators with ConfigMap and CR + +### Drawbacks + +- Migration. The user can use either ConfigMap or CRD, or both; we need to explain how to make the transition, and the preference is to use the CRD. +- Coexisting of both ConfigMap and CRD. + + +## Test Plan + +- Unit tests for the feature +- e2e tests covering the feature +- Upgrade testing +- FeatureGate + +### Open questions + +- Merge CRD and ConfigMap could be error prone and will need extra test +- Should we provide an escape hatch (via some annotation?) telling CMO to ignore the custom resource and only use the ConfigMap in case something goes bad? +- How do we tell cluster admins that they need to migrate? CMO conditions could be an option as well as alerting and Insights?- How do we know how many clusters have migrated to the new CRD? Telemetry? + +## Graduation Criteria + +From Tech Preview to GA + +### Dev Preview -> Tech Preview + +### Tech Preview -> GA + +- Tech Preview was available for at least one release +- High severity bugs are fixed +- Reliable CI signal, minimal test flakes. +- e2e tests are in place + +### Removing a deprecated feature + +## Upgrade / Downgrade Strategy + +Feature will not affect standard upgrade or downgrade process of the cluster. + +## Version Skew Strategy + +N/A + +## Implementation History + +## Operational Aspects of API Extensions + +## Support Procedures + +## Alternatives \ No newline at end of file