Multicluster management
Use Solo Enterprise for Istio to enable centralized observability for multiple clusters that run Istio service meshes.
Solo Enterprise for Istio deploys alongside your Istio installations in single or multicluster environments, and gives you instant insights into your Istio environment through a custom dashboard. A multicluster Solo Enterprise for Istio setup consists of one cluster that you install the management plane (management server) in, and one or more workload clusters that serve as the data plane (agent and service mesh). Note that the cluster that you install the management plane in often also runs workloads, such as a service mesh.
You can follow this guide to quickly install Solo Enterprise for Istio with default values, or customize settings for an advanced Solo Enterprise for Istio installation. To learn more about the benefits and architecture of Solo Enterprise for Istio, see About.
Install Solo Enterprise for Istio with meshctl
Use default values provided by the meshctl CLI installation profiles to quickly deploy Solo Enterprise for Istio alongside your service mesh.
Before you begin
Install the following command-line (CLI) tools.
helm, the Kubernetes package manager.kubectl, the Kubernetes command line tool. Download thekubectlversion that is within one minor version of the Kubernetes clusters you plan to use.meshctl, the Solo command line tool.curl -sL https://run.solo.io/meshctl/install | GLOO_MESH_VERSION=v2.11.5 sh - export PATH=$HOME/.gloo-mesh/bin:$PATH
Create or use at least two existing Kubernetes clusters. The instructions in this guide assume one management cluster and two workload clusters.
- The cluster name must be alphanumeric with no special characters except a hyphen (-), lowercase, and begin with a letter (not a number) to follow the Kubernetes DNS label standard.
Set the names of your clusters from your infrastructure provider. If your clusters have different names, specify those names instead.
export MGMT_CLUSTER=mgmt export REMOTE_CLUSTER1=cluster1 export REMOTE_CLUSTER2=cluster2- Save the kubeconfig contexts for your clusters. Run
kubectl config get-contexts, look for your cluster in theCLUSTERcolumn, and get the context name in theNAMEcolumn. Note: Do not use context names with underscores. The generated certificate that connects workload clusters to the management cluster uses the context name as a SAN specification, and underscores in SAN are not FQDN compliant. You can rename a context by runningkubectl config rename-context "<oldcontext>" <newcontext>.export MGMT_CONTEXT=<management-cluster-context> export REMOTE_CONTEXT1=<remote-cluster1-context> export REMOTE_CONTEXT2=<remote-cluster2-context> Set your Premium or Enterprise license key for Solo Enterprise for Istio as an environment variable. If you do not have one, contact an account representative. If you prefer to specify license keys in a secret instead, see Licensing. To check your license’s validity, you can run
meshctl license check --key $(echo ${SOLO_ISTIO_LICENSE_KEY} | base64 -w0).export SOLO_ISTIO_LICENSE_KEY=<license_key>
Management plane
Deploy the Gloo management plane into a dedicated management cluster.
Install Solo Enterprise for Istio in your management cluster. This command uses a basic profile to create a
gloo-meshnamespace and install the Gloo management plane components, such as the management server and Prometheus server, in your management cluster. For more information, check out the CLI install profiles.meshctl install --profiles gloo-mesh-mgmt \ --kubecontext $MGMT_CONTEXT \ --set common.cluster=$MGMT_CLUSTER \ --set licensing.glooMeshCoreLicenseKey=$SOLO_ISTIO_LICENSE_KEYThis guide assumes one dedicated management cluster, and two Istio workload clusters that you register with the management cluster. If you plan to register the management cluster so that it can also function as a workload cluster, include–set telemetryGateway.enabled=truein this command.Verify that the management plane pods have a status of
Running.kubectl get pods -n gloo-mesh --context $MGMT_CONTEXTExample output:
NAME READY STATUS RESTARTS AGE gloo-mesh-mgmt-server-56c495796b-cx687 1/1 Running 0 30s gloo-mesh-redis-8455d49c86-f8qhw 1/1 Running 0 30s gloo-mesh-ui-65b6b6df5f-bf4vp 3/3 Running 0 30s gloo-telemetry-collector-agent-7rzfb 1/1 Running 0 30s gloo-telemetry-collector-agent-mf5rw 1/1 Running 0 30s gloo-telemetry-gateway-6547f479d5-r4zm6 1/1 Running 0 30s prometheus-server-57cd8c74d4-2bc7f 2/2 Running 0 30sSave the external address and port that your cloud provider assigned to the Gloo OpenTelemetry (OTel) gateway service. The OTel collector agents in each workload cluster send metrics to this address.
export TELEMETRY_GATEWAY_IP=$(kubectl get svc -n gloo-mesh gloo-telemetry-gateway --context $MGMT_CONTEXT -o jsonpath="{.status.loadBalancer.ingress[0]['hostname','ip']}") export TELEMETRY_GATEWAY_PORT=$(kubectl get svc -n gloo-mesh gloo-telemetry-gateway --context $MGMT_CONTEXT -o jsonpath='{.spec.ports[?(@.name=="otlp")].port}') export TELEMETRY_GATEWAY_ADDRESS=${TELEMETRY_GATEWAY_IP}:${TELEMETRY_GATEWAY_PORT} echo $TELEMETRY_GATEWAY_ADDRESS
Data plane
Register each workload cluster with the Gloo management plane by deploying Gloo data plane components. A deployment named gloo-mesh-agent runs the Gloo agent in each workload cluster.
Register both workload clusters with the management server. These commands use a basic profile to create a
gloo-meshnamespace and install the Gloo data plane components, such as the Gloo agent. For more information, check out the CLI install profiles.meshctl cluster register $REMOTE_CLUSTER1 \ --kubecontext $MGMT_CONTEXT \ --profiles gloo-mesh-agent \ --remote-context $REMOTE_CONTEXT1 \ --telemetry-server-address $TELEMETRY_GATEWAY_ADDRESS meshctl cluster register $REMOTE_CLUSTER2 \ --kubecontext $MGMT_CONTEXT \ --profiles gloo-mesh-agent \ --remote-context $REMOTE_CONTEXT2 \ --telemetry-server-address $TELEMETRY_GATEWAY_ADDRESSVerify that the Gloo data plane components in each workload cluster are healthy. If not, try debugging the agent.
kubectl get pods -n gloo-mesh --context $REMOTE_CONTEXT1 kubectl get pods -n gloo-mesh --context $REMOTE_CONTEXT2Example output:
NAME READY STATUS RESTARTS AGE gloo-mesh-agent-8ffc775c4-tk2z5 2/2 Running 0 90s gloo-telemetry-collector-agent-g8p7x 1/1 Running 0 90s gloo-telemetry-collector-agent-mp2wd 1/1 Running 0 90sVerify that your Solo Enterprise for Istio setup is correctly installed. If not, try debugging the relay connection. Note that this check might take a few seconds to verify that:
- Your Solo product licenses are valid and current.
- The Gloo CRDs are installed at the correct version.
- The management plane pods in the management cluster are running and healthy.
- The agents in the workload clusters are successfully identified by the management server.
- Any Istio installation versions are compatible with the installed Gloo version.
meshctl check --kubecontext $MGMT_CONTEXTExample output:
🟢 License status INFO gloo-mesh enterprise license expiration is 25 Aug 24 10:38 CDT 🟢 CRD version check 🟢 Gloo deployment status Namespace | Name | Ready | Status gloo-mesh | gloo-mesh-mgmt-server | 1/1 | Healthy gloo-mesh | gloo-mesh-redis | 1/1 | Healthy gloo-mesh | gloo-mesh-ui | 1/1 | Healthy gloo-mesh | gloo-telemetry-gateway | 1/1 | Healthy gloo-mesh | prometheus-server | 1/1 | Healthy gloo-mesh | gloo-telemetry-collector-agent | 2/2 | Healthy 🟢 Mgmt server connectivity to workload agents Cluster | Registered | Connected Pod cluster1 | true | gloo-mesh/gloo-mesh-mgmt-server-65bd557b95-v8qq6 cluster2 | true | gloo-mesh/gloo-mesh-mgmt-server-65bd557b95-v8qq6 Connected Pod | Clusters gloo-mesh/gloo-mesh-mgmt-server-65bd557b95-v8qq6 | 2 🟢 Istio compatibility check All Istio versions found are compatible
Install Solo Enterprise for Istio with Helm
Use Helm to customize an advanced Solo Enterprise for Istio installation.
Before you begin
Install the following command-line (CLI) tools.
helm, the Kubernetes package manager.kubectl, the Kubernetes command line tool. Download thekubectlversion that is within one minor version of the Kubernetes clusters you plan to use.meshctl, the Solo command line tool.curl -sL https://run.solo.io/meshctl/install | GLOO_MESH_VERSION=v2.11.5 sh - export PATH=$HOME/.gloo-mesh/bin:$PATH
Set your Premium or Enterprise license key for Solo Enterprise for Istio as an environment variable. If you do not have one, contact an account representative. If you prefer to specify license keys in a secret instead, see Licensing. To check your license’s validity, you can run
meshctl license check --key $(echo ${SOLO_ISTIO_LICENSE_KEY} | base64 -w0).export SOLO_ISTIO_LICENSE_KEY=<license_key>Set the Solo Enterprise for Istio version. This example uses the latest version. You can find other versions in the Changelog documentation. Append
-fipsfor a FIPS-compliant image, such as2.11.5-fips. Do not includevbefore the version number.export GLOO_VERSION=2.11.5Create or use at least two existing Kubernetes clusters. The instructions in this guide assume one management cluster and two workload clusters.
- The cluster name must be alphanumeric with no special characters except a hyphen (-), lowercase, and begin with a letter (not a number) to follow the Kubernetes DNS label standard.
- Production installations: Review Best practices for production to prepare your optional security measures. For example, before you begin your Solo Enterprise for Istio installation, you can provide your own certificates to secure the management server and agent connection, and set up secure access to the Gloo UI.
A multicluster Solo Enterprise for Istio setup consists of one cluster that you install the management plane (management server) in, and one or more workload clusters that serve as the data plane (agent and service mesh). Note that the cluster that you install the management plane in often also runs workloads, such as a service mesh.
Management plane
Deploy the Gloo management plane into a dedicated management cluster.
Save the name and kubeconfig context for your management cluster in environment variables.
export MGMT_CLUSTER=<management-cluster-name> export MGMT_CONTEXT=<management-cluster-context>Add and update the Helm repository for Gloo.
helm repo add gloo-platform https://storage.googleapis.com/gloo-platform/helm-charts helm repo updateInstall the Gloo CRDs.
helm upgrade -i gloo-platform-crds gloo-platform/gloo-platform-crds \ --namespace=gloo-mesh \ --create-namespace \ --version=$GLOO_VERSION \ --set installEnterpriseCrds=false \ --kube-context $MGMT_CONTEXT- Prepare a Helm values file to provide your customizations. To get started, you can use the minimum settings in the following profile as a basis. These settings enable all components that are required for a Gloo management plane installation.
curl https://storage.googleapis.com/gloo-platform/helm-profiles/$GLOO_VERSION/gloo-mesh-mgmt.yaml > mgmt-plane.yaml open mgmt-plane.yamlDecide how you want to secure the relay connection between the management server and agents. In test and POC environments, you can use self-signed certificates to secure the connection. If you plan to use Solo Enterprise for Istio in production, bringing your own certificates instead is recommended. For more information, see Setup options.
Use your preferred PKI provider to generate your root CA and intermediate CA credentials. You then store the intermediate CA credentials in your cluster so that you can leverage Solo Enterprise for Istio’s built-in capability to automatically issue and sign client TLS certificates for agents. For more information, see the Bring your own CAs with automatic client TLS certificate rotation.
Create your root CA, intermediate CA, server, and telemetry gateway credentials, as well as relay identity token, and store them as the following Kubernetes secrets in the
gloo-meshnamespace on the management cluster:relay-root-tls-secretthat holds the root CA certificaterelay-tls-signing-secretthat holds the intermediate CA credentialsrelay-server-tls-secretthat holds the server key, TLS certificate and certificate chain information for the management serverrelay-identity-token-secretthat holds the relay identity token valuetelemetry-root-secretthat holds the root CA certificate for the certificate chaingloo-telemetry-gateway-tls-secretthat holds the key, TLS certificate and certificate chain for the telemetry gateway
You can use your preferred PKI provider to create the TLS certificates or follow the steps in BYO server certificate with managed client certificate to create these TLS credentials with OpenSSl.
In your Helm values file for the management server, add the following values.
glooMgmtServer: enabled: true relay: disableCaCertGeneration: true signingTlsSecret: name: relay-tls-signing-secret namespace: gloo-mesh tlsSecret: name: relay-server-tls-secret namespace: gloo-mesh tokenSecret: key: token name: relay-identity-token-secret namespace: gloo-mesh telemetryCollector: enabled: true extraVolumes: - name: root-ca secret: defaultMode: 420 optional: true secretName: telemetry-root-secret - configMap: items: - key: relay path: relay.yaml name: gloo-telemetry-collector-config name: telemetry-configmap - hostPath: path: /var/run/cilium type: DirectoryOrCreate name: cilium-run telemetryGateway: enabled: true extraVolumes: - name: tls-keys secret: secretName: gloo-telemetry-gateway-tls-secret defaultMode: 420 - name: telemetry-configmap configMap: name: gloo-telemetry-gateway-config items: - key: relay path: relay.yaml telemetryGatewayCustomization: disableCertGeneration: trueHelm value Description glooMgmtServer.relay.disableCaCertGenerationDisable the generation of self-signed certificates to secure the relay connection between the management server and agent. glooMgmtServer.relay.signingTlsSecretAdd the name and namespace of the Kubernetes secret that holds the intermediate CA credentials that you created earlier. glooMgmtServer.relay.tlsSecretAdd the name and namespace of the Kubernetes secret that holds the server TLS certificate for the management server that you created earlier. glooMgmtServer.relay.tokenSecretAdd the name, namespace, and key of the Kubernetes secret that holds the relay identity token that you created earlier. telemetryGateway.extraVolumesAdd the gloo-telemetry-gateway-tls-secret-customKubernetes secret that you created earlier to thetls-keysvolume. Make sure that you also add the other volumes to your telemetry gateway configuration.telemetryCollector.extraVolumesAdd the telemetry-root-secretKubernetes secret that you created earlier to theroot-cavolume. Make sure that you also add the other volumes to your telemetry collector configuration.
Use your preferred PKI provider to create the root CA, server TLS, client TLS, and telemetry gateway certificates. Then, store these certificates in the cluster so that the agent uses a client TLS certificate when establishing the first connection with the management server. No relay identity tokens are used. With this approach, you cannot use Solo Enterprise for Istio’s built-in client TLS certificate rotation capabilities. Instead, you must set up your own processes to monitor the expiration of your certificates and to rotate them before they expire. For more information, see Bring your own CAs and client TLS certificates.
- Create your root CA, server, client, and telemetry gateway TLS certificates. You can use your preferred PKI provider to do that or follow the steps in Create certificates with OpenSSL to create custom TLS certificates by using OpenSSL. Then, you store the following information in a Kubernetes secret in the
gloo-meshnamespace on the management cluster.relay-server-tls-secretthat holds the server key, TLS certificate and certificate chain information for the management servergloo-telemetry-gateway-tls-secretthat holds the key, TLS certificate and certificate chain for the telemetry gatewaytelemetry-root-secretthat holds the root CA certificate for the certificate chain
- In your Helm values file for the management server, add the following values.
glooMgmtServer: enabled: true relay: disableCa: true disableCaCertGeneration: true disableTokenGeneration: true tlsSecret: name: relay-server-tls-secret namespace: gloo-mesh tokenSecret: key: null name: null namespace: null telemetryCollector: enabled: true extraVolumes: - name: root-ca secret: defaultMode: 420 optional: true secretName: telemetry-root-secret - configMap: items: - key: relay path: relay.yaml name: gloo-telemetry-collector-config name: telemetry-configmap - hostPath: path: /var/run/cilium type: DirectoryOrCreate name: cilium-run telemetryGateway: enabled: true extraVolumes: - name: tls-keys secret: secretName: gloo-telemetry-gateway-tls-secret defaultMode: 420 - name: telemetry-configmap configMap: name: gloo-telemetry-gateway-config items: - key: relay path: relay.yaml telemetryGatewayCustomization: disableCertGeneration: trueHelm value Description relay.disableCaDisable the generation of self-signed root and intermediate CA certificates and the use of identity tokens to establish initial trust between the management server and agent. relay.disableCaCertGenerationDisable the generation of self-signed certificates to secure the relay connection between the management server and agent. relay.disableTokenGenerationDisable the generation of relay identity tokens. relay.tlsSecretAdd the name and namespace of the Kubernetes secret that holds the server TLS certificate for the management server that you created earlier. relay.tokenSecretSet all values to nullto instruct the management server to not use identity tokens to establish initial trust with agents.telemetryGateway.extraVolumesAdd the gloo-telemetry-gateway-tls-secretKubernetes secret that you created earlier to thetls-keysvolume. Make sure that you also add the other volumes to your telemetry gateway configuration.telemetryCollector.extraVolumesAdd the telemetry-root-secretKubernetes secret that you created earlier to theroot-cavolume. Make sure that you also add the other volumes to your telemetry collector configuration.
Do not use self-signed certs for production. This setup is recommended for testing purposes only.You can use Solo Enterprise for Istio to generate self-signed certificates and keys for the root and intermediate CA. These credentials are used to derive the server TLS certificate for the management server and client TLS certificate for the agent. Note that this setup is not recommended for production, but can be used for testing purposes. For more information, see Self-signed CAs with automatic client certificate rotation.
In your Helm values file for the management server, add the following values. Note that mTLS is the default mode in Solo Enterprise for Istio and does not require any additional configuration on the management server.
glooMgmtServer: enabled: trueUse your preferred PKI provider to create the server TLS certificate for the management server. For more information, see Bring your own server TLS certificate.
Create your root CA credentials and derive a server TLS certificate. To create the TLS certificate, you can use your preferred PKI provider or follow the steps in BYO server certificate to create a custom server TLS certificate by using OpenSSL. Make sure that you have the following Kubernetes secrets in the management cluster:
relay-server-tls-secret-custom: The key and TLS certificate for the management server, and root CA certificate information for the certificate chain. Note that you can use a different name, but you cannot userelay-server-tls-secretas this name is reserved by the management server when creating self-signed root CAs and server TLS certificates.gloo-telemetry-gateway-tls-secret-custom: The key and TLS certificate for the telemetry gateway, and root CA certificate information for the certificate chain. It is recommended to use the same credentials that you use for the management server. Note that you can use a different name, but you cannot usegloo-telemetry-gateway-tls-secretas this name is reserved by the management server when creating self-signed certificates.telemetry-root-secret: The root CA certificate for the certificate chain.
In your Helm values file for the management server, add the following values.
glooMgmtServer: enabled: true relay: tlsSecret: name: relay-server-tls-secret-custom extraEnvs: RELAY_DISABLE_CLIENT_CERTIFICATE_AUTHENTICATION: value: "true" RELAY_TOKEN: value: "My token" telemetryCollector: enabled: true extraVolumes: - name: root-ca secret: defaultMode: 420 optional: true secretName: telemetry-root-secret - configMap: items: - key: relay path: relay.yaml name: gloo-telemetry-collector-config name: telemetry-configmap - hostPath: path: /var/run/cilium type: DirectoryOrCreate name: cilium-run telemetryGateway: enabled: true extraVolumes: - name: tls-keys secret: secretName: gloo-telemetry-gateway-tls-secret-custom defaultMode: 420 - name: telemetry-configmap configMap: name: gloo-telemetry-gateway-config items: - key: relay path: relay.yaml telemetryGatewayCustomization: disableCertGeneration: trueHelm value Description relay.tlsSecret.nameAdd the name of the Kubernetes secret with the custom server TLS secret that you created earlier. RELAY_TOKENSpecify the relay token that the management server and agent use to establish initial trust. When you install Solo Enterprise for Istio and set RELAY_DISABLE_CLIENT_CERTIFICATE_AUTHENTICATIONto true, the connection between the management server and agent is automatically secured by using simple, server-side TLS. In a simple TLS setup, only the management server presents a certificate to authenticate its identity. The identity of the agent is not verified. To ensure that only trusted agents connect to the management server, the relay identity token is used. The relay identity token can be any string value and is stored in therelay-identity-token-secretKubernetes secret on the management cluster. You must set the same value inglooAgent.extraEnvs.RELAY_TOKEN.valuewhen you install the agent to allow the agent to connect to the management server.RELAY_DISABLE_CLIENT_CERTIFICATE_AUTHENTICATIONSet this value to true to not require a client TLS certificate from the agent to prove the agent’s identity and establish the connection with the management server. This setting is required when you want to use simple TLS to secure the connection between the management server and agent. telemetryGateway.extraVolumesAdd the gloo-telemetry-gateway-tls-secret-customKubernetes secret that you created earlier to thetls-keysvolume. Make sure that you also add the other volumes to your telemetry gateway configuration.telemetryCollector.extraVolumesAdd the telemetry-root-secretKubernetes secret that you created earlier to theroot-cavolume. Make sure that you also add the other volumes to your telemetry collector configuration.
Do not use self-signed certs for production. This setup is recommended for testing purposes only.Use Solo Enterprise for Istio to create a self-signed server TLS certificate that the management server presents when workload cluster agents connect. This setup is not recommended for production, but can be used for testing purposes. For more information, see Self-signed server TLS certificate.In your Helm values file for the management server, add the following values.
glooMgmtServer: enabled: true extraEnvs: RELAY_DISABLE_CLIENT_CERTIFICATE_AUTHENTICATION: value: "true" RELAY_TOKEN: value: "My token"Helm value Description RELAY_TOKENSpecify the relay token that the management server and agent use to establish initial trust. When you install Solo Enterprise for Istio and set RELAY_DISABLE_CLIENT_CERTIFICATE_AUTHENTICATIONto true, the connection between the management server and agent is automatically secured by using simple, server-side TLS. In a simple TLS setup, only the management server presents a certificate to authenticate its identity. The identity of the agent is not verified. To ensure that only trusted agents connect to the management server, the relay identity token is used. The relay identity token can be any string value and is stored in therelay-identity-token-secretKubernetes secret on the management cluster. You must set the same value inglooAgent.extraEnvs.RELAY_TOKEN.valuewhen installing Solo Enterprise for Istio in a workload cluster to allow agents to connect to the management server.RELAY_DISABLE_CLIENT_CERTIFICATE_AUTHENTICATIONSet this value to true to not require a client TLS certificate from the agent to prove the agent’s identity and establish the connection with the management server. This setting is required when you want to use simple TLS to secure the connection between the management server and agent. Edit the file to provide your own details for settings that are recommended for production deployments, such as the following settings.
For more information about the settings you can configure:
- See Best practices for production.
- See all possible fields for the Helm chart by running
helm show values gloo-platform/gloo-platform --version v2.11.5 > all-values.yaml. You can also see these fields in the Helm values documentation.
Field Description glooMgmtServer.resources.limitsAdd resource limits for the gloo-mesh-mgmt-serverpod, such ascpu: 1000mandmemory: 1Gi.glooMgmtServer.safeModeglooMgmtServer.safeStartWindowConfigure how you want the Gloo management server to handle translation after a Redis restart. For available options, see Redis safe mode options. glooMgmtServer.serviceOverrides.metadata.annotationsAdd annotations for the management server load balancer as needed, such as AWS-specific load balancer annotations. For more information, see Deployment and service overrides. glooUi.authSet up OIDC authorization for the Gloo UI. For more information, see UI authentication. prometheus.enabledDisable the default Prometheus instance as needed to provide your own. Otherwise, you can keep the default Prometheus server enabled, and deploy a production-level server to scrape metrics from the server. For more information on each option, see Best practices for collecting metrics in production. redisDisable the default Redis deployment and provide your own backing database as needed. For more information, see Backing databases. OpenShift: glooMgmtServer.serviceTypeandtelemetryGateway.service.typeIn some OpenShift setups, you might not use load balancer service types. You can set these two deployment service types to ClusterIP, and expose them by using OpenShift routes after installation.Use the customizations in your Helm values file to install the Gloo management plane components in your management cluster.
helm upgrade -i gloo-platform gloo-platform/gloo-platform \ --kube-context $MGMT_CONTEXT \ -n gloo-mesh \ --version $GLOO_VERSION \ --values mgmt-plane.yaml \ --set common.cluster=$MGMT_CLUSTER \ --set licensing.glooMeshCoreLicenseKey=$SOLO_ISTIO_LICENSE_KEYElevate the permissions of the
gloo-meshservice account that will be created.oc adm policy add-scc-to-group anyuid system:serviceaccounts:gloo-mesh --context $MGMT_CONTEXTInstall the Gloo management plane.
helm upgrade -i gloo-platform gloo-platform/gloo-platform \ --kube-context $MGMT_CONTEXT \ -n gloo-mesh \ --version $GLOO_VERSION \ --values mgmt-plane.yaml \ --set common.cluster=$MGMT_CLUSTER \ --set licensing.glooMeshCoreLicenseKey=$SOLO_ISTIO_LICENSE_KEY \ --set glooMgmtServer.floatingUserId=true \ --set glooMgmtServer.serviceType=LoadBalancer \ --set glooUi.floatingUserId=true \ --set redis.deployment.floatingUserId=true \ --set telemetryGateway.service.type=LoadBalancer
Verify that the management plane pods have a status of
Running.kubectl get pods -n gloo-mesh --context $MGMT_CONTEXTExample output:
NAME READY STATUS RESTARTS AGE gloo-mesh-mgmt-server-56c495796b-cx687 1/1 Running 0 30s gloo-mesh-redis-8455d49c86-f8qhw 1/1 Running 0 30s gloo-mesh-ui-65b6b6df5f-bf4vp 3/3 Running 0 30s gloo-telemetry-collector-agent-7rzfb 1/1 Running 0 30s gloo-telemetry-collector-agent-mf5rw 1/1 Running 0 30s gloo-telemetry-gateway-6547f479d5-r4zm6 1/1 Running 0 30s prometheus-server-57cd8c74d4-2bc7f 2/2 Running 0 30s- Save the external address and port that your cloud provider assigned to the
gloo-mesh-mgmt-serverservice. Thegloo-mesh-agentagent in each workload cluster accesses this address via a secure connection.export MGMT_SERVER_NETWORKING_DOMAIN=$(kubectl get svc -n gloo-mesh gloo-mesh-mgmt-server --context $MGMT_CONTEXT -o jsonpath="{.status.loadBalancer.ingress[0]['hostname','ip']}") export MGMT_SERVER_NETWORKING_PORT=$(kubectl get svc -n gloo-mesh gloo-mesh-mgmt-server --context $MGMT_CONTEXT -o jsonpath='{.spec.ports[?(@.name=="grpc")].port}') export MGMT_SERVER_NETWORKING_ADDRESS=${MGMT_SERVER_NETWORKING_DOMAIN}:${MGMT_SERVER_NETWORKING_PORT} echo $MGMT_SERVER_NETWORKING_ADDRESS- Expose the management server by using an OpenShift route. Your route might look like the following.
oc apply --context $MGMT_CONTEXT -n gloo-mesh -f- <<EOF kind: Route apiVersion: route.openshift.io/v1 metadata: name: gloo-mesh-mgmt-server namespace: gloo-mesh annotations: # Needed for the different agents to connect to different replica instances of the management server deployment haproxy.router.openshift.io/balance: roundrobin spec: host: gloo-mesh-mgmt-server.<your_domain>.com to: kind: Service name: gloo-mesh-mgmt-server weight: 100 port: targetPort: grpc tls: termination: passthrough insecureEdgeTerminationPolicy: Redirect wildcardPolicy: None EOF - Save the management server’s address, which consists of the route host and the route port. Note that the port is the route’s own port, such as
443, and not thegrpcport of the management server that the route points to.export MGMT_SERVER_NETWORKING_DOMAIN=$(oc get route -n gloo-mesh gloo-mesh-mgmt-server --context $MGMT_CONTEXT -o jsonpath='{.status.ingress[0].host}') export MGMT_SERVER_NETWORKING_ADDRESS=${MGMT_SERVER_NETWORKING_DOMAIN}:443 echo $MGMT_SERVER_NETWORKING_ADDRESS
- Expose the management server by using an OpenShift route. Your route might look like the following.
- Save the external address and port that your cloud provider assigned to the Gloo OpenTelemetry (OTel) gateway service. The OTel collector agents in each workload cluster send metrics to this address.
export TELEMETRY_GATEWAY_IP=$(kubectl get svc -n gloo-mesh gloo-telemetry-gateway --context $MGMT_CONTEXT -o jsonpath="{.status.loadBalancer.ingress[0]['hostname','ip']}") export TELEMETRY_GATEWAY_PORT=$(kubectl get svc -n gloo-mesh gloo-telemetry-gateway --context $MGMT_CONTEXT -o jsonpath='{.spec.ports[?(@.name=="otlp")].port}') export TELEMETRY_GATEWAY_ADDRESS=${TELEMETRY_GATEWAY_IP}:${TELEMETRY_GATEWAY_PORT} echo $TELEMETRY_GATEWAY_ADDRESS- Expose the telemetry gateway by using an OpenShift route. Your route might look like the following.
oc apply --context $MGMT_CONTEXT -n gloo-mesh -f- <<EOF kind: Route apiVersion: route.openshift.io/v1 metadata: name: gloo-telemetry-gateway namespace: gloo-mesh spec: host: gloo-telemetry-gateway.<your_domain>.com to: kind: Service name: gloo-telemetry-gateway weight: 100 port: targetPort: otlp tls: termination: passthrough insecureEdgeTerminationPolicy: Redirect wildcardPolicy: None EOF - Save the telemetry gateway’s address, which consists of the route host and the route port. Note that the port is the route’s own port, such as
443, and not theotlpport of the telemetry gateway that the route points to.export TELEMETRY_GATEWAY_HOST=$(oc get route -n gloo-mesh gloo-telemetry-gateway --context $MGMT_CONTEXT -o jsonpath='{.status.ingress[0].host}') export TELEMETRY_GATEWAY_ADDRESS=${TELEMETRY_GATEWAY_HOST}:443 echo $TELEMETRY_GATEWAY_ADDRESS
- Expose the telemetry gateway by using an OpenShift route. Your route might look like the following.
Data plane
Register each workload cluster with the Gloo management plane by deploying Gloo data plane components. A deployment named
gloo-mesh-agentruns the Gloo agent in each workload cluster.For the workload cluster that you want to register with Gloo, set the following environment variables. You update these variables each time you follow these steps to register another workload cluster.
export REMOTE_CLUSTER=<workload_cluster_name> export REMOTE_CONTEXT=<workload_cluster_context>In the management cluster, create a
KubernetesClusterresource to represent the workload cluster and store relevant data, such as the workload cluster’s local domain.kubectl apply --context $MGMT_CONTEXT -f- <<EOF apiVersion: admin.gloo.solo.io/v2 kind: KubernetesCluster metadata: name: ${REMOTE_CLUSTER} namespace: gloo-mesh spec: clusterDomain: cluster.local EOFIn your workload cluster, apply the Gloo CRDs.
helm upgrade -i gloo-platform-crds gloo-platform/gloo-platform-crds \ --namespace=gloo-mesh \ --create-namespace \ --version=$GLOO_VERSION \ --set installEnterpriseCrds=false \ --kube-context $REMOTE_CONTEXT- Prepare a Helm values file to provide your customizations. To get started, you can use the minimum settings in the following profile as a basis. These settings enable all components that are required for a Gloo data plane installation.
curl https://storage.googleapis.com/gloo-platform/helm-profiles/$GLOO_VERSION/gloo-mesh-agent.yaml > data-plane.yaml open data-plane.yamlDepending on the method you chose to secure the relay connection, prepare the Helm values for the data plane installation. For more information, see the Setup options.
Make sure that the following Kubernetes secrets exist in the
gloo-meshnamespace on each workload cluster.relay-root-tls-secretthat holds the root CA certificaterelay-identity-token-secretthat holds the relay identity token valuetelemetry-root-secretthat holds the root CA certificate for the certificate chain
You can use the steps in BYO server certificate with managed client certificate as a guidance for how to create these secrets in the workload cluster.
In your Helm values file for the agent, add the following values.
glooAgent: enabled: true relay: authority: gloo-mesh-mgmt-server.gloo-mesh clientTlsSecretRotationGracePeriodRatio: "" rootTlsSecret: name: relay-root-tls-secret namespace: gloo-mesh tokenSecret: key: token name: relay-identity-token-secret namespace: gloo-mesh telemetryCollector: enabled: true extraVolumes: - name: root-ca secret: defaultMode: 420 optional: true secretName: telemetry-root-secret - configMap: items: - key: relay path: relay.yaml name: gloo-telemetry-collector-config name: telemetry-configmap - hostPath: path: /var/run/cilium type: DirectoryOrCreate name: cilium-runHelm value Description glooAgent.relay.rootTlsSecretAdd the name and namespace of the Kubernetes secret that holds the root CA credentials that you copied from the management cluster to the workload cluster. glooAgent.relay.tokenSecretAdd the name, namespace, and key of the Kubernetes secret that holds the relay identity token that you copied from the management cluster to the workload cluster. telemetryCollector.extraVolumesAdd the telemetry-root-secretKubernetes secret that you created earlier to theroot-cavolume. Make sure that you also add the other volumes to your telemetry collector configuration.
Make sure that the following Kubernetes secrets exist in the
gloo-meshnamespace on each workload cluster.$REMOTE_CLUSTER1-tls-certthat holds the key, TLS certificate, and certificate chain information for the agenttelemetry-root-secretthat holds the root CA certificate for the certificate chain
You can use the steps in Create certificates with OpenSSL as a guidance for how to create these secrets in the workload cluster.
In your Helm values file for the agent, add the following values. Replace
<client-tls-secret-name>with the name of the Kubernetes secret that holds the client TLS certificate, and add the name of the Kubernetes secret that holds the telemetry gateway certificate to theroot-catelemetry collector volume.glooAgent: enabled: true relay: authority: gloo-mesh-mgmt-server.gloo-mesh clientTlsSecretRotationGracePeriodRatio: "" clientTlsSecret: name: <client-tls-secret-name> namespace: gloo-mesh tokenSecret: key: null name: null namespace: null telemetryCollector: enabled: true extraVolumes: - name: root-ca secret: defaultMode: 420 optional: true secretName: telemetry-root-secret - configMap: items: - key: relay path: relay.yaml name: gloo-telemetry-collector-config name: telemetry-configmap - hostPath: path: /var/run/cilium type: DirectoryOrCreate name: cilium-runHelm value Description glooAgent.relay.clientTlsSecretAdd the name and namespace of the Kubernetes secret that holds the client TLS certificate for the agent that you created earlier. glooAgent.relay.tokenSecretSet all values to nullto instruct the agent to not use identity tokens to establish initial trust with agents.telemetryCollector.extraVolumesAdd the name of the Kubernetes secret that holds the telemetry gateway certificate that you created earlier to the root-cavolume. Make sure that you also add theconfigMapandhostPathvolumes to your configuration.
Do not use self-signed certs for production. This setup is recommended for testing purposes only.Get the value of the root CA certificate from the management cluster and create a secret in the workload cluster.
kubectl get secret relay-root-tls-secret -n gloo-mesh --context $MGMT_CONTEXT -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt kubectl create secret generic relay-root-tls-secret -n gloo-mesh --context $REMOTE_CONTEXT1 --from-file ca.crt=ca.crt rm ca.crtkubectl get secret relay-root-tls-secret -n gloo-mesh --context $MGMT_CONTEXT -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt kubectl create secret generic relay-root-tls-secret -n gloo-mesh --context $REMOTE_CONTEXT2 --from-file ca.crt=ca.crt rm ca.crtGet the identity token from the management cluster and create a secret in the workload cluster.
kubectl get secret relay-identity-token-secret -n gloo-mesh --context $MGMT_CONTEXT -o jsonpath='{.data.token}' | base64 -d > token kubectl create secret generic relay-identity-token-secret -n gloo-mesh --context $REMOTE_CONTEXT1 --from-file token=token rm tokenkubectl get secret relay-identity-token-secret -n gloo-mesh --context $MGMT_CONTEXT -o jsonpath='{.data.token}' | base64 -d > token kubectl create secret generic relay-identity-token-secret -n gloo-mesh --context $REMOTE_CONTEXT2 --from-file token=token rm tokenMake sure that the following Helm values are added to your values file.
glooAgent: enabled: true
Make sure that the following Kubernetes secret exists in the
gloo-meshnamespace on each workload cluster.telemetry-root-secretthat holds the root CA certificate for the certificate chain
You can use the steps in BYO server certificate as a guidance for how to create this secret in the workload cluster.
In your Helm values file for the workload cluster, add the following values.
glooAgent: enabled: true extraEnvs: RELAY_DISABLE_SERVER_CERTIFICATE_VALIDATION: value: "true" RELAY_TOKEN: value: "My token" telemetryCollector: enabled: true extraVolumes: - name: root-ca secret: defaultMode: 420 optional: true secretName: telemetry-root-secret - configMap: items: - key: relay path: relay.yaml name: gloo-telemetry-collector-config name: telemetry-configmap - hostPath: path: /var/run/cilium type: DirectoryOrCreate name: cilium-run telemetryCollectorCustomization: skipVerify: trueHelm value Description RELAY_TOKENThe relay token to establish initial trust between the management server and the agent. The relay token is saved in memory on the agent. You must set the same value that you set in glooMgmtServer.extraEnvs.RELAY_TOKEN.valuewhen you installed the Solo Enterprise for Istio management plane to allow agents to connect to the management server.RELAY_DISABLE_SERVER_CERTIFICATE_VALIDATIONSet to true to skip validating the server TLS certificate that the management server presents. This setting is required to configure the relay connection for TLS. telemetryCollector.extraVolumesAdd the telemetry-root-secretKubernetes secret that you created earlier to theroot-cavolume. Make sure that you also add the other volumes to your telemetry collector configuration.telemetryCollectorCustomization.skipVerifySet to true to skip validation of the server certificate that the telemetry gateway presents. By default, the telemetry gateway uses the same TLS certificates that the management server uses for the relay connection. If you configure the relay connection for TLS, you must set skipVerifyto true on the telemetry collector agent.
Do not use self-signed certs for production. This setup is recommended for testing purposes only.In your Helm values file for the workload cluster, add the following values.
glooAgent: enabled: true extraEnvs: RELAY_DISABLE_SERVER_CERTIFICATE_VALIDATION: value: "true" RELAY_TOKEN: value: "My token" telemetryCollector: enabled: true telemetryCollectorCustomization: skipVerify: trueHelm value Description RELAY_TOKENThe relay token to establish initial trust between the management server and the agent. The relay token is saved in memory on the agent. You must set the same value that you set in glooMgmtServer.extraEnvs.RELAY_TOKEN.valuewhen you installed the Solo Enterprise for Istio management plane to allow agents to connect to the management server.RELAY_DISABLE_SERVER_CERTIFICATE_VALIDATIONSet to true to skip validating the server TLS certificate that the management server presents. This setting is required to configure the relay connection for TLS. telemetryCollectorCustomization.skipVerifySet to true to skip validation of the server certificate that the telemetry gateway presents. By default, the telemetry gateway uses the same TLS certificates that the management server uses for the relay connection. If you configure the relay connection for TLS, you must set skipVerifyto true on the telemetry collector agent.Edit the file to provide your own details for settings that are recommended for production deployments, such as the following settings.
For more information about the settings you can configure:
- See Best practices for production.
- See all possible fields for the Helm chart by running
helm show values gloo-platform/gloo-platform --version v2.11.5 > all-values.yaml. You can also see these fields in the Helm values documentation.
Field Description glooAgent.resources.limitsAdd resource limits for the gloo-mesh-mgmt-serverpod, such ascpu: 500mandmemory: 512Mi.Use the customizations in your Helm values file to install the Gloo data plane components in your workload cluster.
helm upgrade -i gloo-platform gloo-platform/gloo-platform \ --kube-context $REMOTE_CONTEXT \ -n gloo-mesh \ --version $GLOO_VERSION \ --values data-plane.yaml \ --set common.cluster=$REMOTE_CLUSTER \ --set glooAgent.relay.serverAddress=$MGMT_SERVER_NETWORKING_ADDRESS \ --set telemetryCollector.config.exporters.otlp.endpoint=$TELEMETRY_GATEWAY_ADDRESSElevate the permissions of the
gloo-meshservice account that will be created.oc adm policy add-scc-to-group anyuid system:serviceaccounts:gloo-mesh --context $REMOTE_CONTEXTInstall the Gloo agent in your workload cluster.
helm upgrade -i gloo-platform gloo-platform/gloo-platform \ --kube-context $REMOTE_CONTEXT \ -n gloo-mesh \ --version $GLOO_VERSION \ --values data-plane.yaml \ --set common.cluster=$REMOTE_CLUSTER \ --set glooAgent.relay.serverAddress=$MGMT_SERVER_NETWORKING_ADDRESS \ --set telemetryCollector.config.exporters.otlp.endpoint=$TELEMETRY_GATEWAY_ADDRESS \ --set glooAgent.floatingUserId=true
Verify that the Gloo data plane component pods are running. If not, try debugging the agent.
kubectl get pods -n gloo-mesh --context $REMOTE_CONTEXTExample output:
NAME READY STATUS RESTARTS AGE gloo-mesh-agent-8ffc775c4-tk2z5 2/2 Running 0 90s gloo-telemetry-collector-agent-g8p7x 1/1 Running 0 90s gloo-telemetry-collector-agent-mp2wd 1/1 Running 0 90sRepeat steps 1 - 8 to register each workload cluster with Gloo.
Verify that your Solo Enterprise for Istio setup is correctly installed. If not, try debugging the relay connection. Note that this check might take a few seconds to verify that:
- Your Solo product licenses are valid and current.
- The Gloo CRDs are installed at the correct version.
- The management plane pods in the management cluster are running and healthy.
- The agents in the workload clusters are successfully identified by the management server.
- Any Istio installation versions are compatible with the installed Gloo version.
meshctl check --kubecontext $MGMT_CONTEXTExample output:
🟢 License status INFO gloo-mesh enterprise license expiration is 25 Aug 24 10:38 CDT 🟢 CRD version check 🟢 Gloo deployment status Namespace | Name | Ready | Status gloo-mesh | gloo-mesh-mgmt-server | 1/1 | Healthy gloo-mesh | gloo-mesh-redis | 1/1 | Healthy gloo-mesh | gloo-mesh-ui | 1/1 | Healthy gloo-mesh | gloo-telemetry-gateway | 1/1 | Healthy gloo-mesh | prometheus-server | 1/1 | Healthy gloo-mesh | gloo-telemetry-collector-agent | 2/2 | Healthy 🟢 Mgmt server connectivity to workload agents Cluster | Registered | Connected Pod cluster1 | true | gloo-mesh/gloo-mesh-mgmt-server-65bd557b95-v8qq6 cluster2 | true | gloo-mesh/gloo-mesh-mgmt-server-65bd557b95-v8qq6 Connected Pod | Clusters gloo-mesh/gloo-mesh-mgmt-server-65bd557b95-v8qq6 | 2 🟢 Istio compatibility check All Istio versions found are compatibleIf you have not installed Istio in each workload cluster yet, see the guides for installing Istio in sidecar or ambient mode.
Explore the UI
Now that the management plane is up and running, launch the Gloo UI to evaluate the health and efficiency of your service mesh. You can review the analysis and insights for your service mesh, such as recommendations to harden your Istio environment and steps to implement them in your environment.
Launch the dashboard
Open the Gloo UI. The Gloo UI is served from the
gloo-mesh-uiservice on port 8090. You can connect by using themeshctlorkubectlCLIs.For more information, see the CLI documentation.
meshctl dashboard --kubecontext $MGMT_CONTEXT- Port-forward the
gloo-mesh-uiservice on 8090.kubectl port-forward -n gloo-mesh --context $MGMT_CONTEXT svc/gloo-mesh-ui 8090:8090 - Open your browser and connect to http://localhost:8090.
- Port-forward the
Review your Dashboard for an at-a-glance overview of your Solo Enterprise for Istio environment. Environment insights, health, status, inventories, security, and more are summarized in the dashboard cards. For more information about all available features, see Explore the UI.

