Skip to main content

Global View Upgrade (2026.9.1)

Global View is one of the core components of the Virtana Platform. It provides a centralized, unified dashboard to monitor and manage performance across your entire infrastructure, consolidating insights from multiple sources into a single pane of glass.

This topic describes how to upgrade an existing Global View installation to version 2026.9.1 from version 2026.6.1 or from version 2026.4.1.

Note

These instructions apply only to upgrading an existing Global View installation. To install Global View on a new cluster, see Deploying Global View.

Prerequisites

Before you upgrade Global View to 2026.9.1, confirm that your environment meets the following requirements:

  • An existing Virtana Platform installation that runs version 2026.6.1 or version 2026.4.1.

  • A Kubernetes cluster with Helm v4.3.0 or later installed.

  • Access to the Virtana Helm repository. For instructions, see Add the Virtana Platform Helm repository.

  • Valid Docker registry credentials.

  • DNS records configured for the Global View, Keycloak, and GrowthBook hostnames.

Important

Upgrade Helm to v4.3.0 or later before you deploy the controlplane-crds Helm release. Helm v4.3.0 or later is required to patch and upgrade the Strimzi Kafka custom resource definitions (CRDs) for the latest version of the Strimzi Kafka operator. With an earlier Helm version, the CRD upgrade can fail.

Setup for upgrading to version 2026.9.1

Complete the preparation in this section before you run any Helm command. The steps that apply to you depend on the version that you're upgrading from:

Installed version

Setup steps that apply to you

2026.6.1

No additional setup is needed. Your installation already includes the changes that version 2026.6.1 introduced, so skip the four accordions in this section. Continue to Create the Helm input file.

2026.4.1

Complete all four accordions in this section: SolrCloud migration, SeaweedFS replaces MinIO, Victoria Metrics parameter rename, and VirtanAI (Copilot) configuration.

If you aren't ready to migrate your SolrCloud data, prepare for the migration first and upgrade afterward.

When you upgrade from version 2026.4.1, Global View migrates your Solr and ZooKeeper data to new pods. Version 2026.6.1 replaced the Bitnami Solr and ZooKeeper images with Apache Solr and Apache ZooKeeper images. Because you upgraded directly from 2026.4.1 to 2026.9.1, the data from your existing SolrCloud and ZooKeeper pods moves to new pods that use the new images.

SolrCloud migration is enabled by default. The migration uses a dedicated persistent volume claim (PVC, a request for storage in Kubernetes) as temporary storage, and it can resize your Solr and ZooKeeper PVCs. Complete the preparation tasks in this section, and review how the migration works, before you upgrade.

Important

Because the upgrade from version 2026.4.1 replaces the Bitnami Solr and ZooKeeper images, it involves a data migration. Follow the instructions in this section carefully.

Check the storage class and PVC usage

The SolrCloud migration job attempts to resize your Solr and ZooKeeper PVCs when they're more than 45% full, so the storage class behind those PVCs must support volume expansion. Check the following before you upgrade:

  • Confirm that the storage class used by the Solr and ZooKeeper PVCs has allowVolumeExpansion set to true.

  • Measure how much of each Solr and ZooKeeper PVC is in use. If your storage class already supports allowVolumeExpansion, you can skip this measurement.

  • If a PVC is more than 45% full and your storage class doesn't support volume expansion, resize the PVC manually before you start the upgrade. If a PVC is more than 45% full and no resize happens, the migration job can fail.

To measure PVC usage, run the following script from a machine that has access to the Kubernetes cluster where Global View is deployed. The script checks the pods solrcloud-solr-0 through solrcloud-solr-2 and solrcloud-zookeeper-0 through solrcloud-zookeeper-2 in the controlplane namespace, and it writes the results to a CSV file named solr_pvc_usage.csv:

#!/bin/bash

OUTPUT_FILE="solr_pvc_usage.csv"
NAMESPACE="controlplane"

echo "Pod,Filesystem,Size,Used,Available,UsePercent" > "$OUTPUT_FILE"

# Solr pods
for pod in solrcloud-solr-0 solrcloud-solr-1 solrcloud-solr-2
do
    kubectl -n "$NAMESPACE" exec "$pod" -- df -h /bitnami/solr 2>/dev/null | \
    awk -v pod="$pod" 'NR==2 {print pod "," $1 "," $2 "," $3 "," $4 "," $5}' \
    >> "$OUTPUT_FILE"
done

# Zookeeper pods
for pod in solrcloud-zookeeper-0 solrcloud-zookeeper-1 solrcloud-zookeeper-2
do
    kubectl -n "$NAMESPACE" exec "$pod" -- df -h /bitnami/zookeeper 2>/dev/null | \
    awk -v pod="$pod" 'NR==2 {print pod "," $1 "," $2 "," $3 "," $4 "," $5}' \
    >> "$OUTPUT_FILE"
done

echo "Results written to $OUTPUT_FILE"

Open solr_pvc_usage.csv and check the UsePercent column for each pod. Any value greater than 45% means that the PVC needs volume expansion support or a manual resize.

Note

The SolrCloud migration takes several minutes to complete, and the exact duration depends on how much data SolrCloud holds. Run the helm upgrade command for the controlplane-service release with a timeout of at least 1 hour so that the migration has enough time to finish.

Stop traffic and check cluster permissions

Traffic that reaches the cluster during the SolrCloud migration can cause data inconsistency. Stop all traffic to the cluster before you begin the migration, and resume the traffic after the migration finishes and you can see your alerts data in the Global View UI.

The migration job also creates a Kubernetes role. Confirm that no policy in your cluster blocks the creation of this role or the execution of the migration job. The following table describes the permissions that the role needs:

Kubernetes resource

Required permissions

Purpose

StatefulSets named solrcloud-solr, solrcloud-zookeeper, apache-solr, and apache-zookeeper

get, list, watch, patch, update

Update and patch the Solr and ZooKeeper StatefulSets.

Pods

get, list, watch, create, delete, exec

Update and restart the Solr and ZooKeeper pods during the migration.

PersistentVolumeClaims

get, list, watch, create, update, patch, delete

Create, update, delete, and resize PVCs.

Deployments

get, list, watch

Monitor the progress of the alerts-service deployment during the migration.

How the SolrCloud migration works

