Canary without Service Mesh — via Ingress controller or Nginx annotations.
1. Nginx Ingress Canary:
1# Stable Ingress2apiVersion: networking.k8s.io/v13kind: Ingress4metadata:5 name: myapp-stable6spec:7 rules:8 - host: myapp.com9 http:10 paths:11 - path: /12 pathType: Prefix13 backend:14 service:15 name: myapp-stable16 port:17 number: 8018---19# Canary Ingress20apiVersion: networking.k8s.io/v121kind: Ingress22metadata:23 name: myapp-canary24 annotations:25 nginx.ingress.kubernetes.io/canary: "true"26 nginx.ingress.kubernetes.io/canary-weight: "10"27spec:28 rules:29 - host: myapp.com30 http:31 paths:32 - path: /33 pathType: Prefix34 backend:35 service:36 name: myapp-canary37 port:38 number: 80
2. Header-based routing:
1annotations:2 nginx.ingress.kubernetes.io/canary: "true"3 nginx.ingress.kubernetes.io/canary-by-header: "X-Canary"4 nginx.ingress.kubernetes.io/canary-by-header-value: "always"
3. Cookie-based routing:
1annotations:2 nginx.ingress.kubernetes.io/canary: "true"3 nginx.ingress.kubernetes.io/canary-by-cookie: "canary_cookie"
4. Argo Rollouts (without Istio):
1strategy:2 canary:3 canaryService: myapp-canary4 stableService: myapp-stable5 trafficRouting:6 nginx:7 stableIngress: myapp-stable8 additionalIngressAnnotations:9 canary-by-header: X-Canary
Limitations: no circuit breaking, retry policies, mTLS (these are only available in Service Mesh).