Canary Deployments
NGINX’s canary annotations let you split traffic between versions. The tool merges these into a single HTTPRoute with weighted backends.
Before: Primary and canary Ingresses
cat <<'EOF' > canary-ingress.yaml
# Primary Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-primary
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- backend:
service:
name: app-v1
port:
number: 80
path: /
pathType: Prefix
---
# Canary Ingress (20% of traffic)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-canary
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20"
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- backend:
service:
name: app-v2
port:
number: 80
path: /
pathType: Prefix
EOFConvert
ingress2gateway print --providers=ingress-nginx --emitter=kgateway \
--input-file canary-ingress.yaml > canary-kgateway.yamlAfter: HTTPRoute with weighted backends
cat canary-kgateway.yamlBoth Ingresses merge into one HTTPRoute. Traffic is split 80/20:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: app-primary-app-example-com
spec:
hostnames:
- app.example.com
parentRefs:
- name: nginx
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: app-v1
port: 80
weight: 80
- name: app-v2
port: 80
weight: 20Apply
kubectl apply -f canary-kgateway.yaml