The SolrCloud migration runs in two phases: a backup phase before the new pods deploy, and a restore phase after the new pods come online. Both phases run as Kubernetes jobs, and both use a PVC named solrcloud-backup-pvc as temporary storage. The migration starts when alerts-service.solr.migration.enabled is set to true in global-view-values.yaml.

During the backup phase, the following happens:

  1. The upgrade creates the solrcloud-backup-pvc PVC for the migration job.

  2. A migration backup job starts and checks the Solr and ZooKeeper PVCs for usage. If usage exceeds the configured threshold, the job resizes the PVCs and then continues.

  3. The same job patches the existing SolrCloud StatefulSet with the parameters that the migration requires, and waits for the SolrCloud pods to come online.

  4. The job backs up the data from each Solr pod in turn to solrcloud-backup-pvc, then merges the data from all SolrCloud pods and stores the merged result on the PVC.

  5. The job writes a backup.complete marker file to the PVC. The marker prevents a second backup if you re-run the job, so a re-run goes directly to the restore phase.

During the restore phase, the following happens:

  1. The standard deployment runs. It deletes the existing SolrCloud and ZooKeeper pods and creates new pods that use the new Apache Solr and Apache ZooKeeper images.

  2. After all new Solr and ZooKeeper pods are running, a second migration job starts and restores the backup to the new SolrCloud pods.

  3. The restore job copies the data from solrcloud-backup-pvc to a temporary location on each SolrCloud pod, inserts the data by using the Solr API, and then deletes the temporary data from the pods.

  4. When the restore job completes, your data is visible in the Global View UI.

To repeat the backup, delete the backup.complete marker file from the solrcloud-backup-pvc PVC and re-run the job.

Warning

Deleting the solrcloud-backup-pvc PVC deletes all backed-up SolrCloud data on that PVC. If you delete the PVC, you must re-run the migration job to take a new backup. To repeat a backup without losing data, delete only the backup.complete marker file.

Configure the SolrCloud migration

SolrCloud migration is enabled by default when you upgrade from version 2026.4.1. To change how the migration behaves, set the following values in global-view-values.yaml:

alerts-service:
  solr:
    migration:
      enabled: true
      storageSize: "100Gi"
      pvcResizeThreshold: 45
      resources:
        requests:
          cpu: 100m
          memory: 1Gi
        limits:
          cpu: 500m
          memory: 1Gi

The following table describes the SolrCloud migration fields:

Field

Description

Default value

enabled

Turns the migration job on or off. When true, the migration process runs during the upgrade.

true

storageSize

Size of the PVC that the migration job uses. Set it to the same size as the SolrCloud PVC so that there is enough space for the data transfer.

100Gi

pvcResizeThreshold

Usage threshold, as a percentage of PVC capacity, that triggers a resize. The migration job resizes a PVC only if its usage exceeds this percentage, which avoids unnecessary resize operations. This value applies only when migration.enabled is true.

45

resources.requests.cpu

Minimum CPU guaranteed to the migration container.

100m

resources.requests.memory

Minimum memory guaranteed to the migration container.

1Gi

resources.limits.cpu

Maximum CPU that the migration container can use.

500m

resources.limits.memory

Maximum memory that the migration container can use.

1Gi

Note

Set alerts-service.solr.migration.storageSize to the same size as your existing Solr PVC. The sample values file for an upgrade from 2026.4.1 sets both alerts-service.solr.migration.storageSize and alerts-service.solr.persistence.size to 50Gi.

After the SolrCloud migration completes

After the SolrCloud migration finishes and you can see your data in the Global View UI, complete the following cleanup tasks:

  • Set alerts-service.solr.migration.enabled to false in global-view-values.yaml. This setting prevents the migration job from running again during future upgrades.

  • Keep the solrcloud-backup-pvc PVC for a few days as a backup. Virtana recommends that you delete it only after you confirm that the migration succeeded and all your data appears in Global View. Deleting the PVC frees storage space.

  • Delete the Solr and ZooKeeper PVCs from the previous deployment to free up storage. Delete them only after you confirm that the migration succeeded and all your data appears in Global View.

Starting with version 2026.6.1, Global View uses SeaweedFS as the object storage backend instead of MinIO. Existing MinIO data migrates automatically during the upgrade.

Remove all MinIO-related configuration from your global-view-values.yaml file before you upgrade. New installations need no MinIO deployment or configuration changes.

SeaweedFS configuration is optional. If you don't provide any SeaweedFS configuration, Global View deploys SeaweedFS with its default settings. To customize SeaweedFS, add the following values to global-view-values.yaml:

seaweedfs:
  image:
    registry: <REGISTRY_NAME>

  allInOne:
    data:
      type: persistentVolumeClaim
      size: 20Gi
      storageClass: *defaultStorageClass

    nodeSelector: ""
    affinity: ""
    tolerations: ""

Note

Review the storageClass value in the SeaweedFS configuration and make sure that it matches a storage class in your Kubernetes environment. If the storage class doesn't exist, the SeaweedFS PVC can't bind. The *defaultStorageClass alias works only inside global-view-values.yaml, where global.storageClass defines the &defaultStorageClass anchor.

Note

Set the SeaweedFS nodeSelector, affinity, and tolerations values as strings. Don't reuse the global *nodeSelector, *affinity, and *tolerations aliases for SeaweedFS, because the SeaweedFS chart expects these values as templated strings instead of native Kubernetes objects.

For the Victoria Metrics component, the storageClass parameter is renamed to storageClassName in global-view-values.yaml. Update this parameter name in your existing global-view-values.yaml file before you upgrade. The sample values in this topic use the new name.

In the sample values file, the renamed parameter appears in the cp-metrics-service block:

cp-metrics-service:
  victoria-metrics-single:
    rbac:
      create: true
      namespaced: true
    server:
      persistentVolume:
        storageClassName: *defaultStorageClass
        size: 16Gi

In version 2026.6.1, Virtana AI (the Copilot chatbot) switched to a provider-based configuration model that supports OpenAI, Gemini, and LiteLLM. This model replaces the single OPENAI_API_KEY variable that earlier releases use.

Add the following blocks to global-view-values.yaml:

virtana-ai:
  enabled: true
  env:
    VIRTANA_AI_MODEL_PROVIDER: ""

cp-configs:
  virtana_ai:
    virtana_ai_api_key: ""
    virtana_ai_inference_endpoint: ""

