For the complete documentation index, see llms.txt. Markdown versions of all docs pages are available by appending .md to any docs URL.
Migrate from Istio waypoints to agentgateway waypoints
Run Istio and agentgateway waypoints alongside each other in the same mesh, and migrate services from one to the other using a label flip or a weighted canary.
Warning
The agentgateway waypoint feature is in the alpha state. Alpha features are likely to change, are not fully tested, and are not supported for production. For more information, see Solo feature maturity.
Note
This feature requires the following licenses. Contact your account representative to obtain valid licenses.
- Your ambient mesh must be installed with the Solo distribution of Istio and an Enterprise-level license for Solo Enterprise for Istio.
- A Solo Enterprise for agentgateway license.
You can run an Istio waypoint (istio-waypoint GatewayClass) and an agentgateway waypoint (enterprise-agentgateway-waypoint GatewayClass) in the same namespace or mesh without interference. Each service routes exclusively through its own configured waypoint, and policies that are attached to one waypoint do not apply to traffic through the other. Coexistence means that you can migrate services from Istio waypoints to agentgateway waypoints one at a time, without any coupling between them.
Two migration approaches are available:
- Label flip: Change the service’s
istio.io/use-waypointlabel to point to the agentgateway waypoint in a single step. Use this approach when an immediate switch is acceptable. - Weighted canary: Gradually shift a configurable percentage of the service’s in-mesh connections to the agentgateway waypoint while keeping the rest of the connections on the Istio waypoint. Use this approach when you need to validate the agentgateway waypoint before fully committing.
Before you begin
Ensure that you have an Istio waypoint with at least one enrolled service. For more information, see Configure waypoints.
Deploy the agentgateway waypoint
Both migration approaches require an agentgateway waypoint to be running alongside the existing Istio waypoint.
Save the namespace, service name, and gateway name of the existing Istio waypoint.
export NAMESPACE=<namespace> export SERVICE=<service-name> export ISTIO_WAYPOINT=<existing-istio-waypoint-name>Deploy the agentgateway waypoint in the same namespace.
kubectl apply -f - <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: agentgateway-waypoint namespace: ${NAMESPACE} labels: istio.io/waypoint-for: all spec: gatewayClassName: enterprise-agentgateway-waypoint listeners: - name: mesh port: 15008 protocol: HBONE EOFConfirm that the waypoint’s
PROGRAMMEDstatus isTrue.kubectl wait gateway agentgateway-waypoint -n ${NAMESPACE} \ --for=condition=Programmed --timeout=60sApply L7 policies on the agentgateway waypoint that are equivalent to the policies that are applied to the Istio waypoint. Use
EnterpriseAgentgatewayPolicyresources that target the service. For details, see Apply policies with agentgateway.
Migrate with a label flip
A label flip switches the service to the agentgateway waypoint in one operation. After the control plane propagates the change, all new in-mesh connections open through the agentgateway waypoint.
Reassign the service to the agentgateway waypoint by relabeling it.
kubectl label svc ${SERVICE} -n ${NAMESPACE} \ istio.io/use-waypoint=agentgateway-waypoint --overwriteVerify that the service’s
WaypointBoundstatus isTrueand that it names the agentgateway waypoint.kubectl get svc ${SERVICE} -n ${NAMESPACE} -o yamlExample output:
status: conditions: - message: Successfully attached to waypoint ${NAMESPACE}/agentgateway-waypoint reason: WaypointAccepted status: "True" type: istio.io/WaypointBoundConfirm that in-mesh connections flow through the agentgateway waypoint. For inbound connections to your service pod, the agentgateway waypoint pod appears in the
REMOTEcolumn withHBONEin thePROTOCOLcolumn.istioctl ztunnel-config connections --workload-namespace ${NAMESPACE}Example output:
WORKLOAD DIRECTION LOCAL REMOTE PROTOCOL CONN ID <service-pod>.<namespace> Inbound <service-pod>.<namespace>:<port> agentgateway-waypoint-<hash>.<namespace>:<port> HBONE <id>After you confirm that the service is healthy, delete the old Istio waypoint.
kubectl delete gateway ${ISTIO_WAYPOINT} -n ${NAMESPACE}
Migrate with a weighted canary
A weighted canary gradually shifts a configurable percentage of the service’s in-mesh connections to the agentgateway waypoint. Use this approach to validate the agentgateway waypoint’s behavior and policy coverage before promoting it. For a conceptual overview of canary waypoints, see Canary waypoints.
The canary is configured by adding two labels and one annotation to the service. The following fields control the canary:
| Field | Kind | Description |
|---|---|---|
istio.io/use-waypoint | Label | Names the primary waypoint. The existing label is unchanged. |
istio.io/use-waypoint-canary | Label | Names the canary waypoint Gateway in the service namespace. |
istio.io/use-waypoint-canary-namespace | Label | Namespace of the canary waypoint, if different from the service namespace. Optional. |
istio.io/use-waypoint-canary-weight | Annotation | Integer from 0 to 100. Percentage of in-mesh connections routed to the canary. |
The split is sampled per connection at the source ztunnel. Each connection routes entirely through one waypoint. The realized percentage converges across the ztunnel fleet over time.
Tip
A weight of 0 sends no traffic to the canary waypoint. Start at weight 0 to confirm the canary waypoint is reachable before ramping traffic. A weight of 100 is a transient step before promotion. After the canary validates at full weight, complete the promotion by flipping istio.io/use-waypoint and removing the canary attributes.
Start the canary in pre-flight mode
Add the canary label and set the weight to 0. The control plane resolves the canary waypoint, but sends no traffic to it yet.
kubectl label svc ${SERVICE} -n ${NAMESPACE} \ istio.io/use-waypoint-canary=agentgateway-waypoint kubectl annotate svc ${SERVICE} -n ${NAMESPACE} \ istio.io/use-waypoint-canary-weight=0Confirm that the agentgateway waypoint has a populated address.
kubectl get gateway agentgateway-waypoint -n ${NAMESPACE}Example output:
NAME CLASS ADDRESS PROGRAMMED AGE agentgateway-waypoint enterprise-agentgateway-waypoint 10.96.74.145 True 60sNote
If the
ADDRESSfield is empty orPROGRAMMEDis notTrue, ztunnel cannot resolve the canary waypoint. Check the agentgateway controller logs in theagentgateway-systemnamespace.
Ramp traffic to the canary
Update the weight annotation to increase the portion of connections routed to the agentgateway waypoint. Start with a small value such as 5.
kubectl annotate svc ${SERVICE} -n ${NAMESPACE} \ istio.io/use-waypoint-canary-weight=5 --overwriteVerify that connections flow through both waypoints as configured.
istioctl ztunnel-config connections --workload-namespace ${NAMESPACE}Watch the agentgateway waypoint access logs to confirm that the waypoint processes requests correctly and applies policies.
kubectl logs -n ${NAMESPACE} \ -l gateway.networking.k8s.io/gateway-name=agentgateway-waypoint -fRepeat the annotation update at each ramp step (for example, 5 → 25 → 50 → 100), running steps 2–3 after each update before proceeding to the next.
Promote and clean up
After the canary validates at weight 100, promote the agentgateway waypoint to primary and remove the canary configuration.
Reassign
istio.io/use-waypointto the agentgateway waypoint and remove the canary label and annotation.kubectl label svc ${SERVICE} -n ${NAMESPACE} \ istio.io/use-waypoint=agentgateway-waypoint \ istio.io/use-waypoint-canary- --overwrite kubectl annotate svc ${SERVICE} -n ${NAMESPACE} \ istio.io/use-waypoint-canary-weight-Verify that the
WaypointBoundcondition reports only the agentgateway waypoint.kubectl get svc ${SERVICE} -n ${NAMESPACE} -o yamlExample output:
status: conditions: - message: Successfully attached to waypoint ${NAMESPACE}/agentgateway-waypoint reason: WaypointAccepted status: "True" type: istio.io/WaypointBoundDelete the old Istio waypoint.
kubectl delete gateway ${ISTIO_WAYPOINT} -n ${NAMESPACE}
Roll back a canary
To stop the canary and return all traffic to the Istio waypoint, remove the canary label and annotation from the service.
kubectl label svc ${SERVICE} -n ${NAMESPACE} istio.io/use-waypoint-canary-
kubectl annotate svc ${SERVICE} -n ${NAMESPACE} istio.io/use-waypoint-canary-weight-The control plane removes the weighted set and restores the single-waypoint path through the primary Istio waypoint.