diff --git a/gitops/applications/base/monitoring-post-config/dashboards-kafka.yaml b/gitops/applications/base/monitoring-post-config/dashboards-kafka.yaml deleted file mode 100644 index 9170fb2995..0000000000 --- a/gitops/applications/base/monitoring-post-config/dashboards-kafka.yaml +++ /dev/null @@ -1,171 +0,0 @@ -apiVersion: grafana.integreatly.org/v1beta1 -kind: GrafanaFolder -metadata: - name: kafka - -spec: - allowCrossNamespaceImport: true - instanceSelector: - matchLabels: - dashboards: "grafana" ---- -apiVersion: grafana.integreatly.org/v1beta1 -kind: GrafanaDashboard -metadata: - name: strimzi-cruise-control - -spec: - allowCrossNamespaceImport: true - folder: kafka - instanceSelector: - matchLabels: - dashboards: "grafana" - datasources: - - inputName: "DS_PROMETHEUS" - datasourceName: "${ARGOCD_ENV_dashboard_datasource_name}" - url: "https://raw.githubusercontent.com/strimzi/strimzi-kafka-operator/0.41.0/examples/metrics/grafana-dashboards/strimzi-cruise-control.json" ---- -apiVersion: grafana.integreatly.org/v1beta1 -kind: GrafanaDashboard -metadata: - name: strimzi-kafka-bridge - -spec: - allowCrossNamespaceImport: true - folder: kafka - instanceSelector: - matchLabels: - dashboards: "grafana" - datasources: - - inputName: "DS_PROMETHEUS" - datasourceName: "${ARGOCD_ENV_dashboard_datasource_name}" - url: "https://raw.githubusercontent.com/strimzi/strimzi-kafka-operator/0.41.0/examples/metrics/grafana-dashboards/strimzi-kafka-bridge.json" ---- -apiVersion: grafana.integreatly.org/v1beta1 -kind: GrafanaDashboard -metadata: - name: strimzi-kafka-connect - -spec: - allowCrossNamespaceImport: true - folder: kafka - instanceSelector: - matchLabels: - dashboards: "grafana" - datasources: - - inputName: "DS_PROMETHEUS" - datasourceName: "${ARGOCD_ENV_dashboard_datasource_name}" - url: "https://raw.githubusercontent.com/strimzi/strimzi-kafka-operator/0.41.0/examples/metrics/grafana-dashboards/strimzi-kafka-connect.json" ---- -apiVersion: grafana.integreatly.org/v1beta1 -kind: GrafanaDashboard -metadata: - name: strimzi-kafka-exporter - -spec: - allowCrossNamespaceImport: true - folder: kafka - instanceSelector: - matchLabels: - dashboards: "grafana" - datasources: - - inputName: "DS_PROMETHEUS" - datasourceName: "${ARGOCD_ENV_dashboard_datasource_name}" - url: "https://raw.githubusercontent.com/strimzi/strimzi-kafka-operator/0.41.0/examples/metrics/grafana-dashboards/strimzi-kafka-exporter.json" ---- -apiVersion: grafana.integreatly.org/v1beta1 -kind: GrafanaDashboard -metadata: - name: strimzi-kafka-mirror-maker-2 - -spec: - allowCrossNamespaceImport: true - folder: kafka - instanceSelector: - matchLabels: - dashboards: "grafana" - datasources: - - inputName: "DS_PROMETHEUS" - datasourceName: "${ARGOCD_ENV_dashboard_datasource_name}" - url: "https://raw.githubusercontent.com/strimzi/strimzi-kafka-operator/0.41.0/examples/metrics/grafana-dashboards/strimzi-kafka-mirror-maker-2.json" ---- -apiVersion: grafana.integreatly.org/v1beta1 -kind: GrafanaDashboard -metadata: - name: strimzi-kafka-oauth - -spec: - allowCrossNamespaceImport: true - folder: kafka - instanceSelector: - matchLabels: - dashboards: "grafana" - datasources: - - inputName: "DS_PROMETHEUS" - datasourceName: "${ARGOCD_ENV_dashboard_datasource_name}" - url: "https://raw.githubusercontent.com/strimzi/strimzi-kafka-operator/0.41.0/examples/metrics/grafana-dashboards/strimzi-kafka-oauth.json" ---- -apiVersion: grafana.integreatly.org/v1beta1 -kind: GrafanaDashboard -metadata: - name: strimzi-kafka - -spec: - allowCrossNamespaceImport: true - folder: kafka - instanceSelector: - matchLabels: - dashboards: "grafana" - datasources: - - inputName: "DS_PROMETHEUS" - datasourceName: "${ARGOCD_ENV_dashboard_datasource_name}" - url: "https://raw.githubusercontent.com/strimzi/strimzi-kafka-operator/0.41.0/examples/metrics/grafana-dashboards/strimzi-kafka.json" ---- -apiVersion: grafana.integreatly.org/v1beta1 -kind: GrafanaDashboard -metadata: - name: strimzi-kraft - -spec: - allowCrossNamespaceImport: true - folder: kafka - instanceSelector: - matchLabels: - dashboards: "grafana" - datasources: - - inputName: "DS_PROMETHEUS" - datasourceName: "${ARGOCD_ENV_dashboard_datasource_name}" - url: "https://raw.githubusercontent.com/strimzi/strimzi-kafka-operator/0.41.0/examples/metrics/grafana-dashboards/strimzi-kraft.json" ---- -apiVersion: grafana.integreatly.org/v1beta1 -kind: GrafanaDashboard -metadata: - name: strimzi-operators - -spec: - allowCrossNamespaceImport: true - folder: kafka - instanceSelector: - matchLabels: - dashboards: "grafana" - datasources: - - inputName: "DS_PROMETHEUS" - datasourceName: "${ARGOCD_ENV_dashboard_datasource_name}" - url: "https://raw.githubusercontent.com/strimzi/strimzi-kafka-operator/0.41.0/examples/metrics/grafana-dashboards/strimzi-operators.json" ---- -apiVersion: grafana.integreatly.org/v1beta1 -kind: GrafanaDashboard -metadata: - name: strimzi-zookeeper - -spec: - allowCrossNamespaceImport: true - folder: kafka - instanceSelector: - matchLabels: - dashboards: "grafana" - datasources: - - inputName: "DS_PROMETHEUS" - datasourceName: "${ARGOCD_ENV_dashboard_datasource_name}" - url: "https://raw.githubusercontent.com/strimzi/strimzi-kafka-operator/0.41.0/examples/metrics/grafana-dashboards/strimzi-zookeeper.json" ---- diff --git a/gitops/applications/base/monitoring-post-config/kustomization.yaml b/gitops/applications/base/monitoring-post-config/kustomization.yaml index 244c0266e5..1ae1920e46 100644 --- a/gitops/applications/base/monitoring-post-config/kustomization.yaml +++ b/gitops/applications/base/monitoring-post-config/kustomization.yaml @@ -11,7 +11,6 @@ resources: - dashboards-default.yaml - dashboards-infra.yaml - dashboards-k8s.yaml - - dashboards-kafka.yaml - dashboards-loki.yaml - dashboards-longhorn.yaml - dashboards-mimir.yaml diff --git a/terraform/gitops/generate-files/templates/stateful-resources-operators/values-strimzi.yaml.tpl b/terraform/gitops/generate-files/templates/stateful-resources-operators/values-strimzi.yaml.tpl index 4645ffe770..96366f1001 100644 --- a/terraform/gitops/generate-files/templates/stateful-resources-operators/values-strimzi.yaml.tpl +++ b/terraform/gitops/generate-files/templates/stateful-resources-operators/values-strimzi.yaml.tpl @@ -3,11 +3,21 @@ # Default replicas for the cluster operator replicas: 1 -# If you set `watchNamespaces` to the same value as ``.Release.Namespace` (e.g. `helm ... --namespace $NAMESPACE`), -# the chart will fail because duplicate RoleBindings will be attempted to be created in the same namespace +# Contains `.Release.Namespace` by default watchNamespaces: [] watchAnyNamespace: true +defaultImageRegistry: quay.io +defaultImageRepository: strimzi +defaultImageTag: ${strimzi_operator_version} + +image: + registry: "" + repository: "" + name: operator + tag: "" + # imagePullSecrets: + # - name: secretname logVolume: co-config-volume logConfigMap: strimzi-cluster-operator @@ -31,12 +41,17 @@ extraEnvs: value: "cluster.local" tolerations: [] +topologySpreadConstraints: [] affinity: {} annotations: {} labels: {} nodeSelector: {} +deploymentAnnotations: {} +deploymentLabels: {} +deploymentStrategy: {} priorityClassName: "" +hostUsers: NULL podSecurityContext: {} securityContext: {} rbac: @@ -50,7 +65,10 @@ leaderElection: # https://kubernetes.io/docs/tasks/run-application/configure-pdb/ podDisruptionBudget: enabled: false - # The PDB definition only has two attributes to control the availability requirements: minAvailable or maxUnavailable (mutually exclusive). + # The PDB definition three attributes to control the availability requirements: + # minAvailable or maxUnavailable (mutually exclusive). + # unhealthyPodEvictionPolicy + # # Field maxUnavailable tells how many pods can be down and minAvailable tells how many pods must be running in a cluster. # The pdb template will check values according to below order @@ -65,6 +83,18 @@ podDisruptionBudget: # If both values are set, the template will use the first one and ignore the second one. currently by default minAvailable is set to 1 minAvailable: 1 maxUnavailable: + unhealthyPodEvictionPolicy: IfHealthyBudget + +operatorNetworkPolicy: + # If enabled, this will generate a networkPolicy for the strimzi-operator. + # This flag DOES NOT control operator generated networkPolicies. + enabled: false + ingress: + - ports: + - protocol: TCP + port: http + egress: + - {} # If you are using the grafana dashboard sidecar, # you can import some default dashboards here @@ -76,6 +106,79 @@ dashboards: annotations: {} extraLabels: {} +# Docker images that operator uses to provision various components of Strimzi. +kafka: + image: + registry: "" + repository: "" + name: kafka + tagPrefix: "" +kafkaConnect: + image: + registry: "" + repository: "" + name: kafka + tagPrefix: "" +topicOperator: + image: + registry: "" + repository: "" + name: operator + tag: "" +userOperator: + image: + registry: + repository: + name: operator + tag: "" +kafkaInit: + image: + registry: "" + repository: "" + name: operator + tag: "" +kafkaBridge: + image: + registry: "" + repository: + name: kafka-bridge + tag: ${strimzi_operator_version == "1.1.0" ? "1.0.0" : ""} +kafkaExporter: + image: + registry: "" + repository: "" + name: kafka + tagPrefix: "" +kafkaMirrorMaker2: + image: + registry: "" + repository: "" + name: kafka + tagPrefix: "" +cruiseControl: + image: + registry: "" + repository: "" + name: kafka + tagPrefix: "" +kanikoExecutor: + image: + registry: "" + repository: "" + name: kaniko-executor + tag: "" +buildah: + image: + registry: "" + repository: "" + name: buildah + tag: "" +mavenBuilder: + image: + registry: "" + repository: "" + name: maven-builder + tag: "" resources: limits: @@ -100,4 +203,6 @@ labelsExclusionPattern: "" # Controls whether Strimzi generates network policy resources (By default true) generateNetworkPolicy: true # Override the value for Connect build timeout -connectBuildTimeoutMs: 300000 \ No newline at end of file +connectBuildTimeoutMs: 300000 +# Controls whether Strimzi generates pod disruption budget resources (By default true) +generatePodDisruptionBudget: true diff --git a/terraform/gitops/k8s-cluster-config/stateful-resources-operators.tf b/terraform/gitops/k8s-cluster-config/stateful-resources-operators.tf index 96676020d1..4a820ac170 100644 --- a/terraform/gitops/k8s-cluster-config/stateful-resources-operators.tf +++ b/terraform/gitops/k8s-cluster-config/stateful-resources-operators.tf @@ -7,6 +7,7 @@ module "generate_stateful_resources_operators" { gitlab_server_url = var.gitlab_server_url current_gitlab_project_id = var.current_gitlab_project_id stateful_resources_operators = local.enabled_stateful_resources_operators_resolved + strimzi_operator_version = try(local.enabled_stateful_resources_operators.strimzi.helm_chart_version, "0.40.0") stateful_resources_operators_ns = local.enabled_stateful_resources_operators_ns stateful_resources_operators_namespace = var.stateful_resources_operators_namespace stateful_resources_operators_sync_wave = var.stateful_resources_operators_sync_wave diff --git a/terraform/gitops/stateful-resources/stateful-resources-config.tf b/terraform/gitops/stateful-resources/stateful-resources-config.tf index 7a817a1d84..b9a3fb2a4b 100644 --- a/terraform/gitops/stateful-resources/stateful-resources-config.tf +++ b/terraform/gitops/stateful-resources/stateful-resources-config.tf @@ -107,11 +107,22 @@ resource "local_file" "strimzi-crs" { node_pool_storage_size = each.value.local_operator_config.kafka_data.storage_size node_pool_storage_class_name = each.value.local_operator_config.kafka_data.storage_class_name node_pool_affinity = each.value.local_operator_config.kafka_data.affinity_definition + node_pool_resources = try(each.value.local_operator_config.kafka_data.resources, {}) tolerations = each.value.local_operator_config.kafka_data.tolerations namespace = each.value.local_operator_config.resource_namespace - kafka_version = try(each.value.local_operator_config.kafka_data.kafka_version, "3.7.0") - kafka_metadata_version = try(each.value.local_operator_config.kafka_data.kafka_metadata_version, "3.7-IV4") + strimzi_api_version = local.strimzi_compatibility_by_resource[each.key].api_version + strimzi_requires_kraft_annotations = local.strimzi_compatibility_by_resource[each.key].requires_kraft_annotations + strimzi_requires_kraft_metadata = local.strimzi_compatibility_by_resource[each.key].requires_kraft_metadata + + kafka_version = try( + each.value.local_operator_config.kafka_data.kafka_version, + local.strimzi_compatibility_by_resource[each.key].kafka_version + ) + kafka_metadata_version = try( + each.value.local_operator_config.kafka_data.kafka_metadata_version, + local.strimzi_compatibility_by_resource[each.key].kafka_metadata_version + ) # Kafka broker config defaults. Override/extend via custom-config: # mojaloop-kafka.local_operator_config.kafka_data.broker_config: # : @@ -128,7 +139,7 @@ resource "local_file" "strimzi-crs" { ) kafka_topics = each.value.logical_service_config.post_install_schema_config.kafka_provisioning.enabled ? each.value.logical_service_config.post_install_schema_config.kafka_provisioning.topics : {} - strimzi_kafka_grafana_dashboards_version = local.strimzi_kafka_grafana_dashboards_version + strimzi_kafka_grafana_dashboards_version = local.strimzi_compatibility_by_resource[each.key].dashboards_version strimzi_kafka_grafana_dashboards_list = [ "strimzi-cruise-control", "strimzi-kafka-bridge", "strimzi-kafka-connect", "strimzi-kafka-exporter", "strimzi-kafka-mirror-maker-2", "strimzi-kafka-oauth", @@ -136,6 +147,16 @@ resource "local_file" "strimzi-crs" { ] }) filename = "${local.stateful_resources_output_path}/kafka-with-dual-role-nodes-${each.key}.yaml" + + lifecycle { + precondition { + condition = contains( + keys(local.strimzi_compatibility_profiles), + try(each.value.local_operator_config.kafka_data.strimzi_version, "0.40.0") + ) + error_message = "Unsupported kafka_data.strimzi_version. Supported versions: 0.40.0, 0.51.0, 1.1.0. The Strimzi operator chart must use the same version." + } + } } resource "local_file" "redis-crs" { @@ -530,7 +551,40 @@ locals { percona_credentials_secret_provider_key = "percona_bucket_access_key_id" percona_credentials_id_provider_key = "percona_bucket_access_key_id" - strimzi_kafka_grafana_dashboards_version = "0.41.0" + strimzi_compatibility_profiles = { + "0.40.0" = { + api_version = "kafka.strimzi.io/v1beta2" + requires_kraft_annotations = true + requires_kraft_metadata = false + kafka_version = "3.7.0" + kafka_metadata_version = "3.7-IV4" + dashboards_version = "0.41.0" + } + "0.51.0" = { + api_version = "kafka.strimzi.io/v1" + requires_kraft_annotations = false + requires_kraft_metadata = true + kafka_version = "4.2.0" + kafka_metadata_version = "4.2-IV1" + dashboards_version = "0.51.0" + } + "1.1.0" = { + api_version = "kafka.strimzi.io/v1" + requires_kraft_annotations = false + requires_kraft_metadata = true + kafka_version = "4.3.0" + kafka_metadata_version = "4.3-IV0" + dashboards_version = "1.1.0" + } + } + + strimzi_compatibility_by_resource = { + for key, resource in local.strimzi_operator_stateful_resources : key => lookup( + local.strimzi_compatibility_profiles, + try(resource.local_operator_config.kafka_data.strimzi_version, "0.40.0"), + local.strimzi_compatibility_profiles["0.40.0"] + ) + } } variable "create_stateful_resources_ns" { diff --git a/terraform/gitops/stateful-resources/templates/stateful-resources/strimzi/kafka/kafka-with-dual-role-nodes.yaml.tpl b/terraform/gitops/stateful-resources/templates/stateful-resources/strimzi/kafka/kafka-with-dual-role-nodes.yaml.tpl index ace209ff31..6fcd43b3e7 100644 --- a/terraform/gitops/stateful-resources/templates/stateful-resources/strimzi/kafka/kafka-with-dual-role-nodes.yaml.tpl +++ b/terraform/gitops/stateful-resources/templates/stateful-resources/strimzi/kafka/kafka-with-dual-role-nodes.yaml.tpl @@ -1,4 +1,4 @@ -apiVersion: kafka.strimzi.io/v1beta2 +apiVersion: ${strimzi_api_version} kind: KafkaNodePool metadata: name: ${node_pool_name} @@ -10,12 +10,19 @@ spec: roles: - controller - broker +%{ if length(node_pool_resources) > 0 ~} + resources: + ${indent(4, yamlencode(node_pool_resources))} +%{ endif ~} storage: type: jbod volumes: - id: 0 type: persistent-claim size: ${node_pool_storage_size} +%{ if strimzi_requires_kraft_metadata ~} + kraftMetadata: shared +%{ endif ~} deleteClaim: false # %{ if node_pool_storage_class_name != null } class: ${node_pool_storage_class_name} @@ -53,14 +60,16 @@ spec: ${indent(8, yamlencode(node_pool_affinity))} # %{ endif } --- -apiVersion: kafka.strimzi.io/v1beta2 +apiVersion: ${strimzi_api_version} kind: Kafka metadata: name: ${kafka_cluster_name} namespace: ${namespace} +%{ if strimzi_requires_kraft_annotations ~} annotations: strimzi.io/node-pools: enabled strimzi.io/kraft: enabled +%{ endif ~} spec: kafka: template: @@ -405,7 +414,7 @@ spec: # %{ endfor } # %{ for name, topic in kafka_topics } -apiVersion: kafka.strimzi.io/v1beta2 +apiVersion: ${strimzi_api_version} kind: KafkaTopic metadata: name: ${name} diff --git a/terraform/k8s/default-config/mojaloop-stateful-resources-local-operator.yaml b/terraform/k8s/default-config/mojaloop-stateful-resources-local-operator.yaml index 043d4f1778..a752c373be 100644 --- a/terraform/k8s/default-config/mojaloop-stateful-resources-local-operator.yaml +++ b/terraform/k8s/default-config/mojaloop-stateful-resources-local-operator.yaml @@ -444,10 +444,20 @@ mojaloop-kafka: generate_secret_vault_base_path: generate_secret_extra_namespaces: [] kafka_data: + # Must match the Strimzi operator helm_chart_version. + # Supported compatibility profiles: 0.40.0, 0.51.0, 1.1.0. + strimzi_version: 0.40.0 storage_size: 8Gi storage_class_name: openebs-hostpath-retain service_port: 9092 replica_count: 1 + resources: + requests: + cpu: 500m + memory: 2Gi + limits: + cpu: "2" + memory: 4Gi affinity_definition: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: diff --git a/terraform/k8s/default-config/stateful-resources-operators.yaml b/terraform/k8s/default-config/stateful-resources-operators.yaml index aaa9f9d52a..80739c9a94 100644 --- a/terraform/k8s/default-config/stateful-resources-operators.yaml +++ b/terraform/k8s/default-config/stateful-resources-operators.yaml @@ -1,6 +1,8 @@ strimzi: enabled: true install_type: helm + # Keep in sync with mojaloop-kafka.local_operator_config.kafka_data.strimzi_version. + # Supported compatibility profiles: 0.40.0, 0.51.0, 1.1.0. helm_chart: strimzi-kafka-operator namespace: strimzi release_name: strimzi