The following table describes the Virtana AI configuration fields:

Field

Description

Default value

virtana-ai.enabled

Enables the Virtana AI (Copilot) component.

true

virtana-ai.env.VIRTANA_AI_MODEL_PROVIDER

Selects the model provider. Supported values: OPENAI, GEMINI, LITELLM.

""

cp-configs.virtana_ai.virtana_ai_api_key

API key for the selected provider (OpenAI, Gemini, or LiteLLM). Replaces the former OPENAI_API_KEY variable.

""

cp-configs.virtana_ai.virtana_ai_inference_endpoint

Inference endpoint URL. Leave blank for OpenAI or Gemini. For a self-hosted LiteLLM deployment, set the LiteLLM endpoint URL, for example https://litellm.example.com.

""

For instructions to get an API key from a supported model provider, see Configure LLM Provider for Virtana AI (Copilot) (Optional).

Create the Helm input file

The Helm input file supplies the configuration values that the upgrade uses. Create a file named global-view-values.yaml with the content from the accordion that matches your installed version, and change the values to match your environment as described in the field tables in this section.

Important

Starting with release 2026.4.1, the name of the default Docker secret changed from dh-reg-cred to dhi-reg-cred. If you use the old default name for your private registry secret, update the name in global-view-values.yaml. If you already override the default secret with your own secret, you do not need to make any changes.

Use this file if your installed version is 2026.6.1. It sets alerts-service.solr.enabled and alerts-service.solr.migration.enabled to false, because your SolrCloud data is already migrated.

global:
  controlplane:
    ingress:
      annotations:
        nginx.ingress.kubernetes.io/ssl-redirect: "false"
        nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
  postgresql:
    storage:
      size: 50Gi
  environment: app
  secret_source: valuesfile

  storageClass: &defaultStorageClass ""

  dockerRegistryCredentials:
    DOCKER_SERVER: "https://index.docker.io/v2/"
    DOCKER_USERNAME: "username"
    DOCKER_PASSWORD: "password"

  keycloak:
    hostname: <KEYCLOAK_HOSTNAME>
    adminUser: "vpadmin"
    adminPassword: "xxxxxxx"

  public_dns_host_name: <global_view_hostname>
  public_dns_host_am_suffix: -oc-<global_view_hostname>

  organization_details:
    organization_name: "<TENANT_NAME>"
    first_name: "John"
    last_name: "Doe"
    contact_email: "xxxx.xxxx@domain.com"

  create_tls_selfsigned_certs: true
  affinity: &affinity {}
  nodeSelector: &nodeSelector {}
  tolerations: &tolerations []

cp-configs:
  smtp:
    smtpHost: smtp.gmail.com
    smtpPort: "587"
    smtpUsername: ""
    smtpPassword: ""
    smtpFromEmail: "noreplies@virtana.com"
    smtpTlsInsecureSkipVerify: "false"

growthbook:
  ingress:
    enabled: true
    annotations:
      nginx.ingress.kubernetes.io/cors-allow-origin: "https://<GROWTH_BOOK_HOSTNAME>"
    appOriginName: <GROWTH_BOOK_HOSTNAME>
    apiHostName: <GROWTH_BOOK_API_HOSTNAME>
  affinity: *affinity
  nodeSelector: *nodeSelector
  tolerations: *tolerations

cp-mongodb:
  affinity: *affinity
  nodeSelector: *nodeSelector
  tolerations: *tolerations
  migration:
    enabled: false
  persistence:
    size: 50Gi

seaweedfs:
  allInOne:
    data:
      type: persistentVolumeClaim
      size: 20Gi
      storageClass: *defaultStorageClass

    nodeSelector: ""
    affinity: ""
    tolerations: ""

redis:
  persistentVolumeClaim:
    size: 50Gi
  resources:
    requests:
      cpu: 100m
      memory: 256Mi
    limits:
      cpu: 500m
      memory: 256Mi

strimzi-kafka-operator:
  controller:
    persistence:
      size: 50Gi

cloud-native-postgresql-cluster:
  affinity: *affinity

cp-metrics-service:
  victoria-metrics-single:
    rbac:
      create: true
      namespaced: true
    server:
      persistentVolume:
        storageClassName: *defaultStorageClass
        size: 16Gi

alerts-service:
  solrdb:
    enabled: false
    persistent_ebs:
      spec:
        resources:
          requests:
            storage: 100Gi
  solr:
    enabled: false
    migration:
      enabled: false
      storageSize: "50Gi"
      resources:
        requests:
          cpu: 100m
          memory: 1Gi
        limits:
          cpu: 500m
          memory: 1Gi
    persistence:
      size: 50Gi
    zookeeper:
      persistence:
        size: 20Gi

Use this file if your installed version is 2026.4.1. It sets alerts-service.solr.enabled and alerts-service.solr.migration.enabled to true, so that the SolrCloud migration runs during the upgrade.

global:
  controlplane:
    ingress:
      annotations:
        nginx.ingress.kubernetes.io/ssl-redirect: "false"
        nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
  postgresql:
    storage:
      size: 50Gi
  environment: app
  secret_source: valuesfile

  storageClass: &defaultStorageClass ""

  dockerRegistryCredentials:
    DOCKER_SERVER: "https://index.docker.io/v2/"
    DOCKER_USERNAME: "username"
    DOCKER_PASSWORD: "password"

  keycloak:
    hostname: <KEYCLOAK_HOSTNAME>
    adminUser: "vpadmin"
    adminPassword: "xxxxxxx"

  public_dns_host_name: <global_view_hostname>
  public_dns_host_am_suffix: -oc-<global_view_hostname>

  organization_details:
    organization_name: "<TENANT_NAME>"
    first_name: "John"
    last_name: "Doe"
    contact_email: "xxxx.xxxx@domain.com"

  create_tls_selfsigned_certs: true
  affinity: &affinity {}
  nodeSelector: &nodeSelector {}
  tolerations: &tolerations []

cp-configs:
  smtp:
    smtpHost: smtp.gmail.com
    smtpPort: "587"
    smtpUsername: ""
    smtpPassword: ""
    smtpFromEmail: "noreplies@virtana.com"
    smtpTlsInsecureSkipVerify: "false"

