argoproj / argo-rollouts

Progressive Delivery for Kubernetes
https://argo-rollouts.readthedocs.io/
Apache License 2.0
2.69k stars 843 forks source link

Support multiple destinationrules in istio subset level traffic management #2010

Open ju187 opened 2 years ago

ju187 commented 2 years ago

Summary

Currently subset traffic splitting support virtualservice with a single destinationrule. In the case of a virtual with multiple destination/subset, argo rollout could support one destination. Is there a workaround for this except break the virtualservice?

Use Cases

You can see it also uses subset in the VirtualService. Apparently, it's only possible to set one subset for a destination. The subset in the multi-deployment helm chart and the Argo Rollout Subset-Level Traffic Splitting are used for totally different purposes. Thus, Argo Rollout Subset-Level Traffic Splitting will run into issues with subset in VirtualService. The VS is like this:

apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: test-gateway-vs namespace: eu1-test spec: http:


Message from the maintainers:

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

github-actions[bot] commented 1 year ago

This issue is stale because it has been open 60 days with no activity.

github-actions[bot] commented 1 year ago

This issue is stale because it has been open 60 days with no activity.

Lykathia commented 1 year ago

I think we're seeing this as well, in a use case where we need to make an orchestrated breaking change, and want to deploy side-by-side copies.

We have one rollout pointing at one workload and the v1 routes/destination subsets, and a second pointing at v2.

Ends up breaking the destination rule.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
spec:
  gateways:
    - example-gateway
  hosts:
    - example.com
  http:
    - match:
        - uri:
            prefix: /
          headers:
            flagged:
              exact: blue
      name: blue
      route:
        - destination:
            host: example.default.svc.cluster.local
            subset: v2-stable
          weight: 100
        - destination:
            host: example.default.svc.cluster.local
            subset: v2-canary
          weight: 0
    - match:
        - uri:
            prefix: /
      name: green
      route:
        - destination:
            host: example.default.svc.cluster.local
            subset: v1-stable
          weight: 100
        - destination:
            host: example.default.svc.cluster.local
            subset: v1-canary
          weight: 0
metadata:
  name: example-vs
  strategy:
    canary:
      steps:
        - setWeight: 25
        - pause:
            duration: 5m
      trafficRouting:
        istio:
          virtualService:
            name: example-vs
            routes:
              - green
          destinationRule:
            canarySubsetName: v1-canary
            name: example-dr
            stableSubsetName: v1-stable
  workloadRef:
    apiVersion: apps/v1
    kind: Deployment
    name: example-deployment

(x2 of these)

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
spec:
  host: example.default.svc.cluster.local
  subsets:
    - labels:
        app.kubernetes.io/name: example-deployment-svc
        split: green
      name: v1-stable
    - labels:
        app.kubernetes.io/name: example-deployment-svc
        split: green
      name: v1-canary
    - labels:
        app.kubernetes.io/name: example-deployment-svc
        split: blue
      name: v2-stable
    - labels:
        app.kubernetes.io/name: example-deployment-svc
        split: blue
      name: v2-canary
github-actions[bot] commented 1 year ago

This issue is stale because it has been open 60 days with no activity.