For the complete documentation index, see llms.txt. Markdown versions of all docs pages are available by appending .md to any docs URL.
Install the UI
Install the Solo UI alongside your service mesh in one cluster or across a multicluster service mesh.
The Solo UI deploys alongside your Istio ambient mesh environment in single or multicluster environments, and can discover existing ambient mesh installations across clusters and infrastructure providers. The UI works with ambient service meshes, whether you use community Istio images or Solo distributions of Istio.
Known limitations
Multicluster services are exposed on *.mesh.internal hostnames with auto-allocated virtual IPs (PILOT_ENABLE_IP_AUTOALLOCATE). Istio assigns both an IPv4 and an IPv6 VIP to each of these services. On a single-stack IPv4 cluster, pods have no usable IPv6 address, so a client that prefers IPv6 tries the IPv6 VIP first, fails, and falls back to the IPv4 VIP. You might see warnings like the following in client logs, such as the Solo UI telemetry relay or collectors:
dial tcp [2001:2::2]:4316: connect: network is unreachable
Note
This is expected and not a failure on its own. The connection falls back to IPv4 and traffic flows normally. Some clients, such as gRPC-based ones, log the IPv6 attempt repeatedly while still sending data over IPv4. To suppress the warnings on a cluster with no usable IPv6, set the IPV6_ENABLED environment variable to false on ztunnel (the default is true); ztunnel then returns only the IPv4 VIP.
Single cluster
Deploy the Solo UI alongside your service mesh in one cluster.
If you have not already, install an ambient mesh in your cluster and deploy apps to the mesh.
Save the following details in environment variables.
SOLO_UI_VERSION: The Solo UI version. This example uses the latest version. You can find other versions in the version reference.cluster1: The name of the Kubernetes or OpenShift cluster where you deployed an ambient mesh.SOLO_ISTIO_LICENSE_KEY: Your Enterprise-level license key for Solo Enterprise for Istio. If you do not have one, contact an account representative. If you prefer to specify license keys in a secret instead, see Licensing.
export SOLO_UI_VERSION=0.5.3 export cluster1=<cluster_name> export SOLO_ISTIO_LICENSE_KEY=<license_key>Create the
solo-enterprisenamespace and label it for inclusion in the ambient mesh.kubectl create namespace solo-enterprise kubectl label namespace solo-enterprise istio.io/dataplane-mode=ambientInstall the UI. The following options enable all settings that are required for a single-cluster installation. To see all possible fields for the Helm chart, review the Helm values reference.
oidc.issuer=""enables the auto identity provider, a built-in IdP with hardcoded users for development and testing. To use your own OIDC provider instead, set this value to your OIDC issuer URL.- With
products.mesh.enabled=true, any authenticated user can view the mesh UI views (Fleet Graph, Global Services, and Dashboard) without a mapped RBAC role. This is controlled by therbac.roleMapping.defaultRolesHelm value, which defaults to["global.Authenticated"]when the mesh product is enabled. Reading an individual resource’s YAML from the Fleet Graph still requires theglobal.Readerrole. To require an explicitly mapped role for all access, setrbac.roleMapping.defaultRoles=[]. For all available options, see the Helm values reference.
helm upgrade -i solo-management \ oci://us-docker.pkg.dev/solo-public/solo-enterprise-helm/charts/management \ -n solo-enterprise \ --version ${SOLO_UI_VERSION} \ --set cluster=${cluster1} \ --set licensing.licenseKey=${SOLO_ISTIO_LICENSE_KEY} \ --set oidc.issuer="" \ --set products.mesh.enabled=trueVerify that the UI component pods have a status of
Running.kubectl get po -n solo-enterprise- The
telemetry-collectorpod runs the OpenTelemetry (OTel) collector that scrapes Istio metrics, collects traces and events, and writes all telemetry data to ClickHouse. - The
uipod runs five containers: the UI backend and frontend, the tunnel server for multicluster connectivity, a dedicated OTel collector for Kubernetes object snapshots, and a built-in identity provider. For a description of each container, see Architecture. - The
clickhousepod runs a ClickHouse database for local data storage.
NAME READY STATUS RESTARTS AGE solo-enterprise-telemetry-collector-0 1/1 Running 0 4s solo-enterprise-ui-76c85c7d6b-xftcj 5/5 Running 0 4s solo-management-clickhouse-shard0-0 1/1 Running 0 4s- The
Launch the Solo UI to evaluate the health of your service mesh.
- Get the IP address or hostname for the
solo-enterprise-uiservice.export UI_ADDRESS=http://$(kubectl get svc -n solo-enterprise solo-enterprise-ui -o jsonpath="{.status.loadBalancer.ingress[0]['hostname','ip']}") echo ${UI_ADDRESS} - Open the UI in your browser.
open ${UI_ADDRESS}
- Port-forward the
solo-enterprise-uiservice.kubectl port-forward svc/solo-enterprise-ui -n solo-enterprise 4000:80 - Open
http://localhost:4000in your browser.
- Get the IP address or hostname for the
Multicluster
Deploy the UI management components into one cluster, and the UI relay components into one or more connected clusters in the multicluster mesh.
Save the names and kubeconfig contexts of each cluster. This guide uses two clusters as an example. You install the UI management components into
cluster1and the relay components intocluster2.export cluster1=<cluster1_name> export context1=<cluster1_context> export cluster2=<cluster2_name> export context2=<cluster2_context>Save the following details in environment variables.
SOLO_UI_VERSION: The Solo UI version. This example uses the latest version. You can find other versions in the version reference.SOLO_ISTIO_LICENSE_KEY: Your Enterprise-level license key for Solo Enterprise for Istio. If you do not have one, contact an account representative. If you prefer to specify license keys in a secret instead, see Licensing.
export SOLO_UI_VERSION=0.5.3 export SOLO_ISTIO_LICENSE_KEY=<license_key>Install the Solo UI components. If the cluster where you want to deploy the UI is included in the multicluster ambient mesh, follow the steps in the Management cluster within the mesh tab. If you want to install the UI in a dedicated cluster that does not run an Istio ambient mesh, follow the steps in the Dedicated management cluster tab.
Deploy the Solo UI management components on a cluster that runs an Istio ambient mesh and is connected to other clusters through the multicluster ambient mesh.
If you have not already, you must first install a multicluster ambient mesh, deploy apps to the mesh, and optionally make the app services available across your clusters.
Install the UI
managementchart in one cluster. The following options enable all settings that are required for a minimum management component installation. To see all possible fields for the Helm chart, review the Helm values reference.oidc.issuer=""enables the auto identity provider, a built-in IdP with hardcoded users for development and testing. To use your own OIDC provider instead, set this value to your OIDC issuer URL.- With
products.mesh.enabled=true, any authenticated user can view the mesh UI views (Fleet Graph, Global Services, and Dashboard) without a mapped RBAC role. This is controlled by therbac.roleMapping.defaultRolesHelm value, which defaults to["global.Authenticated"]when the mesh product is enabled. Reading an individual resource’s YAML from the Fleet Graph still requires theglobal.Readerrole. To require an explicitly mapped role for all access, setrbac.roleMapping.defaultRoles=[]. For all available options, see the Helm values reference.
helm upgrade -i solo-management \ oci://us-docker.pkg.dev/solo-public/solo-enterprise-helm/charts/management \ -n solo-enterprise --create-namespace \ --kube-context ${context1} \ --version ${SOLO_UI_VERSION} \ --set cluster=${cluster1} \ --set licensing.licenseKey=${SOLO_ISTIO_LICENSE_KEY} \ --set oidc.issuer="" \ --set products.mesh.enabled=trueVerify that the UI component pods have a status of
Running.kubectl get po -n solo-enterprise --context ${context1}- The
telemetry-collectorpod runs the OpenTelemetry (OTel) collector that scrapes Istio metrics, collects traces and events, and writes all telemetry data to ClickHouse. - The
uipod runs five containers: the UI backend and frontend, the tunnel server for multicluster connectivity, a dedicated OTel collector for Kubernetes object snapshots, and a built-in identity provider. For a description of each container, see Architecture. - The
clickhousepod runs a ClickHouse database for local data storage.
NAME READY STATUS RESTARTS AGE solo-enterprise-telemetry-collector-0 1/1 Running 0 4s solo-enterprise-ui-76c85c7d6b-xftcj 5/5 Running 0 4s solo-management-clickhouse-shard0-0 1/1 Running 0 4s- The
Install the UI
relaychart incluster2. The following options enable all settings that are required for a minimum relay component installation. Note that the global hostnames of the tunnel server and telemetry gateway services, which are created for you by default, are included so that relay components in other clusters of the multicluster mesh can connect to the management components. To see all possible fields for the Helm chart, review the Helm values reference.helm upgrade -i solo-relay \ oci://us-docker.pkg.dev/solo-public/solo-enterprise-helm/charts/relay \ -n solo-enterprise --create-namespace \ --kube-context ${context2} \ --version ${SOLO_UI_VERSION} \ --set cluster=${cluster2} \ --set tunnel.fqdn=solo-enterprise-ui.solo-enterprise.mesh.internal \ --set telemetry.fqdn=solo-enterprise-telemetry-gateway.solo-enterprise.mesh.internal
Deploy the Solo UI management components to a cluster that does not run an Istio ambient mesh. Workload clusters connect to the management cluster using the relay chart. This topology avoids an additional Istio license on the management cluster.
Before you begin, verify the following prerequisites.
- Workload clusters: Install a multicluster ambient mesh, deploy apps to the mesh, and optionally make the app services available across your workload clusters.
- Network connectivity: The management cluster must be reachable from each workload cluster. The relay chart connects to the management cluster’s tunnel server and OTel gateway, which are exposed as load balancer services in a later step.
Create the
solo-enterprisenamespace on the management cluster.kubectl create namespace solo-enterprise --context ${context1}Install the UI management chart. To see all possible fields for the Helm chart, review the Helm values reference.
oidc.issuer=""enables the auto identity provider, a built-in IdP with hardcoded users for development and testing. To use your own OIDC provider instead, set this value to your OIDC issuer URL.- With
products.mesh.enabled=true, any authenticated user can view the mesh UI views (Fleet Graph, Global Services, and Dashboard) without a mapped RBAC role. This is controlled by therbac.roleMapping.defaultRolesHelm value, which defaults to["global.Authenticated"]when the mesh product is enabled. Reading an individual resource’s YAML from the Fleet Graph still requires theglobal.Readerrole. To require an explicitly mapped role for all access, setrbac.roleMapping.defaultRoles=[]. For all available options, see the Helm values reference.
helm upgrade -i solo-management \ oci://us-docker.pkg.dev/solo-public/solo-enterprise-helm/charts/management \ -n solo-enterprise \ --kube-context ${context1} \ --version ${SOLO_UI_VERSION} \ --set cluster=${cluster1} \ --set licensing.licenseKey=${SOLO_ISTIO_LICENSE_KEY} \ --set oidc.issuer="" \ --set products.mesh.enabled=trueVerify that the UI component pods have a status of
Running.kubectl get po -n solo-enterprise --context ${context1}- The
telemetry-collectorpod runs the OpenTelemetry (OTel) collector that scrapes Istio metrics, collects traces and events, and writes all telemetry data to ClickHouse. - The
uipod runs five containers: the UI backend and frontend, the tunnel server for multicluster connectivity, a dedicated OTel collector for Kubernetes object snapshots, and a built-in identity provider. For a description of each container, see Architecture. - The
clickhousepod runs a ClickHouse database for local data storage.
NAME READY STATUS RESTARTS AGE solo-enterprise-telemetry-collector-0 1/1 Running 0 4s solo-enterprise-ui-76c85c7d6b-xftcj 5/5 Running 0 4s solo-management-clickhouse-shard0-0 1/1 Running 0 4s- The
Save the external addresses of the tunnel server and the OTel telemetry gateway. These services are exposed as load balancers and are the endpoints that relay components in workload clusters connect to.
export TUNNEL_ADDRESS=$(kubectl get svc -n solo-enterprise solo-enterprise-ui --context ${context1} -o jsonpath="{.status.loadBalancer.ingress[0]['hostname','ip']}") export TELEMETRY_ADDRESS=$(kubectl get svc -n solo-enterprise solo-enterprise-telemetry-gateway --context ${context1} -o jsonpath="{.status.loadBalancer.ingress[0]['hostname','ip']}") echo "Tunnel: ${TUNNEL_ADDRESS}" echo "Telemetry: ${TELEMETRY_ADDRESS}"For each workload cluster, install the relay chart. Set
tunnel.fqdnandtelemetry.fqdnto the external addresses you saved. To see all possible fields for the Helm chart, review the Helm values reference.export cluster2=<workload_cluster_name> export context2=<workload_cluster_context> helm upgrade -i solo-relay \ oci://us-docker.pkg.dev/solo-public/solo-enterprise-helm/charts/relay \ -n solo-enterprise --create-namespace \ --kube-context ${context2} \ --version ${SOLO_UI_VERSION} \ --set cluster=${cluster2} \ --set tunnel.fqdn=${TUNNEL_ADDRESS} \ --set telemetry.fqdn=${TELEMETRY_ADDRESS}
Verify that the relay and telemetry collector pods have a status of
Running.kubectl get po -n solo-enterprise --context ${context2}- The
relaypod runs two containers: the tunnel client that connects to the tunnel server in the management cluster, and a dedicated OTel collector for Kubernetes object snapshots in the workload cluster. - The
telemetry-collectorpod collects data in the cluster to send to the OTel gateway in the management cluster.
NAME READY STATUS RESTARTS AGE solo-enterprise-relay-5d7f668848-h456h 2/2 Running 0 13s solo-enterprise-telemetry-collector-0 1/1 Running 0 13s- The
Launch the Solo UI to evaluate the health of your service mesh.
- Get the external IP address or hostname for the
solo-enterprise-uiservice.export UI_ADDRESS=http://$(kubectl get svc -n solo-enterprise solo-enterprise-ui --context ${context1} -o jsonpath="{.status.loadBalancer.ingress[0]['hostname','ip']}") echo ${UI_ADDRESS} - Open the UI in your browser.
open ${UI_ADDRESS}
- Port-forward the
solo-enterprise-uiservice.kubectl port-forward svc/solo-enterprise-ui -n solo-enterprise 4000:80 --context ${context1} - Open
http://localhost:4000in your browser.
- Get the external IP address or hostname for the
Next
Explore the UI further to review your Istio workloads, traffic flows, resources, and more.
For help and support, check out the following resoures.
- Talk to an expert to get advice or build out a proof of concept.
- Join the Solo.io community slack.
- Try out one of the Solo labs.
- Check out the Solo open source community commitments and projects.