growthbook:
  ingress:
    enabled: true
    annotations:
      nginx.ingress.kubernetes.io/cors-allow-origin: "https://<GROWTH_BOOK_HOSTNAME>"
    appOriginName: <GROWTH_BOOK_HOSTNAME>
    apiHostName: <GROWTH_BOOK_API_HOSTNAME>
  affinity: *affinity
  nodeSelector: *nodeSelector
  tolerations: *tolerations

cp-mongodb:
  affinity: *affinity
  nodeSelector: *nodeSelector
  tolerations: *tolerations
  migration:
    enabled: false
  persistence:
    size: 50Gi

seaweedfs:
  allInOne:
    data:
      type: persistentVolumeClaim
      size: 20Gi
      storageClass: *defaultStorageClass

    nodeSelector: ""
    affinity: ""
    tolerations: ""

redis:
  persistentVolumeClaim:
    size: 50Gi
  resources:
    requests:
      cpu: 100m
      memory: 256Mi
    limits:
      cpu: 500m
      memory: 256Mi

strimzi-kafka-operator:
  controller:
    persistence:
      size: 50Gi

cloud-native-postgresql-cluster:
  affinity: *affinity

cp-metrics-service:
  victoria-metrics-single:
    rbac:
      create: true
      namespaced: true
    server:
      persistentVolume:
        storageClassName: *defaultStorageClass
        size: 16Gi

alerts-service:
  solrdb:
    enabled: false
    persistent_ebs:
      spec:
        resources:
          requests:
            storage: 100Gi
  solr:
    enabled: true
    migration:
      enabled: true
      storageSize: "50Gi"
      resources:
        requests:
          cpu: 100m
          memory: 1Gi
        limits:
          cpu: 500m
          memory: 1Gi
    persistence:
      size: 50Gi
    zookeeper:
      persistence:
        size: 20Gi

Global fields and Docker registry credentials

The following table describes the fields in the global block of global-view-values.yaml:

Field

Description

Default value

global.controlplane.ingress.annotations

Controls the behavior of the NGINX Ingress for the control plane.

—

nginx.ingress.kubernetes.io/ssl-redirect

Controls automatic HTTP-to-HTTPS redirection.

"false"

nginx.ingress.kubernetes.io/force-ssl-redirect

When enabled, forces all incoming traffic to be served over HTTPS.

"false"

global.postgresql.storage.size

Size of the persistent volume for PostgreSQL.

50Gi

global.environment

Deployment environment name or type.

app

global.secret_source

Specifies where secrets come from. Supported values: valuesfile, none.

valuesfile

global.storageClass

Default Kubernetes StorageClass for persistent volume claims (PVCs). If blank, the cluster default StorageClass is used.

""

global.dockerRegistryCredentials

Credentials that the cluster uses to pull container images from a Docker registry. Use DOCKER_SERVER for a private registry in an air-gapped environment, or DOCKER_SERVERS for direct access to Docker Hub.

—

global.keycloak.hostname

Public hostname where Keycloak is accessible.

<KEYCLOAK_HOSTNAME>

global.keycloak.adminUser, global.keycloak.adminPassword

Credentials for the Keycloak admin account that configures realms, clients, and users. Replace xxxxxxx with the admin password.

vpadmin / xxxxxxx

global.public_dns_host_name

Main DNS name for the Global View UI. Replace the placeholder with your Global View hostname.

<global_view_hostname>

global.public_dns_host_am_suffix

Suffix that the deployment uses to build additional hostnames for auxiliary services. Replace the placeholder with your Global View hostname.

-oc-<global_view_hostname>

global.organization_details.organization_name

Tenant or company name.

<TENANT_NAME>

global.organization_details.first_name, global.organization_details.last_name

Primary contact person.

John / Doe

global.organization_details.contact_email

Contact email address for notifications and support.

xxxx.xxxx@domain.com

global.create_tls_selfsigned_certs

When true, the deployment creates self-signed TLS certificates.

true

global.affinity

Kubernetes pod affinity and anti-affinity rules. An empty value ({}) lets pods schedule anywhere.

{}

global.nodeSelector

Maps pods to nodes by label. An empty value ({}) applies no node constraints.

{}

global.tolerations

Allows pods to schedule onto tainted nodes. An empty value ([]) applies no tolerations.

[]

Note

The global block defines the YAML anchors &defaultStorageClass, &affinity, &nodeSelector, and &tolerations. Other blocks in global-view-values.yaml reuse them through aliases such as *affinity. Keep the anchors in the global block so that the aliases resolve.

The global.dockerRegistryCredentials section in global-view-values.yaml takes one of two forms, depending on how your cluster reaches the container images.

For a private registry in an air-gapped environment, specify a single registry server:

  dockerRegistryCredentials:
    DOCKER_SERVER: "https://index.docker.io/v2/"
    DOCKER_USERNAME: "username"
    DOCKER_PASSWORD: "password"

For direct access to Docker Hub, specify one or more registry servers:

  dockerRegistryCredentials:
    DOCKER_USERNAME: "username"
    DOCKER_PASSWORD: "password"
    DOCKER_SERVERS:
      - "https://index.docker.io/v2/"
      - "https://dhi.io/"

The following table describes the Docker registry credential fields:

Field

Description

Sample value

DOCKER_SERVER

URL of your private registry. Use this field when you deploy in an air-gapped environment and use a private Docker registry to pull container images.

"https://index.docker.io/v2/"

DOCKER_USERNAME

Registry username. For Docker Hub, the Docker Hub username.

"username"

DOCKER_PASSWORD

Registry password. For Docker Hub, the Docker Hub password.

"password"

DOCKER_SERVERS

List of servers that the cluster uses when it pulls container images directly from Docker Hub. Don't change the list.

"https://index.docker.io/v2/", "https://dhi.io/"

SMTP, GrowthBook, and infrastructure fields

This section describes the SMTP, GrowthBook, and infrastructure blocks in global-view-values.yaml. Each block includes a YAML sample and a table that describes its fields.

The SMTP configuration block sets the mail server that Global View uses to send notification emails. The block sits under cp-configs in global-view-values.yaml:

cp-configs:
  smtp:
    smtpHost: smtp.gmail.com
    smtpPort: "587"
    smtpUsername: ""
    smtpPassword: ""
    smtpFromEmail: "noreplies@virtana.com"
    smtpTlsInsecureSkipVerify: "false"

The following table describes the SMTP configuration fields:

Field

Description

Default value

smtpHost

SMTP server address.

