Install Gloo-managed ambient meshes (alpha)
Use the Gloo operator to install and manage ambient service meshes in your clusters.
By using the Gloo operator to manage your service meshes, you no longer need to manually install and manage the istiod
control plane. Instead, you provide minimal Istio configuration to the operator in a ServiceMeshController custom resource, and the operator translates this configuration into a managed istiod
control plane in your cluster for you. The operator reduces both the amount of configuration required to deploy Istio, and the overhead required to manage the lifecycle of Istio resources in your cluster.
For more information about the components that are installed in these steps, see the ambient components overview.
Considerations
Before you install Istio in ambient mode, review the following considerations and requirements.
Feature maturity
In Gloo Mesh Core version 2.7, the Gloo operator is an alpha feature. Alpha features are likely to change, are not fully tested, and are not supported for production. For more information, see Gloo feature maturity.
Version and license requirements
Single cluster setups:
- In Gloo Mesh Core version 2.6 and later, ambient mode requires the Solo distribution of Istio version 1.22.3 or later (
1.22.3-solo
). - In Istio 1.22.0-1.22.3, the
ISTIO_DELTA_XDS
environment variable must be set tofalse
. For more information, see this upstream Istio issue. Note that this issue is resolved in Istio 1.22.4.
Multicluster ambient setups:
- In Gloo Mesh version 2.7 and later, multicluster ambient setups require the Solo distribution of Istio version 1.24.3 or later (
1.24.3-solo
), including the Solo distribution ofistioctl
. - A Gloo Mesh Enterprise license. If you do not have one, contact an account representative.
Revision and canary upgrade limitations
Due to an upstream ambient limitation, the ztunnel and Istio CNI pods do not support revisioned canary upgrades, and can only be upgraded in-place. For this reason, creating named revisions for the istiod, cni, ztunnel, and gateways in an ambient mesh is not currently recommended, and the upgrade guides in this documentation set show you how to perform in-place upgrades only.
Single cluster
Install an ambient service mesh with the Gloo operator in a single-cluster Gloo Mesh Core environment.
Prepare the cluster environment
Save the patch version of the Solo distribution of Istio that you want to install. For supported Istio versions in Gloo Mesh Core, see the Ambient section of the Istio images built by Solo.io support article.
# Solo distrubution of Istio patch version # in the format 1.x.x, with no tags export ISTIO_VERSION=1.24.2
Install
istioctl
, the Istio command line tool. Use the same version that you want to use to install your ambient mesh.curl -L https://istio.io/downloadIstio | ISTIO_VERSION=${ISTIO_VERSION} sh - cd istio-${ISTIO_VERSION} export PATH=$PWD/bin:$PATH
Install the ambient components
Install the Gloo operator to the
gloo-mesh
namespace. This operator deploys and manages your Istio installation.helm install gloo-operator oci://us-docker.pkg.dev/solo-public/gloo-operator-helm/gloo-operator \ --version 0.1.0-rc.1 \ -n gloo-mesh \ --create-namespace
Verify that the operator pod is running.
kubectl get pods -n gloo-mesh | grep operator
Example output:
gloo-operator-78d58d5c7b-lzbr5 1/1 Running 0 48s
Create a ServiceMeshController custom resource to configure an Istio installation. For a description of each configurable field, see the ServiceMeshController reference.
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: dataplaneMode: Ambient installNamespace: istio-system version: ${ISTIO_VERSION} EOF
Verify that the ServiceMeshController is ready. In the
Status
section of the output, make sure that all statuses areTrue
, and that the phase isSUCCEEDED
.kubectl describe servicemeshcontroller -n gloo-mesh managed-istio
Example 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>
Verify that the istiod control plane, Istio CNI, and ztunnel pods are running.
kubectl get pods -n istio-system
Example output:
NAME READY STATUS RESTARTS AGE istio-cni-node-6s5nk 1/1 Running 0 2m53s istio-cni-node-blpz4 1/1 Running 0 2m53s istiod-gloo-bb86b959f-msrg7 1/1 Running 0 2m45s istiod-gloo-bb86b959f-w29cm 1/1 Running 0 3m ztunnel-mx8nw 1/1 Running 0 2m52s ztunnel-w8r6c 1/1 Running 0 2m52s
Apply 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
Gateway
resource, and more.kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.1/standard-install.yaml
Multicluster
Install ambient service meshes with the Gloo operator in a multicluster Gloo Mesh Core environment.
Multicluster ambient capabilities require a Gloo Mesh Enterprise license. If you do not have one, contact an account representative.
Prepare the cluster environments
Set environment variables for the Solo distribution of Istio that you want to install. You can find these values in the Ambient section of the Istio images built by Solo.io support article.
# Solo distrubution of Istio patch version # in the format 1.x.x, with no tags export ISTIO_VERSION=1.24.2 # Repo key for the minor version of the Solo distribution of Istio # This is the 12-character hash at the end of the repo URL: 'us-docker.pkg.dev/gloo-mesh/istio-<repo-key>' export REPO_KEY=<repo_key> # Solo distrubution of Istio patch version and Solo tag # Optionally append other Solo tags as needed export ISTIO_IMAGE=${ISTIO_VERSION}-solo # Solo distrubution of Istio patch version and tag, # image repo, Helm repo, and binary repo export REPO=us-docker.pkg.dev/gloo-mesh/istio-${REPO_KEY} export HELM_REPO=us-docker.pkg.dev/gloo-mesh/istio-helm-${REPO_KEY} export BINARY_REPO=https://console.cloud.google.com/storage/browser/istio-binaries-${REPO_KEY}/${ISTIO_IMAGE}
Download the Solo distribution of Istio binary and install
istioctl
, which you use for multicluster linking and gateway commands.- Navigate to the storage repository for the Solo distribution of Istio binaries.
open ${BINARY_REPO}
- Download the
tar.gz
file for your system, such asistio-1.24.2-solo-osx-amd64.tar.gz
. - Extract the downloaded
tar.gz
file. - Navigate to the package directory and add the
istioctl
client to your system’sPATH
.cd istio-${ISTIO_IMAGE} export PATH=$PWD/bin:$PATH
- Verify that the
istioctl
client runs the Solo distribution of Istio that you want to install.Example output:istioctl version --remote=false
client version: 1.24.2-solo
- Navigate to the storage repository for the Solo distribution of Istio binaries.
Create a shared root of trust
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.
Install the ambient components
In each cluster, use the Gloo operator to install the ambient mesh components, and create an east-west gateway so that traffic requests can be routed cross-cluster.
Save the name and kubeconfig context of a cluster where you want to install Istio 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=<cluster-name> export CLUSTER_CONTEXT=<cluster-context>
Install the Gloo operator to the
gloo-mesh
namespace. This operator deploys and manages your Istio installation.helm install gloo-operator oci://us-docker.pkg.dev/solo-public/gloo-operator-helm/gloo-operator \ --version 0.1.0-rc.1 \ -n gloo-mesh \ --create-namespace \ --kube-context ${CLUSTER_CONTEXT}
Verify that the operator pod is running.
kubectl get pods -n gloo-mesh --context ${CLUSTER_CONTEXT} | grep operator
Example output:
gloo-operator-78d58d5c7b-lzbr5 1/1 Running 0 48s
Create a ServiceMeshController custom resource to configure an Istio installation. For a description of each configurable field, see the ServiceMeshController reference.
kubectl apply -n gloo-mesh --context ${CLUSTER_CONTEXT} -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 installNamespace: istio-system version: ${ISTIO_VERSION} EOF
Verify that the ServiceMeshController is ready. In the
Status
section of the output, make sure that all statuses areTrue
, and that the phase isSUCCEEDED
.kubectl describe servicemeshcontroller -n gloo-mesh managed-istio --context ${CLUSTER_CONTEXT}
Example 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>
Verify that the istiod control plane, Istio CNI, and ztunnel pods are running.
kubectl get pods -n istio-system --context ${CLUSTER_CONTEXT}
Example output:
NAME READY STATUS RESTARTS AGE istio-cni-node-6s5nk 1/1 Running 0 2m53s istio-cni-node-blpz4 1/1 Running 0 2m53s istiod-gloo-bb86b959f-msrg7 1/1 Running 0 2m45s istiod-gloo-bb86b959f-w29cm 1/1 Running 0 3m ztunnel-mx8nw 1/1 Running 0 2m52s ztunnel-w8r6c 1/1 Running 0 2m52s
Apply 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
Gateway
resource, and more.kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.1/standard-install.yaml --context ${CLUSTER_CONTEXT}
Create an east-west gateway in the
istio-eastwest
namespace. An east-west gateway facilitates traffic between services in each cluster in your multicluster ambient mesh.- You can use the following
istioctl
command to quickly create the east-west gateway.kubectl create namespace istio-eastwest --context ${CLUSTER_CONTEXT} istioctl multicluster expose --namespace istio-eastwest --context ${CLUSTER_CONTEXT}
- To take a look at the Gateway resource that this command creates, you can include the
--generate
flag in the command.In this example output, thekubectl create namespace istio-eastwest --context ${CLUSTER_CONTEXT} istioctl multicluster expose --namespace istio-eastwest --context ${CLUSTER_CONTEXT} --generate
gatewayClassName
that is used,istio-eastwest
, is included by default in the ambient control plane installation.apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: labels: istio.io/expose-istiod: "15012" topology.istio.io/network: "<cluster_network_name>" name: istio-eastwest namespace: istio-eastwest spec: gatewayClassName: istio-eastwest listeners: - name: cross-network port: 15008 protocol: HBONE tls: mode: Passthrough - name: xds-tls port: 15012 protocol: TLS tls: mode: Passthrough
- You can use the following
For each cluster that you want to include in the multicluster ambient mesh setup, repeat steps 1 - 8 of this section to install the Gloo operator, ambient mesh components, and east-west gateway in each cluster. Remember to change the cluster name and context variables each time you repeat the steps.
export CLUSTER_NAME=<cluster-name> export CLUSTER_CONTEXT=<cluster-context>
Link clusters
Linking clusters enables cross-cluster service discovery and allows traffic to be routed through east-west gateways across clusters.
Verify that the contexts for the clusters that you want to include in the multicluster ambient mesh are listed in your kubeconfig file.
kubectl config get-contexts
- In the output, note the names of the cluster contexts, which you use in the next step to link the clusters.
- If you have multiple kubeconfig files, you can generate a merged kubeconfig file by running the following command.
KUBECONFIG=<kubeconfig_file1>.yaml:<file2>.yaml:<file3>.yaml kubectl config view --flatten
Using the names of the cluster contexts, link the clusters so that they can communicate. Note that you can either link the clusters bi-directionally or asymmetrically. In a standard bi-directional setup, services in any of the linked clusters can send requests to and receive requests from the services in any of the other linked clusters. In an asymmetrical setup, you allow one cluster to send requests to another cluster, but the other cluster cannot send requests back to the first cluster.
Note that these istio-remote
gateways are used for cluster peering only, and do not create deployments or services. Traffic requests between linked clusters are routed through the istio-eastwest
gateways.
For example, you can list the gateways in a cluster to see both the remote and east-west gateways.
kubectl get gateways -n istio-eastwest --context $CLUSTER_CONTEXT
NAME CLASS ADDRESS PROGRAMMED AGE
istio-eastwest istio-eastwest <address> True 29m
istio-remote-peer-cluster1 istio-remote <address> True 16m
However, if you list the services in the same namespace, only a service for the east-west gateway exists.
kubectl get svc -n istio-eastwest --context $CLUSTER_CONTEXT
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-eastwest LoadBalancer 172.20.44.255 <address> 15021:31730/TCP,15008:30632/TCP,15012:32356/TCP 29m
Next
Add apps to the ambient mesh. For multicluster setups, this includes making specific services available across your linked cluster setup.
ServiceMeshController reference
Review the following configurable fields for the ServiceMeshController custom resource.
Setting | Description | Supported values | Default |
---|---|---|---|
cluster | The name of the cluster to install Istio into. This value is required to set the trust domain field in multicluster environments. | ||
dataplaneMode | The dataplane mode to use. | Ambient or Sidecar | Ambient |
distribution | Optional: A specific distribution of the Istio version, such as the standard or FIPS image distribution. | Standard or FIPS | Standard |
image.repository | Optional: An Istio image repository, such as to use an image from a private registry. | The Solo distribution of Istio repo for the Istio minor version. | |
image.secrets | Optional: A list of secrets to use for pulling images from a container registry. The secret list must be of type kubernetes.io/dockerconfigjson and exist in the installNamespace that you install Istio in. | ||
installNamespace | Namespace to install the service mesh components into. | istio-system | |
network | The default network where workload endpoints exist. A network is a logical grouping of workloads that exist in the same Layer 3 domain. Workloads in the same network can directly communicate with each other, while workloads in different networks require an east-west gateway to establish connectivity. This value is required in multi-network environments. For example, an easy way to identify the network of in-mesh workloads in one cluster is to simply use the cluster’s name for the network, such as cluster1 . | ||
onConflict | Optional: How to resolve conflicting Istio configuration, if the configuration in this ServiceMeshController conflicts with existing Istio resources in the cluster.
| Force or Abort | Abort |
repository.secrets | Optional: A list of secrets to use for pulling manifests from an artifact registry. The secret list must be of type kubernetes.io/dockerconfigjson and can exist in any namespace, such as the same namespace that you create the ServiceMeshController in. | ||
repository.insecureSkipVerify | Optional: If set to true, the repository server’s certificate chain and hostname are not verified. | true or false | |
scalingProfile | Optional: The istiod control plane scaling settings to use. In large environments, set to Large .
| Default or Large | Default |
trafficCaptureMode | Optional: Traffic capture mode to use.
| Auto or InitContainer | Auto |
trustDomain | The trustDomain for Istio workloads. | If cluster is set, defaults to that value. If cluster is unset, defaults to cluster.local . | |
version | The Istio patch version to install. For more information, see Supported Solo distributions of Istio. | Any Istio version supported for your Gloo version |