Migrating a single-network mesh
The clusters of a single-network mesh share one flat pod network. A proxy reaches a workload of another cluster by its pod address, and the mesh has no east-west gateway. This document lists what differs from Migrating a multi-network mesh; everything else is identical to Migrating a single-cluster mesh, applied per cluster.
Confirm the topology first, see Determine the network topology.
The blocks below act on one cluster and address it as ${CTX}. Set it before the first of them, and again for the next cluster, see Address one cluster at a time:
Throughout the migration, keep every network setting of Mesh v2 identical to Mesh v1. Never add the topology.istio.io/network label to the istio-system namespace, and never set spec.values.global.network on Mesh v2 to a value that differs from Mesh v1. Otherwise the two control planes disagree about which network each endpoint belongs to: Mesh v2 rewrites remote endpoints to east-west gateway addresses that do not exist, and cross-cluster traffic fails.
While both generations serve the same mesh, they have to agree on which network an endpoint belongs to. The network comes from spec.values.global.network of each control plane and from the topology.istio.io/network label on the istio-system namespace and on the pods — and that namespace label is read by both generations. Migrating the control plane and changing the topology are two changes of their own; make one at a time.
Differences from the multi-network procedure
Phase 1 and Phase 4 are the same as for a multi-network mesh: Kiali covers every cluster, and the north-south gateways are migrated per cluster.
Phase 6 is the same as for a multi-network mesh: each cluster gets its own intermediate certificate, the mesh uses one tracing index family, and the collector service is declared cluster-local so that every proxy exports to the collector of its own cluster. The reason differs. In this topology the collector of the other cluster is reachable, so spans sent there would arrive and both collectors write into the same index family — traces stay complete either way. Keeping the exports inside the cluster only avoids sending them across the cluster boundary for nothing. Check it on any proxy:
One endpoint, the collector of the local cluster.
Verification
Check the remote endpoints of a service that has workloads in both clusters, from a proxy of each generation while they coexist, and again after the migration. The workload and the service are the ones named in The cross-cluster probe, and TARGET_SERVICE is the fully qualified name — the short name matches no Envoy cluster and prints an empty table:
Every endpoint is a pod address of one of the clusters. An address on port 15443 means that a control plane treats the other cluster as a separate network and is looking for an east-west gateway: check spec.values.global.network of both Istio resources and the labels of the istio-system namespaces.
- The cross-cluster path serves traffic in both directions, in every combination of generations: the probes report
OK, andrq_successgrows on the endpoints that belong to the other cluster. - The
istio-systemnamespace of every cluster carries notopology.istio.io/networklabel, before, during and after the migration. - The
network,meshIDand cluster name of eachIstioresource are field by field what Mesh v1 had.
After the migration
The mesh stays single network: Mesh v2 supports this topology the same way Mesh v1 did, and nothing in the migration changes it.
Read the migrated mesh in the traffic graph of Kiali, as described in After the migration. The clusters are drawn separately here as well, and the edges between them are the calls that use a pod address of the other cluster.