smtp.gmail.com

smtpPort

SMTP port.

"587"

smtpUsername, smtpPassword

Authentication credentials for the SMTP server.

""

smtpFromEmail

Sender address for outgoing notification emails.

"noreplies@virtana.com"

smtpTlsInsecureSkipVerify

When set to "false", Global View verifies TLS certificates.

"false"

The GrowthBook configuration block sets the ingress, hostnames, and scheduling rules for the GrowthBook feature-flag service. The block appears in global-view-values.yaml as follows:

growthbook:
  ingress:
    enabled: true
    annotations:
      nginx.ingress.kubernetes.io/cors-allow-origin: "https://<GROWTH_BOOK_HOSTNAME>"
    appOriginName: <GROWTH_BOOK_HOSTNAME>
    apiHostName: <GROWTH_BOOK_API_HOSTNAME>
  affinity: *affinity
  nodeSelector: *nodeSelector
  tolerations: *tolerations

The following table describes the GrowthBook configuration fields:

Field

Description

Default value

ingress.enabled

Enables the ingress for the GrowthBook service.

true

nginx.ingress.kubernetes.io/cors-allow-origin

Restricts browser CORS requests to the GrowthBook UI hostname.

"https://<GROWTH_BOOK_HOSTNAME>"

ingress.appOriginName

Hostname for the GrowthBook web UI.

<GROWTH_BOOK_HOSTNAME>

ingress.apiHostName

Hostname for the GrowthBook API endpoint.

<GROWTH_BOOK_API_HOSTNAME>

affinity, nodeSelector, tolerations

Scheduling rules for the GrowthBook pods. The aliases reuse the global values.

*affinity, *nodeSelector, *tolerations

The storage and infrastructure blocks configure MongoDB, object storage, Redis, Kafka, PostgreSQL, and metrics. SeaweedFS replaces MinIO as the object storage backend, so the values file has no minio block. These blocks appear in global-view-values.yaml as follows:

cp-mongodb:
  affinity: *affinity
  nodeSelector: *nodeSelector
  tolerations: *tolerations
  migration:
    enabled: false
  persistence:
    size: 50Gi

seaweedfs:
  allInOne:
    data:
      type: persistentVolumeClaim
      size: 20Gi
      storageClass: *defaultStorageClass
    # Configure scheduling settings explicitly for SeaweedFS.
    # Global affinity, nodeSelector, and tolerations cannot be reused because
    # the SeaweedFS chart expects these values as templated strings instead of
    # native Kubernetes objects.
    nodeSelector: ""
    affinity: ""
    tolerations: ""

redis:
  persistentVolumeClaim:
    size: 50Gi
  resources:
    requests:
      cpu: 100m
      memory: 256Mi
    limits:
      cpu: 500m
      memory: 256Mi

strimzi-kafka-operator:
  controller:
    persistence:
      size: 50Gi

cloud-native-postgresql-cluster:
  affinity: *affinity

cp-metrics-service:
  victoria-metrics-single:
    rbac:
      create: true
      namespaced: true
    server:
      persistentVolume:
        storageClassName: *defaultStorageClass
        size: 16Gi

The following table describes the storage and infrastructure fields:

Field

Description

Default value

cp-mongodb.affinity, cp-mongodb.nodeSelector, cp-mongodb.tolerations

Scheduling rules for the MongoDB pods. The aliases reuse the global values.

*affinity, *nodeSelector, *tolerations

cp-mongodb.migration.enabled

Controls whether MongoDB data migrations run.

false

cp-mongodb.persistence.size

MongoDB storage for control plane documents.

50Gi

seaweedfs.allInOne.data.type

Storage type for SeaweedFS data.

persistentVolumeClaim

seaweedfs.allInOne.data.size

Object storage for files and artifacts. SeaweedFS replaces MinIO.

20Gi

seaweedfs.allInOne.data.storageClass

Storage class for the SeaweedFS PVC. The alias reuses the global default storage class.

*defaultStorageClass

seaweedfs.allInOne.nodeSelector, seaweedfs.allInOne.affinity, seaweedfs.allInOne.tolerations

Scheduling settings for SeaweedFS. Set them as strings, because the SeaweedFS chart expects templated strings instead of native Kubernetes objects.

""

redis.persistentVolumeClaim.size

Storage for Redis.

50Gi

redis.resources.requests.cpu, redis.resources.requests.memory

Minimum CPU and memory guaranteed to the Redis container.

100m, 256Mi

redis.resources.limits.cpu, redis.resources.limits.memory

Maximum CPU and memory that the Redis container can use.

500m, 256Mi

strimzi-kafka-operator.controller.persistence.size

Storage for the Strimzi Kafka operator controller state.

50Gi

cloud-native-postgresql-cluster.affinity

Scheduling rules for the PostgreSQL cluster pods. The alias reuses the global affinity.

*affinity

cp-metrics-service.victoria-metrics-single.rbac.create, cp-metrics-service.victoria-metrics-single.rbac.namespaced

Creates the RBAC resources for Victoria Metrics and scopes them to the namespace.

true, true

cp-metrics-service.victoria-metrics-single.server.persistentVolume.storageClassName

Storage class for the Victoria Metrics PVC. The alias reuses the global default storage class. In earlier releases, this parameter is named storageClass.

*defaultStorageClass

cp-metrics-service.victoria-metrics-single.server.persistentVolume.size

Size of the volume for the time-series metrics database.

16Gi

Alerts service and SolrCloud values

The alerts-service block configures the alerts database and SolrCloud. Two values in this block depend on the version that you upgrade from:

Field

Upgrade from 2026.6.1

Upgrade from 2026.4.1

alerts-service.solr.enabled

false

true

alerts-service.solr.migration.enabled

false

true

If you upgrade from 2026.6.1, set both values to false, because your SolrCloud data is already migrated. If you upgrade from 2026.4.1, set both values to true so that the SolrCloud migration runs during the upgrade.

For an upgrade from 2026.6.1, the alerts-service block looks like this:

alerts-service:
  solrdb:
    enabled: false
    persistent_ebs:
      spec:
        resources:
          requests:
            storage: 100Gi
  solr:
    enabled: false
    migration:
      enabled: false
      storageSize: "50Gi"
      resources:
        requests:
          cpu: 100m
          memory: 1Gi
        limits:
          cpu: 500m
          memory: 1Gi
    persistence:
      size: 50Gi
    zookeeper:
      persistence:
        size: 20Gi

