Create two Kubernetes Services: one for stable traffic and one for canary traffic, both selecting pods managed by the Rollout via shared labels.
Create an Istio VirtualService with an HTTP route containing two weighted destinations—one pointing to the stable Service and one to the canary Service; the initial canary weight can be 0.
Create an Istio DestinationRule with two subsets (stable and canary) if using subset-based splitting; reference the subset names in the VirtualService route destinations.
Define a Rollout with spec.strategy.canary and a trafficRouting.istio block specifying the virtualService name, the route name within that VirtualService, and optionally the destinationRule with canarySubsetName and stableSubsetName.
Add canary steps using setWeight (percentage of traffic to send to canary) and pause (manual gate or duration) to progressively shift traffic; Argo Rollouts updates the VirtualService weights automatically at each step.
Monitor the rollout with kubectl argo rollouts get rollout <name> --watch and use kubectl argo rollouts promote to advance past manual pause steps.
Known gotchas
The VirtualService HTTP route name referenced in the Rollout spec must match exactly (case-sensitive) the name field in the VirtualService's http route list; a mismatch causes the controller to fail to find and update the route.
Argo Rollouts modifies the VirtualService in-place; if GitOps tooling reconciles the VirtualService back to its committed state during a rollout, the traffic weights will be reset and the rollout will stall or misbehave.
Subset-based splitting and host-based splitting are mutually exclusive approaches in the Rollout spec; mixing them (defining both virtualService hosts and destinationRule subsets incorrectly) produces undefined routing behavior.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp