veylant/deploy/k8s/istio/virtual-service.yaml
2026-02-23 13:35:04 +01:00

72 lines
2.1 KiB
YAML

# Istio VirtualService + DestinationRule for blue/green traffic switching.
#
# Traffic flow:
# Client → Istio Ingress Gateway → VirtualService → DestinationRule subset → Pod
#
# Two releases coexist at all times:
# veylant-proxy-blue (helm release, slot=blue label)
# veylant-proxy-green (helm release, slot=green label)
#
# Switch traffic atomically (rollback < 5s):
# # Switch to green:
# kubectl patch vs veylant-proxy -n veylant --type merge \
# -p '{"spec":{"http":[{"route":[{"destination":{"host":"veylant-proxy","subset":"green"},"weight":100}]}]}}'
# # Roll back to blue:
# kubectl patch vs veylant-proxy -n veylant --type merge \
# -p '{"spec":{"http":[{"route":[{"destination":{"host":"veylant-proxy","subset":"blue"},"weight":100}]}]}}'
#
# Managed automatically by deploy/scripts/blue-green.sh.
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: veylant-proxy
namespace: veylant
spec:
hosts:
- veylant-proxy
- api.veylant.ai # external hostname (TLS terminated at Gateway)
gateways:
- veylant-gateway
- mesh # also applies to in-cluster traffic
http:
- match:
- uri:
prefix: /
route:
# Default: 100% to blue slot.
# blue-green.sh patches this to switch slots atomically.
- destination:
host: veylant-proxy
subset: blue
weight: 100
timeout: 35s # slightly > proxy WriteTimeout (30s)
retries:
attempts: 2
perTryTimeout: 15s
retryOn: gateway-error,connect-failure,retriable-4xx
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: veylant-proxy
namespace: veylant
spec:
host: veylant-proxy
trafficPolicy:
connectionPool:
http:
h2UpgradePolicy: UPGRADE
idleTimeout: 90s
outlierDetection:
consecutiveGatewayErrors: 5
interval: 10s
baseEjectionTime: 30s
subsets:
- name: blue
labels:
app.kubernetes.io/slot: blue
- name: green
labels:
app.kubernetes.io/slot: green