For an upgrade from 2026.4.1, the alerts-service block looks like this:

alerts-service:
  solrdb:
    enabled: false
    persistent_ebs:
      spec:
        resources:
          requests:
            storage: 100Gi
  solr:
    enabled: true
    migration:
      enabled: true
      storageSize: "50Gi"
      resources:
        requests:
          cpu: 100m
          memory: 1Gi
        limits:
          cpu: 500m
          memory: 1Gi
    persistence:
      size: 50Gi
    zookeeper:
      persistence:
        size: 20Gi

The following table describes the other fields in the alerts-service block. For the full list of SolrCloud migration fields, see Configure the SolrCloud migration.

Field

Description

Value in sample file

alerts-service.solrdb.enabled

Enables the SolrDB component.

false

alerts-service.solrdb.persistent_ebs.spec.resources.requests.storage

Storage size for the EBS-backed Solr database that indexes alerts.

100Gi

alerts-service.solr.migration.storageSize

Size of the PVC that the SolrCloud migration job uses. Set it to the same size as the SolrCloud PVC.

50Gi

alerts-service.solr.migration.resources.requests.cpu, alerts-service.solr.migration.resources.requests.memory

Minimum CPU and memory guaranteed to the migration container.

100m, 1Gi

alerts-service.solr.migration.resources.limits.cpu, alerts-service.solr.migration.resources.limits.memory

Maximum CPU and memory that the migration container can use.

500m, 1Gi

alerts-service.solr.persistence.size

Disk size for Solr.

50Gi

alerts-service.solr.zookeeper.persistence.size

ZooKeeper persistence volume size for the Solr coordination service.

20Gi

Optional private registry and OpenShift settings

This section describes two optional configurations. If you pull container images from your own registry, create a private container registry override file. If you deploy Global View on an OpenShift cluster, set the OpenShift security contexts.

A private container registry override is needed only when you want to use your own container image registry instead of Virtana's official Docker registry. To use your own registry, create a file named global-view-image-registry.yaml, and replace every occurrence of <REGISTRY_NAME> with the name of your registry:

global:
  ## Replace all occurrences of <REGISTRY_NAME> in this file with your custom image registry
  image_registry: <REGISTRY_NAME>     ## For Virtana images
  imageRegistry: <REGISTRY_NAME>      ## For open source images

growthbook:
  image:
    repository: <REGISTRY_NAME>/growthbook

redis:
  image:
    repository: <REGISTRY_NAME>/redis

cloudnative-pg:
  image:
    repository: <REGISTRY_NAME>/cloudnative-pg

cloud-native-postgresql-cluster:
  image:
    registry: <REGISTRY_NAME>

strimzi-kafka-operator:
  defaultImageRegistry: <REGISTRY_NAME>

seaweedfs:
  image:
    registry: <REGISTRY_NAME>

cp-mongodb:
  image:
    registry: <REGISTRY_NAME>

cp-metrics-service:
  victoria-metrics-single:
    server:
      image:
        repository: <REGISTRY_NAME>/victoria-metrics

alerts-service:
  solr:
    image:
      registry: <REGISTRY_NAME>
    migration:
      image:
        registry: <REGISTRY_NAME>
    zookeeper:
      image:
        registry: <REGISTRY_NAME>

infra-crds:
  kafka:
    apiConversion:
      image:
        registry: <REGISTRY_NAME>

When you use a private container registry, add -f global-view-image-registry.yaml \ to each of the helm upgrade --install commands in ???.

Important

If you already have a global-view-image-registry.yaml file from an earlier release, add the infra-crds.kafka.apiConversion.image.registry value to it. This value sets the image registry for the infra-crds Kafka API conversion component that version 2026.9.1 introduces.

To deploy Global View on an OpenShift Kubernetes cluster, you must set the security contexts correctly. On OpenShift, the IDs that you set for runAsUser, runAsGroup, and fsGroup must fall within the range that the target OpenShift cluster allows.

Add the following values to global-view-values.yaml, and replace <user_id>, <group_id>, and <fsgroup_id> with values that your OpenShift cluster allows:

redis:
  securityContext:
    runAsUser: <user_id>
    runAsGroup: <group_id>
    fsGroup: <fsgroup_id>

strimzi-kafka-operator:
  podSecurityContext:
    fsGroup: <fsgroup_id>

  securityContext:
    runAsUser: <user_id>
    runAsGroup: <group_id>

cp-mongodb:
  securityContext:
    runAsUser: <user_id>
    runAsGroup: <group_id>
  podSecurityContext:
    fsGroup: <fsgroup_id>

cloudnative-pg:
  containerSecurityContext:
    runAsUser: <user_id>
    runAsGroup: <group_id>

  podSecurityContext:
    fsGroup: <fsgroup_id>

alerts-service:
  solr:
    securityContext:
      runAsUser: <user_id>
      runAsGroup: <group_id>
    podSecurityContext:
      fsGroup: <fsgroup_id>

    zookeeper:
      securityContext:
        runAsUser: <user_id>
        runAsGroup: <group_id>
      podSecurityContext:
        fsGroup: <fsgroup_id>

    # Add this if you are running solr migration
    migration:
      securityContext:
        runAsUser: <user_id>
        runAsGroup: <group_id>
      podSecurityContext:
        fsGroup: <fsgroup_id>

infra-crds:
  kafka:
    apiConversion:
      securityContext:
        runAsUser:  <user_id>
        runAsGroup: <group_id>
      podSecurityContext:
        fsGroup: <fsgroup_id>

Note

Include the alerts-service.solr.migration block only if you run the SolrCloud migration, which applies when you upgrade from 2026.4.1. The infra-crds.kafka.apiConversion block is new in 2026.9.1.

Deploy Global View

To upgrade Global View, you deploy three Helm releases in order. All three releases use the virtana-repo/virtana-global-view Helm chart and deploy to the controlplane namespace. The phased order upgrades the custom resource definitions (CRDs), the infrastructure modules, and the service modules in a controlled sequence that respects their dependencies.

Deploy the releases in the following order:

  1. controlplane-crds: installs and patches the CRDs, including the Strimzi Kafka CRDs.

  2. controlplane-infra: deploys the infrastructure modules, including the Strimzi Kafka operator.

  3. controlplane-service: deploys the Global View service modules.

