Skip to content

Istio traffic routing incompatible with virtual services containing a period #4709

@kloppmannj

Description

@kloppmannj

Checklist:

  • I've included steps to reproduce the bug.
  • I've included the version of argo rollouts.

Describe the bug

Documentation states that Istio Traffic Management supports leveraging a virtual service defined in a different namespace, however this fails if the virtual service name contains a .

| If the VirtualService is defined in a different namespace than the rollout, its name should be rollout-vsvc.

If not using a different namespace, a virtual service with a period in its name will be assumed to be using a different namespace.

While regular services cannot contain a ., I believe virtual services only need to conform to DNS-1123 subdomain validation which does allow periods.

To Reproduce

These steps were use to reproduce the issue in v1.9.0. It also reproduces in older versions. I do not believe this is a regression, but a long standing limitation.

Kubectl apply the following example manifest:

apiVersion: v1
kind: Namespace
metadata:
  name: example
---
apiVersion: v1
kind: Namespace
metadata:
  name: istio
---
apiVersion: v1
kind: Service
metadata:
  name: example-canary
  namespace: example
spec:
  type: ClusterIP
  selector:
    app: webservice
  ports:
    - name: http
      port: 80
      targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: example-stable
  namespace: example
spec:
  type: ClusterIP
  selector:
    app: webservice
  ports:
    - name: http
      port: 80
      targetPort: 80
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: virtualservice.example
  namespace: istio
spec:
  hosts:
    - webservice.example.svc.cluster.local
  gateways:
    - mesh
  http:
    - name: primary
      route:
        - destination:
            host: example-stable.example.svc.cluster.local
            port:
              number: 80
          weight: 100
        - destination:
            host: example-canary.example.svc.cluster.local
            port:
              number: 80
          weight: 0
---
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: webservice
  namespace: example
spec:
  replicas: 1
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: webservice
  template:
    metadata:
      labels:
        app: webservice
    spec:
      containers:
        - name: webservice
          image: nginx:1.27
          ports:
            - containerPort: 80
  strategy:
    canary:
      canaryService: example-canary
      stableService: example-stable
      trafficRouting:
        istio:
          virtualService:
            name: virtualservice.example.istio
            routes:
              - primary
      steps:
        - setWeight: 1
        - pause:
            duration: 10m

The above setup will do the following:

  • create namespace example
  • create namespace istio
  • create cluster ip service example-canary within example
  • create cluster ip service example-stable within example
  • create virtual service virtualservice.example within istio
  • create rollout webservice within example

The rollout object attempts to leverage canary and istio traffic routing using the virtual service from the istio namespace:

      trafficRouting:
        istio:
          virtualService:
            name: virtualservice.example.istio

However due to the current logic, the controller parses this as:

virtual service name      = virtualservice
virtual service namespace = example

Current logic coming from here.

Which results in the following error:

Name:            webservice
Namespace:       example
Status:          ✖ Degraded
Message:         InvalidSpec: The Rollout "webservice" is invalid: spec.strategy.canary.trafficRouting.istio.virtualService.name: Invalid value: "virtualservice": virtualservices.networking.istio.io "virtualservice" not found

Expected behavior

Rollouts controller is able to successfully manage virtual services in separate namespaces, as long as they are named appropriately according to Istio and Kubernetes.

Screenshots

N/A

Version

v1.9.0

Logs

time="2026-04-27T23:05:51Z" level=info msg="Event(v1.ObjectReference{Kind:\"Rollout\", Namespace:\"example\", Name:\"webservice\", UID:\"30552d94-4aba-4d0c-98c4-cd5c98e88b81\", APIVersion:\"argoproj.io/v1alpha1\", ResourceVersion:\"1368\", FieldPath:\"\"}): type: 'Normal' reason: 'RolloutAddedToInformer' Rollout resource added to informer: example/webservice"
time="2026-04-27T23:05:51Z" level=info msg="Rollout resource added to informer: example/webservice" event_reason=RolloutAddedToInformer namespace=example rollout=webservice
time="2026-04-27T23:05:51Z" level=info msg="Istio detected"
time="2026-04-27T23:05:51Z" level=info msg="Starting istio workers"
time="2026-04-27T23:05:51Z" level=info msg="Istio workers (10) started"
time="2026-04-27T23:05:51Z" level=info msg="Started syncing rollout" generation=1 namespace=example resourceVersion=1368 rollout=webservice
time="2026-04-27T23:05:51Z" level=error msg="The Rollout \"webservice\" is invalid: spec.strategy.canary.trafficRouting.istio.virtualService.name: Invalid value: \"virtualservice\": virtualservices.networking.istio.io \"virtualservice\" not found" namespace=example rollout=webservice
time="2026-04-27T23:05:51Z" level=error msg="newRolloutContext returned nil" generation=1 namespace=example resourceVersion=1368 rollout=webservice
time="2026-04-27T23:05:51Z" level=info msg="Reconciliation completed" generation=1 namespace=example resourceVersion=1368 rollout=webservice time_ms=115.25680000000001
time="2026-04-27T23:05:51Z" level=error msg="rollout syncHandler error: spec.strategy.canary.trafficRouting.istio.virtualService.name: Invalid value: \"virtualservice\": virtualservices.networking.istio.io \"virtualservice\" not found" namespace=example rollout=webservice
time="2026-04-27T23:05:51Z" level=info msg="rollout syncHandler queue retries: 2 : key \"example/webservice\"" namespace=example rollout=webservice
time="2026-04-27T23:05:51Z" level=error msg="Unhandled Error" error="spec.strategy.canary.trafficRouting.istio.virtualService.name: Invalid value: \"virtualservice\": virtualservices.networking.istio.io \"virtualservice\" not found" logger=UnhandledError

Message from the maintainers:

Impacted by this bug? Give it a 👍. We prioritize the issues with the most 👍.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions