Global View upgrade (2026.6.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 from version 2026.4.1 to version 2026.6.1.
Prerequisites
Before you upgrade Global View to 2026.6.1, confirm that your environment meets the following requirements:
An existing Virtana Platform installation running version 2026.4.1.
A Kubernetes cluster with Helm 3.x installed.
Access to the Virtana Helm repository.
Valid Docker registry credentials.
DNS records configured for the Global View, Keycloak, and GrowthBook hostnames.
What's new in 2026.6.1
Version 2026.6.1 changes several parts of the Global View values files. Review these changes before you prepare your configuration:
SolrCloud data migration runs by default and can resize persistent volume claims (PVCs).
SeaweedFS replaces MinIO as the object storage backend.
The Victoria Metrics
storageClassparameter is renamed tostorageClassName.VirtanAI (Copilot) uses a provider-based configuration instead of
OPENAI_API_KEY.
Setup for upgrading to version 2026.6.1
Complete the preparation described in this section before you run any Helm command. If you aren't ready to migrate SolrCloud data, prepare for the migration first and upgrade afterward.
In version 2026.6.1, SolrCloud migration is enabled by default. The migration moves your existing Solr and ZooKeeper data to new SolrCloud pods, using a dedicated persistent volume claim (PVC) as temporary storage. Alerts data is unavailable in the Global View UI until the migration finishes.
The migration can also resize your Solr and ZooKeeper PVCs. Confirm that your storage class allows resizing before you start.
Check the storage class and PVC usage
The SolrCloud migration job resizes your Solr and ZooKeeper persistent volume claims (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 the 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 writes 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 above 45% means that 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 it after the migration finishes and you can see 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 the role needs:
Kubernetes resource | Required permissions | Impact |
|---|---|---|
StatefulSets named | get, list, watch, patch, update | To update and patch the Solr and ZooKeeper StatefulSets |
Pods | get, list, watch, create, delete, exec | To update and restart the Solr and ZooKeeper pods during migration |
PersistentVolumeClaims | get, list, watch, create, update, patch, delete | To create, update, delete, and resize PVCs |
Deployments | get, list, watch | To monitor the progress of the alerts-service deployment during 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 they come online. Both phases run as Kubernetes jobs, and both use a persistent volume claim (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 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 2026.6.1 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 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 in version 2026.6.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 fields in the global configuration block:
Field | Description | Default values |
|---|---|---|
| Toggles the migration job on or off. When true, the migration process is activated. | true |
| Size of the Persistent Volume Claim (PVC) provisioned for the migration job. Should match the size of the SolrCloud PVC to ensure sufficient space during data transfer. | 100 Gi |
| The migration job will trigger a PVC resize only if current disk usage exceeds 45% of total capacity. Acts as a safeguard to avoid unnecessary resize operations. Only applies when | 45 |
| Minimum CPU guaranteed to the container. | 100m |
| Minimum memory guaranteed. | 1Gi |
| Maximum CPU the container can use. | 500m |
| Maximum memory the container can consume. | 1Gi |
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-pvcpersistent volume claim (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.Delete the Solr and ZooKeeper PVCs from the previous deployment to free up storage, again 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 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: *nodeSelector
affinity: *affinity
tolerations: *tolerationsNote
Check the storageClass value in the SeaweedFS configuration and confirm that it matches a storage class that exists in your Kubernetes environment. An unmatched storage class prevents the SeaweedFS persistent volume claim (PVC) from binding.
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 2026.6.1, VirtanAI (the Copilot chatbot) uses a provider-based configuration model that supports OpenAI, Gemini, and LiteLLM. This model replaces the single OPENAI_API_KEY variable used in earlier releases.
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 VirtanAI configuration fields:
Field | Description | Default value |
|---|---|---|
| Enables the VirtanAI (Copilot) component. |
|
| Selects the model provider. Supported values: |
|
| API key for the selected provider. 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 |
|
Set the following variables in the input.env file:
VIRTANA_AI_MODEL_PROVIDER='' VIRTANA_AI_API_KEY='' VIRTANA_AI_INFERENCE_ENDPOINT=''
The following table maps VirtanAI setting to its OVA configuration.
OVA Variables | Description |
|---|---|
| Selects the model provider. Supported values: OPENAI, GEMINI, LITELLM. |
| API key for the selected provider. Replaces the former OPENAI_API_KEY variable. |
| Inference endpoint URL. Leave blank for OpenAI or Gemini. For a self-hosted LiteLLM deployment, set the LiteLLM endpoint URL, for example |
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 following content, and change the values to match your environment as described in the comments:
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: 20GiThe following table describes the fields in the global configuration block:
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. |
|
| Configures the PostgreSQL database that backs the platform. | — |
| Controls whether database migration jobs run automatically. Keep this value set to |
|
| 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 used to pull container images from a Docker registry. | — |
| URL of your private registry. Use this when you deploy in an air-gapped environment. |
|
| Registry username. |
|
| Registry password. |
|
| List of servers used when you pull images directly from Docker Hub. Don't change the list. |
|
| Integrates the platform with a Keycloak identity provider. | — |
| Public hostname where Keycloak is accessible. |
|
| Credentials for the Keycloak admin account that configures realms, clients, and users. |
|
| Main DNS name for the Global View UI. |
|
| Suffix used to construct additional hostnames for auxiliary services. |
|
| Metadata about the tenant or organization. | — |
| Tenant or company name. |
|
| Primary contact person. |
|
| Contact email for notifications and support. |
|
| Controls TLS certificate handling. |
|
| 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 ( |
|
The SMTP configuration block sets the mail server that Global View uses to send notification emails. Add the following block 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. Add the following block to global-view-values.yaml:
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 |
|---|---|---|
| Restricts browser CORS requests to the GrowthBook UI hostname. |
|
| Hostname for the GrowthBook web UI. |
|
| Hostname for the GrowthBook API endpoint. |
|
The storage and infrastructure block configures MongoDB, object storage, Redis, Kafka, PostgreSQL, metrics, and alerts. In 2026.6.1, SeaweedFS replaces MinIO as the object storage backend, so the minio block is removed. Add the following block to global-view-values.yaml:
cp-mongodb:
affinity: *affinity
nodeSelector: *nodeSelector
tolerations: *tolerations
migration:
enabled: false
persistence:
size: 50Gi
seaweedfs:
image:
registry: <REGISTRY_NAME>
allInOne:
data:
type: persistentVolumeClaim
size: 20Gi
storageClass: *defaultStorageClass
nodeSelector: *nodeSelector
affinity: *affinity
tolerations: *tolerations
redis:
persistentVolumeClaim:
existingPersistentVolumeClaim: "redis-data-controlplane-infra-redis-master-0"
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:
size: 100Gi
alerts-service:
solrdb:
enabled: true
persistent_ebs:
spec:
resources:
requests:
storage: 100Gi
solr:
enabled: false
persistence:
size: 50Gi
zookeeper:
persistence:
size: 20GiThe following table describes the storage and infrastructure fields:
Field | Description | Default value |
|---|---|---|
| Controls whether MongoDB data migrations run. |
|
| MongoDB storage for control plane documents. |
|
| Object storage for files and artifacts. SeaweedFS replaces MinIO in 2026.6.1. |
|
| Image registry for SeaweedFS. Set this for private-registry deployments. |
|
| Reuses the existing Redis PVC from the prior installation to preserve data during the upgrade. | — |
| Storage for the Strimzi Kafka operator controller state. |
|
| Time-series metrics database size. RBAC is namespaced. |
|
| Enables the SolrDB component. |
|
| EBS-backed Solr database for alert indexing. |
|
| Enables the in-chart Solr deployment. |
|
| Disk size for Solr. |
|
| ZooKeeper persistence volume size for the Solr coordination service. |
|
Note
For an upgrade, Redis references an existingPersistentVolumeClaim instead of creating new storage. This preserves data continuity from the previous Redis deployment.
Note
SeaweedFS replaces MinIO in 2026.6.1. Remove all MinIO configuration from global-view-values.yaml. Existing MinIO data is migrated automatically during the upgrade. If you don't provide a SeaweedFS block, Global View deploys SeaweedFS with default settings.
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/"A private container registry override is needed only when you want to use your own container image registry instead of the official Virtana Docker registry. To use your own registry, create a file named global-view-image-registry.yaml and replace every occurrence of <REGISTRY_NAME> with 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>When you use a private container registry, add -f global-view-image-registry.yaml \ to each of the helm upgrade --install commands in Deploying Global View.
To deploy Global View on an OpenShift Kubernetes cluster, you must set the security contexts correctly. On OpenShift, the IDs 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>
migration:
securityContext:
runAsUser: <user_id>
runAsGroup: <group_id>
podSecurityContext:
fsGroup: <fsgroup_id>Private container registry override (optional)
Create a file named global-view-image-registry.yaml to pull images from your own container image registry instead of Virtana's official Docker registry. For the full list of override values, see Overriding the private container registry.
Note
When you build global-view-image-registry.yaml for 2026.6.1, apply these changes: remove the minio block, set the SeaweedFS image registry through seaweedfs.image.registry in global-view-values.yaml, and change the Redis image repository from redis to dhi-redis.
Deploy Global View
In this step, you apply the prepared Helm values and image registry overrides to roll out the upgraded Global View stack to your Kubernetes or OpenShift cluster. The deployment runs in three phases — CRDs, infrastructure modules, and service modules, so that custom resources, storage, messaging, and application services are created and upgraded in a controlled, dependency-aware order. All three phases use the virtana-repo/virtana-global-view Helm chart.
For the detailed deployment commands, see Deploying Global View.
Note
The Keycloak container image changes from quay.io/keycloak/keycloak:26.3 to dhi.io/keycloak:26 in 2026.6.1. Keycloak deploys from a separate chart in the keycloak namespace. Apply the Keycloak image update during the same maintenance window as the Global View upgrade.
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 you defined during configuration.Sign in with the organization email address and the password you created during registration.
When the UI loads and sign-in succeeds, the upgrade is complete.
Open the alerts view and confirm that your alerts data appears. Alerts data confirms that the SolrCloud migration restored your data successfully.