Figure: Gloo UI dashboard 
Figure: Gloo UI dashboard
Check insights
Review the insights for your environment. Solo Enterprise for Istio comes with an insights engine that automatically analyzes your Istio setups for health issues. These issues are displayed in the UI along with recommendations to harden your Istio setups. The insights give you a checklist to address issues that might otherwise be hard to detect across your environment.
From the Dashboard, click on any of the insights cards to open the Insights page, or go to the Insights page directly.
On the Insights page, you can view recommendations to harden your Istio setup, and steps to implement them in your environment. Solo Enterprise for Istio analyzes your setup, and returns individual insights that contain information about errors and warnings in your environment, best practices you can use to improve your configuration and security, and more.

Figure: Insights page 
Figure: Insights page Select the insight that you want to resolve. The details modal shows more data about the insight, such as the time when it was last observed in your environment, and if applicable, the extended settings or configuration that the insight applies to.

Figure: Example insight 
Figure: Example insight Click the Target YAML tab to see the resource file that the insight references, and click the Resolution Steps tab to see guidance such as steps for fixing warnings and errors in your resource configuration or recommendations for improving your security and setup.
Next steps
Check out some of the following resources to learn more about Solo Enterprise for Istio and expand your service mesh capabilities.
Solo Enterprise for Istio:
- When it’s time to upgrade Solo Enterprise for Istio, see the upgrade guide.
Istio:
- If you have not installed Istio yet, see the guides for installing an ambient mesh.If you use Istio versions 1.27.7, 1.28.4, 1.29.0 or later, and you install the Solo Enterprise for Istio management plane into a namespace other than
gloo-mesh, you must allow that namespace by listing it in theDEBUG_ENDPOINT_AUTH_ALLOWED_NAMESPACESenvironment variable of your istiod installation. For more information, see the release notes.
Help and support:
- 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.
- Prepare a Helm values file to provide your customizations. To get started, you can use the minimum settings in the following profile as a basis. These settings enable all components that are required for a Gloo data plane installation.