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
allowVolumeExpansionset totrue.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 | 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 |
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:
The upgrade creates the
solrcloud-backup-pvcPVC for the migration job.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.
The same job patches the existing SolrCloud StatefulSet with the parameters that the migration requires, and waits for the SolrCloud pods to come online.
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.The job writes a
backup.completemarker 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:
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.
After all new Solr and ZooKeeper pods are running, a second migration job starts and restores the backup to the new SolrCloud pods.
The restore job copies the data from
solrcloud-backup-pvcto a temporary location on each SolrCloud pod, inserts the data by using the Solr API, and then deletes the temporary data from the pods.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: 1GiThe following table describes the SolrCloud migration fields:
Field | Description | Default value |
|---|---|---|
| Turns the migration job on or off. When |
|
| 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. |
|
| 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 |
|
| Minimum CPU guaranteed to the migration container. |
|
| Minimum memory guaranteed to the migration container. |
|
| Maximum CPU that the migration container can use. |
|
| Maximum memory that the migration container can use. |
|
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.enabledtofalseinglobal-view-values.yaml. This setting prevents the migration job from running again during future upgrades.Keep the
solrcloud-backup-pvcPVC 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: 16GiIn 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 |
|---|---|---|
| Enables the Virtana AI (Copilot) component. |
|
| Selects the model provider. Supported values: |
|
| API key for the selected provider (OpenAI, Gemini, or LiteLLM). Replaces the former |
|
| Inference endpoint URL. Leave blank for OpenAI or Gemini. For a self-hosted LiteLLM deployment, set the LiteLLM endpoint URL, for example |
|
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: 20GiUse 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: 20GiGlobal fields and Docker registry credentials
The following table describes the fields in the global block of global-view-values.yaml:
Field | Description | Default value |
|---|---|---|
| Controls the behavior of the NGINX Ingress for the control plane. | — |
| Controls automatic HTTP-to-HTTPS redirection. |
|
| When enabled, forces all incoming traffic to be served over HTTPS. |
|
| Size of the persistent volume for PostgreSQL. |
|
| Deployment environment name or type. |
|
| Specifies where secrets come from. Supported values: |
|
| Default Kubernetes StorageClass for persistent volume claims (PVCs). If blank, the cluster default StorageClass is used. |
|
| Credentials that the cluster uses to pull container images from a Docker registry. Use | — |
| Public hostname where Keycloak is accessible. |
|
| Credentials for the Keycloak admin account that configures realms, clients, and users. Replace |
|
| Main DNS name for the Global View UI. Replace the placeholder with your Global View hostname. |
|
| Suffix that the deployment uses to build additional hostnames for auxiliary services. Replace the placeholder with your Global View hostname. |
|
| Tenant or company name. |
|
| Primary contact person. |
|
| Contact email address for notifications and support. |
|
| When |
|
| Kubernetes pod affinity and anti-affinity rules. An empty value ( |
|
| Maps pods to nodes by label. An empty value ( |
|
| Allows pods to schedule onto tainted nodes. An empty value ( |
|
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 |
|---|---|---|
| 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. |
|
| Registry username. For Docker Hub, the Docker Hub username. |
|
| Registry password. For Docker Hub, the Docker Hub password. |
|
| List of servers that the cluster uses when it pulls container images directly from Docker Hub. Don't change the list. |
|
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 |
|---|---|---|
| SMTP server address. |
|
| SMTP port. |
|
| Authentication credentials for the SMTP server. |
|
| Sender address for outgoing notification emails. |
|
| When set to |
|
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: *tolerationsThe following table describes the GrowthBook configuration fields:
Field | Description | Default value |
|---|---|---|
| Enables the ingress for the GrowthBook service. |
|
| Restricts browser CORS requests to the GrowthBook UI hostname. |
|
| Hostname for the GrowthBook web UI. |
|
| Hostname for the GrowthBook API endpoint. |
|
| Scheduling rules for the GrowthBook pods. The aliases reuse the global values. |
|
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: 16GiThe following table describes the storage and infrastructure fields:
Field | Description | Default value |
|---|---|---|
| Scheduling rules for the MongoDB pods. The aliases reuse the global values. |
|
| Controls whether MongoDB data migrations run. |
|
| MongoDB storage for control plane documents. |
|
| Storage type for SeaweedFS data. |
|
| Object storage for files and artifacts. SeaweedFS replaces MinIO. |
|
| Storage class for the SeaweedFS PVC. The alias reuses the global default storage class. |
|
| Scheduling settings for SeaweedFS. Set them as strings, because the SeaweedFS chart expects templated strings instead of native Kubernetes objects. |
|
| Storage for Redis. |
|
| Minimum CPU and memory guaranteed to the Redis container. |
|
| Maximum CPU and memory that the Redis container can use. |
|
| Storage for the Strimzi Kafka operator controller state. |
|
| Scheduling rules for the PostgreSQL cluster pods. The alias reuses the global affinity. |
|
| Creates the RBAC resources for Victoria Metrics and scopes them to the namespace. |
|
| Storage class for the Victoria Metrics PVC. The alias reuses the global default storage class. In earlier releases, this parameter is named |
|
| Size of the volume for the time-series metrics database. |
|
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 |
|---|---|---|
|
|
|
|
|
|
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: 20GiFor 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: 20GiThe 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 |
|---|---|---|
| Enables the SolrDB component. |
|
| Storage size for the EBS-backed Solr database that indexes alerts. |
|
| Size of the PVC that the SolrCloud migration job uses. Set it to the same size as the SolrCloud PVC. |
|
| Minimum CPU and memory guaranteed to the migration container. |
|
| Maximum CPU and memory that the migration container can use. |
|
| Disk size for Solr. |
|
| ZooKeeper persistence volume size for the Solr coordination service. |
|
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:
controlplane-crds: installs and patches the CRDs, including the Strimzi Kafka CRDs.controlplane-infra: deploys the infrastructure modules, including the Strimzi Kafka operator.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=trueAdd 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=trueAdd 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=trueAdd 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:
Open your web browser and go to
https://<global_view_hostname>/ui. Replace<global_view_hostname>with the hostname that you defined during configuration.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.
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.
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:
Redeploy the
controlplane-crdsHelm release with the--force-conflictsand--server-sideflags. 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.After the
controlplane-crdsrelease redeploys successfully, redeploy thecontrolplane-infraHelm 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.