Note

If you use a private container registry, add -f global-view-image-registry.yaml \ to each helm upgrade --install command in this section. For the contents of the file, see Optional private registry and OpenShift settings.

Find the latest chart version

Before you deploy, update your local Helm repository index and find the latest version of the virtana-repo/virtana-global-view chart. Use this version in place of <LATEST_VERSION> in the commands in this section:

# Check latest version of virtana-repo/virtana-global-view
helm repo update
helm search repo virtana-repo/virtana-global-view

Deploy custom resource definitions (CRDs)

Deploy the controlplane-crds Helm release first. This release installs the Global View custom resource definitions (CRDs) and patches the Strimzi Kafka CRDs for version 1.2 of the Strimzi Kafka operator.

Important

Provide the --server-side=true and --force-conflicts flags in the helm upgrade command for the controlplane-crds release. The flags make sure that the CRDs upgrade successfully. In Argo CD, enable the ServerSideApply=true sync option. In Terraform, set server_side_apply = true and force_conflicts = true.

You can deploy the release with the Helm CLI, Argo CD, or Terraform. Use the section for the tool that you use.

Run the following command:

helm upgrade --install controlplane-crds virtana-repo/virtana-global-view \
  --namespace controlplane --create-namespace \
  --set tags.crds=true -f global-view-values.yaml \
  --version <LATEST_VERSION> \
  --server-side=true --force-conflicts

Create an Argo CD application manifest named virtana-cp-crds.yaml with the following content. The ServerSideApply=true sync option applies the CRDs by using server-side apply. Replace <contents of global-view-values.yaml> with the contents of your values file:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: virtana-cp-crds
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  destination:
    server: "https://kubernetes.default.svc"
    namespace: controlplane
  source:
    chart: virtana-global-view
    repoURL: "https://virtana.gitlab.io/helm-charts/"
    targetRevision: <LATEST_VERSION> # Provide latest version
    helm:
      releaseName: controlplane-crds
      parameters:
        - name: "tags.crds"
          value: "true"
      values: |
        <contents of global-view-values.yaml>
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
    - ServerSideApply=true

Add the following resource to a Terraform file named virtana-cp-crds.tf. The server_side_apply and force_conflicts arguments apply the CRDs by using server-side apply, and the timeout argument sets a 1,200-second timeout for the release:

resource "helm_release" "cp-crds" {
  create_namespace = true
  chart            = "virtana-global-view"
  name             = "controlplane-crds"
  namespace        = "controlplane"
  repository       = "https://virtana.gitlab.io/helm-charts"
  version          = var.helm_version
  timeout          = 1200
  wait             = true
  server_side_apply = true
  force_conflicts   = true
  values = [
    templatefile("${path.module}/../values/controlplane-values.yaml", {
      storage_class             = var.storageclass
      docker_password           = var.docker_password
      docker_username           = var.docker_username
      keycloak_hostname         = var.keycloak_hostname
      keycloak_password         = var.keycloak_password
      keycloak_username         = var.keycloak_username
      global_view_hostname      = var.global_view_hostname
      tenant_name               = var.tenant_name
      user_first_name           = var.user_first_name
      user_last_name            = var.user_last_name
      user_email                = var.user_email
      smtp_from_mail            = var.smtp_from_mail
      smtp_password             = var.smtp_password
      smtp_port                 = var.smtp_port
      smtp_server               = var.smtp_server
      smtp_to_mail              = var.smtp_to_mail
      smtp_username             = var.smtp_username
      growthbook_hostname       = var.growthbook_hostname
      growthbook_api_hostname   = var.growthbook_api_hostname
    })
  ]

  set {
    name  = "tags.crds"
    value = "true"
  }
}

Deploy infrastructure modules

Deploy the controlplane-infra Helm release after the controlplane-crds release finishes. This release deploys the infrastructure modules, including the latest version of the Strimzi Kafka operator.

Important

Provide the --server-side=true and --force-conflicts flags in the helm upgrade command for the controlplane-infra release. The flags make sure that the Kafka custom resources (CRs) upgrade successfully. In Argo CD, enable the ServerSideApply=true sync option. In Terraform, set server_side_apply = true and force_conflicts = true.

Note

After you deploy the controlplane-crds release, the Strimzi Kafka operator can stay in the CrashLoopBackOff state until you deploy the controlplane-infra release. This behavior is expected. For details, see Strimzi Kafka operator in CrashLoopBackOff after deploying controlplane-crds.

You can deploy the release with the Helm CLI, Argo CD, or Terraform. Use the section for the tool that you use.

Run the following command:

helm upgrade --install controlplane-infra virtana-repo/virtana-global-view \
  --namespace controlplane --create-namespace \
  --set tags.infra=true -f global-view-values.yaml \
  --version <LATEST_VERSION> \
  --server-side=true --force-conflicts

Create an Argo CD application manifest named virtana-cp-infra.yaml with the following content. The ServerSideApply=true sync option applies the release by using server-side apply. Replace <contents of global-view-values.yaml> with the contents of your values file:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: virtana-cp-infra
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  destination:
    server: "https://kubernetes.default.svc"
    namespace: controlplane
  source:
    chart: virtana-global-view
    repoURL: "https://virtana.gitlab.io/helm-charts/"
    targetRevision: <LATEST_VERSION> # Provide latest version
    helm:
      releaseName: controlplane-infra
      parameters:
        - name: "tags.infra"
          value: "true"
      values: |
        <contents of global-view-values.yaml>
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
    - ServerSideApply=true

Add the following resource to a Terraform file named virtana-cp-infra.tf. The server_side_apply and force_conflicts arguments apply the release by using server-side apply, and the timeout argument sets a 1,200-second timeout for the release:

resource "helm_release" "cp-infra" {
  create_namespace = true
  chart            = "virtana-global-view"
  name             = "controlplane-infra"
  namespace        = "controlplane"
  repository       = "https://virtana.gitlab.io/helm-charts"
  version          = var.helm_version
  timeout          = 1200
  wait             = true
  server_side_apply = true
  force_conflicts   = true
  values = [
    templatefile("${path.module}/../values/controlplane-values.yaml", {
      storage_class             = var.storageclass
      docker_password           = var.docker_password
      docker_username           = var.docker_username
      keycloak_hostname         = var.keycloak_hostname
      keycloak_password         = var.keycloak_password
      keycloak_username         = var.keycloak_username
      global_view_hostname      = var.global_view_hostname
      tenant_name               = var.tenant_name
      user_first_name           = var.user_first_name
      user_last_name            = var.user_last_name
      user_email                = var.user_email
      smtp_from_mail            = var.smtp_from_mail
      smtp_password             = var.smtp_password
      smtp_port                 = var.smtp_port
      smtp_server               = var.smtp_server
      smtp_to_mail              = var.smtp_to_mail
      smtp_username             = var.smtp_username
      growthbook_hostname       = var.growthbook_hostname
      growthbook_api_hostname   = var.growthbook_api_hostname
    })
  ]

  set {
    name  = "tags.infra"
    value = "true"
  }
}

Deploy service modules

Deploy the controlplane-service Helm release last. This release deploys the Global View service modules. The command sets a timeout of 1 hour (--timeout 1h). If you upgrade from version 2026.4.1, the SolrCloud migration runs during this release, and the 1-hour timeout gives the migration enough time to finish.

You can deploy the release with the Helm CLI, Argo CD, or Terraform. Use the section for the tool that you use.

Run the following command:

helm upgrade --install controlplane-service virtana-repo/virtana-global-view \
  --namespace controlplane --create-namespace \
  --set tags.service=true -f global-view-values.yaml \
  --version <LATEST_VERSION> --timeout 1h

Create an Argo CD application manifest named virtana-cp-service.yaml with the following content. Replace <contents of global-view-values.yaml> with the contents of your values file:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: virtana-cp-service
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  destination:
    server: "https://kubernetes.default.svc"
    namespace: controlplane
  source:
    chart: virtana-global-view
    repoURL: "https://virtana.gitlab.io/helm-charts/"
    targetRevision: <LATEST_VERSION> # Provide latest version
    helm:
      releaseName: controlplane-service
      parameters:
        - name: "tags.service"
          value: "true"
      values: |
        <contents of global-view-values.yaml>
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true

Add the following resource to a Terraform file named virtana-cp-service.tf. The timeout argument sets a 3,600-second (1-hour) timeout for the release:

resource "helm_release" "cp-service" {
  create_namespace = true
  chart            = "virtana-global-view"
  name             = "controlplane-service"
  namespace        = "controlplane"
  repository       = "https://virtana.gitlab.io/helm-charts"
  version          = var.helm_version
  timeout          = 3600
  wait             = true
  values = [
    templatefile("${path.module}/../values/controlplane-values.yaml", {
      storage_class             = var.storageclass
      docker_password           = var.docker_password
      docker_username           = var.docker_username
      keycloak_hostname         = var.keycloak_hostname
      keycloak_password         = var.keycloak_password
      keycloak_username         = var.keycloak_username
      global_view_hostname      = var.global_view_hostname
      tenant_name               = var.tenant_name
      user_first_name           = var.user_first_name
      user_last_name            = var.user_last_name
      user_email                = var.user_email
      smtp_from_mail            = var.smtp_from_mail
      smtp_password             = var.smtp_password
      smtp_port                 = var.smtp_port
      smtp_server               = var.smtp_server
      smtp_to_mail              = var.smtp_to_mail
      smtp_username             = var.smtp_username
      growthbook_hostname       = var.growthbook_hostname
      growthbook_api_hostname   = var.growthbook_api_hostname
    })
  ]

  set {
    name  = "tags.service"
    value = "true"
  }
}

Verify the upgrade

To confirm that Global View is accessible after the upgrade, complete the following steps:

  1. Open your web browser and go to https://<global_view_hostname>/ui. Replace <global_view_hostname> with the hostname that you defined during configuration.

  2. Sign in with the organization email address and the password that you set during registration.

    When the UI loads and sign-in succeeds, the upgrade is complete.

  3. If you upgraded from version 2026.4.1, open the alerts view and confirm that your alerts data appears. Alerts data confirms that the SolrCloud migration restored your data successfully.

  4. If you stopped traffic to the cluster before the SolrCloud migration, resume the traffic. Then complete the cleanup tasks in After the SolrCloud migration completes.

Troubleshooting

This section describes issues that you might see when you upgrade Global View to version 2026.9.1, and how to resolve them.

Failure while deploying the controlplane-infra Helm release

In rare cases, the deployment of the controlplane-infra Helm release fails after you upgrade the controlplane-crds Helm release. The failure is intermittent.

Version 2026.9.1 upgrades the Strimzi Kafka operator to version 1.2. During the controlplane-crds installation, Helm patches the Strimzi Kafka CRDs and custom resources. Helm might keep cached information about the CRDs and custom resources, and this cached information can cause the controlplane-infra deployment to fail.

When this issue occurs, the controlplane-infra deployment returns an error like the following:

level=WARN msg="upgrade failed" name=controlplane-infra error="server-side apply failed for object controlplane/controlplane-infra kafka.strimzi.io/v1, Kind=Kafka: request to convert CR to an invalid group/version: kafka.strimzi.io/v1beta2"
Error: UPGRADE FAILED: server-side apply failed for object controlplane/controlplane-infra kafka.strimzi.io/v1, Kind=Kafka: request to convert CR to an invalid group/version: kafka.strimzi.io/v1beta2

To resolve this issue, complete the following steps:

  1. Redeploy the controlplane-crds Helm release with the --force-conflicts and --server-side flags. The flags make sure that the CRDs and custom resources are patched correctly, and the redeployment updates the Helm cache with the latest deployed CRD version.

  2. After the controlplane-crds release redeploys successfully, redeploy the controlplane-infra Helm release.

Redeploying the two releases in this order should resolve the issue, and the controlplane-infra release then deploys successfully. For the deployment commands, see Deploy custom resource definitions and Deploy infrastructure modules.

Strimzi Kafka operator in CrashLoopBackOff after deploying controlplane-crds

The Strimzi Kafka operator can stay in the CrashLoopBackOff state after you install the controlplane-crds Helm release. This behavior is expected.

The controlplane-crds installation patches and upgrades the Kafka CRDs to the latest version, and the Strimzi Kafka operator restarts after that. The operator still runs the previous version, so it keeps crashing.

To continue, deploy the controlplane-infra Helm release. This release deploys the latest version of the Strimzi Kafka operator, and the operator then starts successfully.