Migrate to the Gloo Operator
Switch from your existing sidecar installations to Gloo-managed service meshes.
Overview
If you have existing Istio installations and want to switch to using the Gloo Operator for service mesh management, you can use one of the following guides:
- Revisioned Helm: You installed Istio with Helm. To add namespaces to the service mesh, you used revision labels such as
istio.io/rev=1-28. - Revisionless Helm: You installed Istio with Helm. To add namespaces to the service mesh, you used the sidecar injection label,
istio-injection=enabled. - Istio lifecycle manager: You installed Istio and gateways by using Solo’s Istio lifecycle manager, such as by using the default settings in the getting started guides, the
istioInstallationsHelm settings in your Gloo Helm chart, or by directly creating IstioLifecycleManager and GatewayLifecycleManager custom resources.
The Gloo Operator uses the gloo revision by default to manage Istio installations in your cluster. This revision is used to facilitate initial migration to the Gloo Operator. However, after migration, in-place upgrades are recommended for further operator-managed changes. For more information, see the Gloo Operator upgrade guide.
Migrate from revisioned Helm installations
If you currently install Istio by using Helm and use revisions to manage your installations, you can migrate from your community Istio revision, such as 1-28, to the gloo revision. The Gloo Operator uses the gloo revision by default to manage Istio installations in your cluster.
Save your Istio installation values in environment variables.
If you do not already have a license, decide the level of licensed features that you want, and contact an account representative to obtain the license.
Choose the version of Istio that you want to install or upgrade to by reviewing the supported versions table.
Save each value in an environment variable. If you prefer to specify license keys in a secret instead, see Licensing. Note that the Gloo Operator installs the Solo distribution of Istio by default for the version you specify, so neither the
-soloimage tag nor the repo URL are required.export SOLO_LICENSE_KEY=<license_key> export ISTIO_VERSION=1.28.1-patch0Install or upgrade
istioctlwith the same version of Istio that you saved.curl -L https://istio.io/downloadIstio | ISTIO_VERSION=${ISTIO_VERSION} sh - cd istio-${ISTIO_VERSION} export PATH=$PWD/bin:$PATH
Install the Gloo Operator and deploy a managed istiod control plane.
Install the Gloo Operator to the
gloo-meshnamespace. This operator deploys and manages your Istio installation. For more information, see the Helm reference. Note that if you already installed Gloo Mesh, you can optionally reference the secret that Gloo Mesh (OSS APIs) automatically creates for your license in the–set manager.env.SOLO_ISTIO_LICENSE_KEY_SECRET_REF=gloo-mesh/license-keysflag instead.helm install gloo-operator oci://us-docker.pkg.dev/solo-public/gloo-operator-helm/gloo-operator \ --version 0.4.2 \ -n gloo-mesh \ --create-namespace \ --set manager.env.SOLO_ISTIO_LICENSE_KEY=${SOLO_LICENSE_KEY}Verify that the operator pod is running.
kubectl get pods -n gloo-mesh -l app.kubernetes.io/name=gloo-operatorExample output:
gloo-operator-78d58d5c7b-lzbr5 1/1 Running 0 48sCreate a ServiceMeshController custom resource to configure an Istio installation. For more information about the configurable fields, see the installation guide.
kubectl apply -n gloo-mesh -f -<<EOF apiVersion: operator.gloo.solo.io/v1 kind: ServiceMeshController metadata: name: managed-istio labels: app.kubernetes.io/name: managed-istio spec: cluster: $CLUSTER_NAME dataplaneMode: Sidecar version: ${ISTIO_VERSION} # Uncomment if you installed the istio-cni # onConflict: Force EOFIf you currently install theistio-cniplugin by using Helm, you must directly replace the CNI to avoid downtime by settingonConflict: Force.If you set theinstallNamespaceto a namespace other thangloo-system,gloo-mesh, oristio-system, you must include the--set manager.env.WATCH_NAMESPACES=<namespace>setting.Verify that the ServiceMeshController is ready. In the
Statussection of the output, make sure that all statuses areTrue, and that the phase isSUCCEEDED.kubectl describe servicemeshcontroller -n gloo-mesh managed-istioExample output:
... Status: Conditions: Last Transition Time: 2024-12-27T20:47:01Z Message: Manifests initialized Observed Generation: 1 Reason: ManifestsInitialized Status: True Type: Initialized Last Transition Time: 2024-12-27T20:47:02Z Message: CRDs installed Observed Generation: 1 Reason: CRDInstalled Status: True Type: CRDInstalled Last Transition Time: 2024-12-27T20:47:02Z Message: Deployment succeeded Observed Generation: 1 Reason: DeploymentSucceeded Status: True Type: ControlPlaneDeployed Last Transition Time: 2024-12-27T20:47:02Z Message: Deployment succeeded Observed Generation: 1 Reason: DeploymentSucceeded Status: True Type: CNIDeployed Last Transition Time: 2024-12-27T20:47:02Z Message: Deployment succeeded Observed Generation: 1 Reason: DeploymentSucceeded Status: True Type: WebhookDeployed Last Transition Time: 2024-12-27T20:47:02Z Message: All conditions are met Observed Generation: 1 Reason: SystemReady Status: True Type: Ready Phase: SUCCEEDED Events: <none>
Migrate your Istio-managed workloads to the managed
gloocontrol plane.Get the workload namespaces that you previously labeled with an Istio revision, such as
1-28in the following example.kubectl get namespaces -l istio.io/rev=1-28Overwrite the revision label for each of the workload namespaces with the
gloorevision label.kubectl label namespace <namespace> istio.io/rev=gloo --overwriteRestart the workloads in each labeled namespace so that they are managed by the Gloo Operator Istio installation.
- To restart all deployments in the namespace:
kubectl rollout restart deployment -n <namespace> - To restart individual deployments in the namespace, such as to test a small number of deployments or to stagger the restart process:
kubectl rollout restart deployment <deployment> -n <namespace>
- To restart all deployments in the namespace:
Verify that the workloads are successfully migrated. In the output, the name of istiod includes the
gloorevision, indicating that the workload is now part of the Gloo-revisioned service mesh.istioctl proxy-statusExample output:
NAME CLUSTER ... ISTIOD VERSION details-v1-7b6df9d8c8-s6kg5.bookinfo cluster1 ... istiod-gloo-7c8f6fd4c4-m9k9t 1.28.1-patch0-solo productpage-v1-bb494b7d7-xbtxr.bookinfo cluster1 ... istiod-gloo-7c8f6fd4c4-m9k9t 1.28.1-patch0-solo ratings-v1-55b478cfb6-wv2m5.bookinfo cluster1 ... istiod-gloo-7c8f6fd4c4-m9k9t 1.28.1-patch0-solo reviews-v1-6dfcc9fc7d-7k6qh.bookinfo cluster1 ... istiod-gloo-7c8f6fd4c4-m9k9t 1.28.1-patch0-solo reviews-v2-7dddd799b5-m5n2z.bookinfo cluster1 ... istiod-gloo-7c8f6fd4c4-m9k9t 1.28.1-patch0-solo
Update any existing Istio ingress or egress gateways to the
gloorevision.Get the name and namespace of your gateway Helm release.
helm ls -AGet the current values for the gateway Helm release in your cluster.
helm get values <gateway_release> -n <namespace> -o yaml > gateway.yamlUpgrade your gateway Helm release.
helm upgrade -i <gateway_release> istio/gateway \ --version 1.28.1-patch0 \ --namespace <namespace> \ --set "revision=gloo" \ -f gateway.yamlVerify that the gateway is successfully migrated. In the output, the name of istiod includes the
gloorevision, indicating that the gateway is now included in the Gloo-revisioned data plane.istioctl proxy-status | grep gatewayExample output:
NAME CLUSTER ... ISTIOD VERSION istio-ingressgateway-bdc4fd65f-ftmz9.istio-ingress cluster1 ... istiod-gloo-6495985689-rkwwd 1.28.1-patch0-solo
Verify that Istio still correctly routes traffic requests to apps in your mesh. For example, if you deployed the Bookinfo sample app, you can send a curl request to the product page.
kubectl port-forward -n istio-ingress svc/istio-ingressgateway 8080:80 curl -v http://localhost:8080/productpageGet the name and namespace of your previous istiod Helm release.
helm ls -AUninstall the unmanaged control plane.
helm uninstall <istiod_release> -n istio-systemOptional: If you previously installed the Istio CNI pods with a Helm chart, uninstall the release and delete the secret stored by Helm.
helm uninstall <cni_release> -n istio-system kubectl delete secret "sh.helm.release.v1.istio-cni.v1" -n istio-systemSend another request to your apps to verify that traffic is still flowing.
kubectl port-forward -n istio-ingress svc/istio-ingressgateway 8080:80 curl -v http://localhost:8080/productpage
The migration of your service mesh is now complete!
Migrate from revisionless Helm installations
If you currently install Istio by using Helm and do not use revisions to manage your installations, such as by labeling namespaces with istio-injection: enabled, you can migrate the management of the MutatingWebhookConfiguration to the Gloo Operator. The Gloo Operator uses the gloo revision by default to manage Istio installations in your cluster.
Save your Istio installation values in environment variables.
If you do not already have a license, decide the level of licensed features that you want, and contact an account representative to obtain the license.
Choose the version of Istio that you want to install or upgrade to by reviewing the supported versions table.
Save each value in an environment variable. If you prefer to specify license keys in a secret instead, see Licensing. Note that the Gloo Operator installs the Solo distribution of Istio by default for the version you specify, so neither the
-soloimage tag nor the repo URL are required.export SOLO_LICENSE_KEY=<license_key> export ISTIO_VERSION=1.28.1-patch0Install or upgrade
istioctlwith the same version of Istio that you saved.curl -L https://istio.io/downloadIstio | ISTIO_VERSION=${ISTIO_VERSION} sh - cd istio-${ISTIO_VERSION} export PATH=$PWD/bin:$PATH
Install the Gloo Operator and deploy a managed istiod control plane.
Install the Gloo Operator to the
gloo-meshnamespace. This operator deploys and manages your Istio installation. For more information, see the Helm reference. Note that if you already installed Gloo Mesh, you can optionally reference the secret that Gloo Mesh (OSS APIs) automatically creates for your license in the–set manager.env.SOLO_ISTIO_LICENSE_KEY_SECRET_REF=gloo-mesh/license-keysflag instead.helm install gloo-operator oci://us-docker.pkg.dev/solo-public/gloo-operator-helm/gloo-operator \ --version 0.4.2 \ -n gloo-mesh \ --create-namespace \ --set manager.env.SOLO_ISTIO_LICENSE_KEY=${SOLO_LICENSE_KEY}Verify that the operator pod is running.
kubectl get pods -n gloo-mesh -l app.kubernetes.io/name=gloo-operatorExample output:
gloo-operator-78d58d5c7b-lzbr5 1/1 Running 0 48sCreate a ServiceMeshController custom resource to configure an Istio installation. For more information about the configurable fields, see the installation guide.
kubectl apply -n gloo-mesh -f -<<EOF apiVersion: operator.gloo.solo.io/v1 kind: ServiceMeshController metadata: name: managed-istio labels: app.kubernetes.io/name: managed-istio spec: cluster: $CLUSTER_NAME dataplaneMode: Sidecar version: ${ISTIO_VERSION} # Uncomment if you installed the istio-cni # onConflict: Force EOFIf you currently install theistio-cniplugin by using Helm, you must directly replace the CNI to avoid downtime by settingonConflict: Force.If you set theinstallNamespaceto a namespace other thangloo-system,gloo-mesh, oristio-system, you must include the--set manager.env.WATCH_NAMESPACES=<namespace>setting.Describe the ServiceMeshController and note that it cannot take over the
istio-injection: enabledlabel until the webhook is deleted.kubectl describe ServiceMeshController -n gloo-mesh managed-istioExample output:
- lastTransitionTime: "2024-12-12T19:41:52Z" message: MutatingWebhookConfiguration istio-sidecar-injector references default Istio revision istio-system/istiod; must be deleted before migration observedGeneration: 1 reason: ErrorConflictDetected status: "False" type: WebhookDeployedDelete the existing webhook.
kubectl delete mutatingwebhookconfiguration istio-sidecar-injector -n istio-systemVerify that the ServiceMeshController is now healthy. In the
Statussection of the output, make sure that all statuses areTrue, and that the phase isSUCCEEDED.kubectl describe servicemeshcontroller -n gloo-mesh managed-istioExample output:
... Status: Conditions: Last Transition Time: 2024-12-27T20:47:01Z Message: Manifests initialized Observed Generation: 1 Reason: ManifestsInitialized Status: True Type: Initialized Last Transition Time: 2024-12-27T20:47:02Z Message: CRDs installed Observed Generation: 1 Reason: CRDInstalled Status: True Type: CRDInstalled Last Transition Time: 2024-12-27T20:47:02Z Message: Deployment succeeded Observed Generation: 1 Reason: DeploymentSucceeded Status: True Type: ControlPlaneDeployed Last Transition Time: 2024-12-27T20:47:02Z Message: Deployment succeeded Observed Generation: 1 Reason: DeploymentSucceeded Status: True Type: CNIDeployed Last Transition Time: 2024-12-27T20:47:02Z Message: Deployment succeeded Observed Generation: 1 Reason: DeploymentSucceeded Status: True Type: WebhookDeployed Last Transition Time: 2024-12-27T20:47:02Z Message: All conditions are met Observed Generation: 1 Reason: SystemReady Status: True Type: Ready Phase: SUCCEEDED Events: <none>
Migrate your Istio-managed workloads to the managed control plane.
Get the workload namespaces that you previously included in the service mesh by using the
istio-injection=enabledlabel.kubectl get namespaces -l istio-injection=enabledLabel each workload namespace with the
gloorevision label.kubectl label namespace <namespace> istio.io/rev=gloo --overwriteRestart your workloads so that they are managed by the Gloo Operator Istio installation.
- To restart all deployments in the namespace:
kubectl rollout restart deployment -n <namespace> - To restart individual deployments in the namespace, such as to test a small number of deployments or to stagger the restart process:
kubectl rollout restart deployment <deployment> -n <namespace>
- To restart all deployments in the namespace:
Verify that the workloads are successfully migrated. In the output, the name of istiod includes the
gloorevision, indicating that the workload is now part of the Gloo-revisioned service mesh.istioctl proxy-statusExample output:
NAME CLUSTER ... ISTIOD VERSION details-v1-7b6df9d8c8-s6kg5.bookinfo cluster1 ... istiod-gloo-7c8f6fd4c4-m9k9t 1.28.1-patch0-solo productpage-v1-bb494b7d7-xbtxr.bookinfo cluster1 ... istiod-gloo-7c8f6fd4c4-m9k9t 1.28.1-patch0-solo ratings-v1-55b478cfb6-wv2m5.bookinfo cluster1 ... istiod-gloo-7c8f6fd4c4-m9k9t 1.28.1-patch0-solo reviews-v1-6dfcc9fc7d-7k6qh.bookinfo cluster1 ... istiod-gloo-7c8f6fd4c4-m9k9t 1.28.1-patch0-solo reviews-v2-7dddd799b5-m5n2z.bookinfo cluster1 ... istiod-gloo-7c8f6fd4c4-m9k9t 1.28.1-patch0-soloRemove the
istio-injection=enabledlabel from the workload namespaces.kubectl label ns <namespace> istio-injection-
Migrate any existing Istio ingress or egress gateways to the managed
gloocontrol plane.Get the deployment name of your gateway.
kubectl get deploy -n <gateway_namespace>Update each Istio gateway by restarting it.
kubectl rollout restart deploy <gateway_name> -n <namespace>Verify that the gateway is successfully migrated. In the output, the name of istiod includes the
gloorevision, indicating that the gateway is now included in the Gloo-revisioned data plane.istioctl proxy-status | grep gatewayExample output:
NAME CLUSTER ... ISTIOD VERSION istio-ingressgateway-bdc4fd65f-ftmz9.istio-ingress cluster1 ... istiod-gloo-6495985689-rkwwd 1.28.1-patch0-solo
Verify that Istio still correctly routes traffic requests to apps in your mesh. For example, if you deployed the Bookinfo sample app, you can send a curl request to the product page.
kubectl port-forward -n istio-ingress svc/istio-ingressgateway 8080:80 curl -v http://localhost:8080/productpageGet the name and namespace of your previous istiod Helm release.
helm ls -AUninstall the unmanaged control plane.
helm uninstall <istiod_release> -n istio-systemOptional: If you previously installed the Istio CNI pods with a Helm chart, uninstall the release and delete the secret stored by Helm.
helm uninstall <cni_release> -n istio-system kubectl delete secret "sh.helm.release.v1.istio-cni.v1" -n istio-systemSend another request to your apps to verify that traffic is still flowing.
kubectl port-forward -n istio-ingress svc/istio-ingressgateway 8080:80 curl -v http://localhost:8080/productpage
The migration of your service mesh is now complete!
Migrate from the Istio lifecycle manager
You might have previously installed Istio and gateways by using Solo’s Istio lifecycle manager, such as by using the default settings in the getting started guides, the istioInstallations Helm settings in your Gloo Helm chart, or by directly creating IstioLifecycleManager and GatewayLifecycleManager custom resources. You can migrate from the Istio revision that your lifecycle manager currently runs, such as 1-28, to the revision that the Gloo Operator uses by default to manage Istio installations in your cluster, gloo.
Single cluster
Save your Istio installation values in environment variables.
If you do not already have a license, decide the level of licensed features that you want, and contact an account representative to obtain the license.
Choose the version of Istio that you want to install or upgrade to by reviewing the supported versions table.
Save each value in an environment variable. If you prefer to specify license keys in a secret instead, see Licensing. Note that the Gloo Operator installs the Solo distribution of Istio by default for the version you specify, so neither the
-soloimage tag nor the repo URL are required.export SOLO_LICENSE_KEY=<license_key> export ISTIO_VERSION=1.28.1-patch0Install or upgrade
istioctlwith the same version of Istio that you saved.curl -L https://istio.io/downloadIstio | ISTIO_VERSION=${ISTIO_VERSION} sh - cd istio-${ISTIO_VERSION} export PATH=$PWD/bin:$PATH
Install the Gloo Operator and deploy a managed istiod control plane.
Install the Gloo Operator to the
gloo-meshnamespace. This operator deploys and manages your Istio installation. For more information, see the Helm reference. Note that if you already installed Gloo Mesh, you can optionally reference the secret that Gloo Mesh (OSS APIs) automatically creates for your license in the–set manager.env.SOLO_ISTIO_LICENSE_KEY_SECRET_REF=gloo-mesh/license-keysflag instead.helm install gloo-operator oci://us-docker.pkg.dev/solo-public/gloo-operator-helm/gloo-operator \ --version 0.4.2 \ -n gloo-mesh \ --create-namespace \ --set manager.env.SOLO_ISTIO_LICENSE_KEY=${SOLO_LICENSE_KEY}Verify that the operator pod is running.
kubectl get pods -n gloo-mesh -l app.kubernetes.io/name=gloo-operatorExample output:
gloo-operator-78d58d5c7b-lzbr5 1/1 Running 0 48sCreate a ServiceMeshController custom resource to configure an Istio installation. For more information about the configurable fields, see the installation guide.
kubectl apply -n gloo-mesh -f -<<EOF apiVersion: operator.gloo.solo.io/v1 kind: ServiceMeshController metadata: name: managed-istio labels: app.kubernetes.io/name: managed-istio spec: cluster: $CLUSTER_NAME dataplaneMode: Sidecar version: ${ISTIO_VERSION} # Uncomment if you installed the istio-cni # onConflict: Force EOFIf you currently install theistio-cniplugin by using Helm, you must directly replace the CNI to avoid downtime by settingonConflict: Force.If you set theinstallNamespaceto a namespace other thangloo-system,gloo-mesh, oristio-system, you must include the--set manager.env.WATCH_NAMESPACES=<namespace>setting.Verify that the ServiceMeshController is ready. In the
Statussection of the output, make sure that all statuses areTrue, and that the phase isSUCCEEDED.kubectl describe servicemeshcontroller -n gloo-mesh managed-istioExample output:
... Status: Conditions: Last Transition Time: 2024-12-27T20:47:01Z Message: Manifests initialized Observed Generation: 1 Reason: ManifestsInitialized Status: True Type: Initialized Last Transition Time: 2024-12-27T20:47:02Z Message: CRDs installed Observed Generation: 1 Reason: CRDInstalled Status: True Type: CRDInstalled Last Transition Time: 2024-12-27T20:47:02Z Message: Deployment succeeded Observed Generation: 1 Reason: DeploymentSucceeded Status: True Type: ControlPlaneDeployed Last Transition Time: 2024-12-27T20:47:02Z Message: Deployment succeeded Observed Generation: 1 Reason: DeploymentSucceeded Status: True Type: CNIDeployed Last Transition Time: 2024-12-27T20:47:02Z Message: Deployment succeeded Observed Generation: 1 Reason: DeploymentSucceeded Status: True Type: WebhookDeployed Last Transition Time: 2024-12-27T20:47:02Z Message: All conditions are met Observed Generation: 1 Reason: SystemReady Status: True Type: Ready Phase: SUCCEEDED Events: <none>
Migrate your Istio-managed workloads to the managed
gloocontrol plane.Get the workload namespaces that you previously labeled with an Istio revision, such as
1-28in the following example.kubectl get namespaces -l istio.io/rev=1-28Overwrite the revision label for each of the workload namespaces with the
gloorevision label.kubectl label namespace <namespace> istio.io/rev=gloo --overwriteRestart the workloads in each labeled namespace so that they are managed by the Gloo Operator Istio installation.
- To restart all deployments in the namespace:
kubectl rollout restart deployment -n <namespace> - To restart individual deployments in the namespace, such as to test a small number of deployments or to stagger the restart process:
kubectl rollout restart deployment <deployment> -n <namespace>
- To restart all deployments in the namespace:
Verify that the workloads are successfully migrated. In the output, the name of istiod includes the
gloorevision, indicating that the workload is now part of the Gloo-revisioned service mesh.istioctl proxy-statusExample output:
NAME CLUSTER ... ISTIOD VERSION details-v1-7b6df9d8c8-s6kg5.bookinfo cluster1 ... istiod-gloo-7c8f6fd4c4-m9k9t 1.28.1-patch0-solo productpage-v1-bb494b7d7-xbtxr.bookinfo cluster1 ... istiod-gloo-7c8f6fd4c4-m9k9t 1.28.1-patch0-solo ratings-v1-55b478cfb6-wv2m5.bookinfo cluster1 ... istiod-gloo-7c8f6fd4c4-m9k9t 1.28.1-patch0-solo reviews-v1-6dfcc9fc7d-7k6qh.bookinfo cluster1 ... istiod-gloo-7c8f6fd4c4-m9k9t 1.28.1-patch0-solo reviews-v2-7dddd799b5-m5n2z.bookinfo cluster1 ... istiod-gloo-7c8f6fd4c4-m9k9t 1.28.1-patch0-solo
For each gateway that the gateway lifecycle manager created, create Helm releases to deploy new Istio gateways to the
gloorevision.Create a new ingress gateway Helm release for the
gloocontrol plane revision. Note that if you maintain your own services to expose gateways, you can disable the load balancer services that are defined by default in the gateway Helm release by including the--set service.type=Noneflag in this command. Then, you can switch from the old to the new gateways by updating the load balancer services to point to the new gateways.helm install istio-ingressgateway istio/gateway \ --version ${ISTIO_VERSION} \ --namespace istio-ingress \ --set "revision=gloo"Verify that the gateway is successfully deployed. In the output, the name of istiod includes the
gloorevision, indicating that the gateway is included in the Gloo-revisioned data plane.istioctl proxy-status | grep gatewayExample output:
NAME CLUSTER ... ISTIOD VERSION istio-ingressgateway-bdc4fd65f-ftmz9.istio-ingress cluster1 ... istiod-gloo-6495985689-rkwwd 1.28.1-patch0-solo
Verify that Istio now routes traffic requests to apps in your mesh through the new gateway that you deployed. For example, if you deployed the Bookinfo sample app, you can send a curl request to the product page.
kubectl port-forward -n istio-ingress svc/istio-ingressgateway 8080:80 curl -v http://localhost:8080/productpageDelete the GatewayLifecycleManager and IstioLifecycleManager managed installations. The steps vary based on whether you created the resources directly, or used the
istioInstallationssection of thegloo-platformHelm chart.Optional: If you previously installed the Istio CNI pods with a Helm chart, uninstall the release and delete the secret stored by Helm.
helm uninstall <cni_release> -n istio-system kubectl delete secret "sh.helm.release.v1.istio-cni.v1" -n istio-systemSend another request to your apps to verify that traffic is still flowing.
kubectl port-forward -n istio-ingress svc/istio-ingressgateway 8080:80 curl -v http://localhost:8080/productpage
The migration of your service mesh is now complete!
Multicluster
Considerations
Before you install a multicluster sidecar mesh, review the following considerations and requirements.
Version and license requirements
- Multicluster setups require the Solo distribution of Istio version 1.24.3 or later (
1.24.3-solo), including the Solo distribution ofistioctl. - This feature requires your mesh to be installed with the Solo distribution of Istio and an Enterprise-level license for Gloo Mesh (OSS APIs). Contact your account representative to obtain a valid license.
Components
In the following steps, you install the Istio ambient components in each workload cluster to successfully create east-west gateways and establish multicluster peering, even if you plan to use a sidecar mesh. However, sidecar mesh setups continue to use sidecar injection for your workloads. Your workloads are not added to an ambient mesh. For more information about running both ambient and sidecar components in one mesh setup, see Ambient-sidecar interoperability.
Migrate each service mesh
Save your Istio installation values in environment variables.
Set your Enterprise level license for Gloo Mesh 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.
export GLOO_MESH_LICENSE_KEY=<enterprise_license_key>Choose the version of Istio that you want to install or upgrade to by reviewing the supported versions.
Save the Solo distribution of Istio version.
export ISTIO_VERSION=1.28.1-patch0 export ISTIO_IMAGE=${ISTIO_VERSION}-soloSave the repo key for the minor version of the Solo distribution of Istio that you want to install. This is the 12-character hash at the end of the repo URL
us-docker.pkg.dev/gloo-mesh/istio-<repo-key>, which you can find in the Istio images built by Solo.io support article.# 12-character hash at the end of the repo URL export REPO_KEY=<repo_key> export REPO=us-docker.pkg.dev/gloo-mesh/istio-${REPO_KEY} export HELM_REPO=us-docker.pkg.dev/gloo-mesh/istio-helm-${REPO_KEY}Get the Solo distribution of Istio binary and install
istioctl, which you use for multicluster linking and gateway commands.Get the OS and architecture that you use on your machine.
OS=$(uname | tr '[:upper:]' '[:lower:]' | sed -E 's/darwin/osx/') ARCH=$(uname -m | sed -E 's/aarch/arm/; s/x86_64/amd64/; s/armv7l/armv7/') echo $OS echo $ARCHDownload the Solo distribution of Istio binary and install
istioctl.mkdir -p ~/.istioctl/bin curl -sSL https://storage.googleapis.com/istio-binaries-$REPO_KEY/$ISTIO_IMAGE/istioctl-$ISTIO_IMAGE-$OS-$ARCH.tar.gz | tar xzf - -C ~/.istioctl/bin chmod +x ~/.istioctl/bin/istioctl export PATH=${HOME}/.istioctl/bin:${PATH}Verify that the
istioctlclient runs the Solo distribution of Istio that you want to install.istioctl version --remote=falseExample output:
client version: 1.28.1-patch0-solo
Each cluster in the multicluster setup must have a shared root of trust. This can be achieved by providing a root certificate signed by a PKI provider, or a custom root certificate created for this purpose. The root certificate signs a unique intermediate CA certificate for each cluster.
Save the name and kubeconfig context of a workload cluster in the following environment variables. Each time you repeat the steps in this guide, you change these variables to the next workload cluster’s name and context.
export CLUSTER_NAME=<workload-cluster-name> export CLUSTER_CONTEXT=<workload-cluster-context>Install the Gloo Operator and deploy a managed istiod control plane.
Install the Gloo Operator to the
gloo-meshnamespace. This operator deploys and manages your Istio installation. For more information, see the Helm reference. Note that if you already installed Gloo Mesh, you can optionally reference the secret that Gloo Mesh (OSS APIs) automatically creates for your license in the–set manager.env.SOLO_ISTIO_LICENSE_KEY_SECRET_REF=gloo-mesh/license-keysflag instead.helm install gloo-operator oci://us-docker.pkg.dev/solo-public/gloo-operator-helm/gloo-operator \ --version 0.4.2 \ -n gloo-mesh \ --create-namespace \ --set manager.env.SOLO_ISTIO_LICENSE_KEY=${GLOO_MESH_LICENSE_KEY}Verify that the operator pod is running.
kubectl get pods -n gloo-mesh --context ${CLUSTER_CONTEXT} -l app.kubernetes.io/name=gloo-operatorExample output:
gloo-operator-78d58d5c7b-lzbr5 1/1 Running 0 48sCreate a ServiceMeshController custom resource to configure an Istio installation. For more information about the configurable fields, see the installation guide.
kubectl --context ${CLUSTER_CONTEXT} apply -n gloo-mesh -f -<<EOF apiVersion: operator.gloo.solo.io/v1 kind: ServiceMeshController metadata: name: managed-istio labels: app.kubernetes.io/name: managed-istio spec: cluster: ${CLUSTER_NAME} network: ${CLUSTER_NAME} dataplaneMode: Ambient # required for multicluster setups installNamespace: istio-system version: ${ISTIO_VERSION} # Uncomment if you installed the istio-cni # onConflict: Force EOFIf you currently install theistio-cniplugin by using Helm, you must directly replace the CNI to avoid downtime by settingonConflict: Force.If you set theinstallNamespaceto a namespace other thangloo-system,gloo-mesh, oristio-system, you must include the--set manager.env.WATCH_NAMESPACES=<namespace>setting.Verify that the ServiceMeshController is ready. In the
Statussection of the output, make sure that all statuses areTrue, and that the phase isSUCCEEDED.kubectl --context ${CLUSTER_CONTEXT} describe servicemeshcontroller -n gloo-mesh managed-istioExample output:
... Status: Conditions: Last Transition Time: 2024-12-27T20:47:01Z Message: Manifests initialized Observed Generation: 1 Reason: ManifestsInitialized Status: True Type: Initialized Last Transition Time: 2024-12-27T20:47:02Z Message: CRDs installed Observed Generation: 1 Reason: CRDInstalled Status: True Type: CRDInstalled Last Transition Time: 2024-12-27T20:47:02Z Message: Deployment succeeded Observed Generation: 1 Reason: DeploymentSucceeded Status: True Type: ControlPlaneDeployed Last Transition Time: 2024-12-27T20:47:02Z Message: Deployment succeeded Observed Generation: 1 Reason: DeploymentSucceeded Status: True Type: CNIDeployed Last Transition Time: 2024-12-27T20:47:02Z Message: Deployment succeeded Observed Generation: 1 Reason: DeploymentSucceeded Status: True Type: WebhookDeployed Last Transition Time: 2024-12-27T20:47:02Z Message: All conditions are met Observed Generation: 1 Reason: SystemReady Status: True Type: Ready Phase: SUCCEEDED Events: <none>
Migrate your Istio-managed workloads to the managed
gloocontrol plane. The steps vary based on whether you labeled workload namespaces with revision labels, such asistio.io/rev=1-28, or with injection labels, such asistio-injection=enabled.For each ingress or egress gateway that the gateway lifecycle manager created, create Helm releases to deploy new Istio gateways to the
gloorevision.For ingress gateways: Create a new ingress gateway Helm release for the
gloocontrol plane revision. Note that if you maintain your own services to expose the gateways, you can disable the load balancer services that are defined by default in the gateway Helm release by including the--set service.type=Noneflag in this command. Then, you can switch from the old to the new gateways by updating the load balancer services to point to the new gateways.helm install istio-ingressgateway istio/gateway \ --kube-context ${CLUSTER_CONTEXT} \ --version ${ISTIO_VERSION} \ --namespace istio-ingress \ --create-namespace \ --set "revision=gloo"Verify that the gateways are successfully deployed. In the output, the name of istiod includes the
gloorevision, indicating that the gateways are included in the Gloo-revisioned data plane.istioctl --context ${CLUSTER_CONTEXT} proxy-status | grep gatewayExample output:
NAME CLUSTER ... ISTIOD VERSION istio-eastwestgateway-bdc4fd65f-ftmz9.istio-eastwest cluster1 ... istiod-gloo-6495985689-rkwwd 1.28.1-patch0-solo istio-ingressgateway-bdc4fd65f-ftmz9.istio-ingress cluster1 ... istiod-gloo-6495985689-rkwwd 1.28.1-patch0-solo
Verify that Istio now routes traffic requests to apps in your mesh through the new gateway that you deployed. For example, if you deployed the Bookinfo sample app, you can send a curl request to the product page.
kubectl --context ${CLUSTER_CONTEXT} port-forward -n istio-ingress svc/istio-ingressgateway 8080:80 curl -v http://localhost:8080/productpageOptional: If you previously installed the Istio CNI pods with a Helm chart, uninstall the release and delete the secret stored by Helm.
helm uninstall <cni_release> -n istio-system kubectl delete secret "sh.helm.release.v1.istio-cni.v1" -n istio-systemApply the CRDs for the Kubernetes Gateway API to your cluster, which are required to create components such as waypoint proxies for L7 traffic policies, gateways with the
Gatewayresource, and more.kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.4.0/standard-install.yaml --context ${CLUSTER_CONTEXT}Create an east-west gateway in the
istio-eastwestnamespace. In each cluster, the east-west gateway is implemented as a ztunnel that facilitates traffic between services across clusters in your multicluster mesh. You can use either LoadBalancer or NodePort addresses for cross-cluster traffic.Verify that the east-west gateway is successfully deployed.
kubectl get pods -n istio-eastwest --context $CLUSTER_CONTEXTIf you have Istio installations in multiple clusters that the GatewayLifecycleManager and IstioLifecycleManager managed, be sure to repeat steps 3 - 11 in each cluster before you continue. The next step deletes the GatewayLifecycleManager and IstioLifecycleManager resources from the management cluster, which uninstalls the old Istio installations from every workload cluster in your multicluster setup. Be sure to reset the value of the
$CLUSTER_NAMEand$CLUSTER_CONTEXTenvironment variables to the next workload cluster.
Link clusters
Link clusters to enable cross-cluster service discovery and allow traffic to be routed through east-west gateways across clusters.
Optional: Before you link clusters, you can check the individual readiness of each cluster for linking by running the
istioctl multicluster checkcommand for each cluster.istioctl multicluster check --context $CLUSTER_CONTEXTBefore continuing to the next step, make sure that the following checks pass or fail as expected:✅ The license in use by istiod supports multicluster.✅ All istiod, ztunnel, and east-west gateway pods are healthy.✅ The east-west gateway is programmed.❌ Each remote peer gateway has a
gloo.solo.io/PeeringSucceededstatus ofTrue. Note that this fails if you run this command prior to linking the clusters.Link clusters to enable cross-cluster service discovery and allow traffic to be routed through east-west gateways across clusters. The steps vary based on whether you have access to the kubeconfig files for each cluster.
For each cluster, verify that peer linking was successful by running the
istioctl multicluster checkcommand.istioctl multicluster check --context $CLUSTER_CONTEXTIn this example output for cluster1, the license is valid, all Istio pods are healthy, and the east-west gateway is programmed. The remote peer gateways for linking to cluster2 and cluster3 both have a
gloo.solo.io/PeeringSucceededstatus ofTrue.✅ License Check: license is valid for multicluster ✅ Pod Check (istiod): all pods healthy ✅ Pod Check (ztunnel): all pods healthy ✅ Pod Check (eastwest gateway): all pods healthy ✅ Gateway Check: all eastwest gateways programmed ✅ Peers Check: all clusters connected
Delete previous resources
Now that your multicluster mesh is set up, delete the GatewayLifecycleManager and IstioLifecycleManager managed installations. The steps vary based on whether you created the resources directly, or used the
istioInstallationssection of thegloo-platformHelm chart.Send another request to your apps to verify that traffic is still flowing.
kubectl --context ${CLUSTER_CONTEXT} port-forward -n istio-ingress svc/istio-ingressgateway 8080:80 curl -v http://localhost:8080/productpage
The migration of your service mesh is now complete!
Next
- Launch the Gloo UI to review the Istio insights that were captured for your service mesh setup. Gloo Mesh (OSS APIs) 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. For more information, see Insights.
- When it’s time to upgrade your service mesh, you can perform a safe in-place upgrade by using the Gloo Operator.