docs: canary weighted deployments example (#10067)
Signed-off-by: Spazzy <brendankamp757@gmail.com>
This commit is contained in:
parent
5bfc56618e
commit
adbad99a71
2 changed files with 232 additions and 0 deletions
231
docs/examples/canary/README.md
Normal file
231
docs/examples/canary/README.md
Normal file
|
@ -0,0 +1,231 @@
|
|||
# Canary
|
||||
|
||||
Ingress Nginx Has the ability to handle canary routing by setting specific
|
||||
annotations, the following is an example of how to configure a canary
|
||||
deployment with weighted canary routing.
|
||||
|
||||
## Create your main deployment and service
|
||||
|
||||
This is the main deployment of your application with the service that will be
|
||||
used to route to it
|
||||
|
||||
```bash
|
||||
echo "
|
||||
---
|
||||
# Deployment
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: production
|
||||
labels:
|
||||
app: production
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: production
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: production
|
||||
spec:
|
||||
containers:
|
||||
- name: production
|
||||
image: registry.k8s.io/ingress-nginx/e2e-test-echo@sha256:6fc5aa2994c86575975bb20a5203651207029a0d28e3f491d8a127d08baadab4
|
||||
ports:
|
||||
- containerPort: 80
|
||||
env:
|
||||
- name: NODE_NAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: spec.nodeName
|
||||
- name: POD_NAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: POD_NAMESPACE
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.namespace
|
||||
- name: POD_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
---
|
||||
# Service
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: production
|
||||
labels:
|
||||
app: production
|
||||
spec:
|
||||
ports:
|
||||
- port: 80
|
||||
targetPort: 80
|
||||
protocol: TCP
|
||||
name: http
|
||||
selector:
|
||||
app: production
|
||||
" | kubectl apply -f -
|
||||
```
|
||||
|
||||
## Create the canary deployment and service
|
||||
|
||||
This is the canary deployment that will take a weighted amount of requests
|
||||
instead of the main deployment
|
||||
|
||||
```bash
|
||||
echo "
|
||||
---
|
||||
# Deployment
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: canary
|
||||
labels:
|
||||
app: canary
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: canary
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: canary
|
||||
spec:
|
||||
containers:
|
||||
- name: canary
|
||||
image: registry.k8s.io/ingress-nginx/e2e-test-echo@sha256:6fc5aa2994c86575975bb20a5203651207029a0d28e3f491d8a127d08baadab4
|
||||
ports:
|
||||
- containerPort: 80
|
||||
env:
|
||||
- name: NODE_NAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: spec.nodeName
|
||||
- name: POD_NAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: POD_NAMESPACE
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.namespace
|
||||
- name: POD_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
---
|
||||
# Service
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: canary
|
||||
labels:
|
||||
app: canary
|
||||
spec:
|
||||
ports:
|
||||
- port: 80
|
||||
targetPort: 80
|
||||
protocol: TCP
|
||||
name: http
|
||||
selector:
|
||||
app: canary
|
||||
" | kubectl apply -f -
|
||||
```
|
||||
|
||||
## Create Ingress Pointing To Your Main Deployment
|
||||
|
||||
Next you will need to expose your main deployment with an ingress resource,
|
||||
note there are no canary specific annotations on this ingress
|
||||
|
||||
```bash
|
||||
echo "
|
||||
---
|
||||
# Ingress
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: production
|
||||
annotations:
|
||||
spec:
|
||||
ingressClassName: nginx
|
||||
rules:
|
||||
- host: echo.prod.mydomain.com
|
||||
http:
|
||||
paths:
|
||||
- pathType: Prefix
|
||||
path: /
|
||||
backend:
|
||||
service:
|
||||
name: production
|
||||
port:
|
||||
number: 80
|
||||
" | kubectl apply -f -
|
||||
```
|
||||
|
||||
## Create Ingress Pointing To Your Canary Deployment
|
||||
|
||||
You will then create an Ingress that has the canary specific configuration,
|
||||
please pay special notice of the following:
|
||||
|
||||
- The host name is identical to the main ingress host name
|
||||
- The `nginx.ingress.kubernetes.io/canary: "true"` annotation is required and
|
||||
defines this as a canary annotation (if you do not have this the Ingresses
|
||||
will clash)
|
||||
- The `nginx.ingress.kubernetes.io/canary-weight: "50"` annotation dictates the
|
||||
weight of the routing, in this case there is a "50%" chance a request will
|
||||
hit the canary deployment over the main deployment
|
||||
```bash
|
||||
echo "
|
||||
---
|
||||
# Ingress
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: canary
|
||||
annotations:
|
||||
nginx.ingress.kubernetes.io/canary: \"true\"
|
||||
nginx.ingress.kubernetes.io/canary-weight: \"50\"
|
||||
spec:
|
||||
ingressClassName: nginx
|
||||
rules:
|
||||
- host: echo.prod.mydomain.com
|
||||
http:
|
||||
paths:
|
||||
- pathType: Prefix
|
||||
path: /
|
||||
backend:
|
||||
service:
|
||||
name: canary
|
||||
port:
|
||||
number: 80
|
||||
" | kubectl apply -f -
|
||||
```
|
||||
|
||||
## Testing your setup
|
||||
|
||||
You can use the following command to test your setup (replacing
|
||||
INGRESS_CONTROLLER_IP with your ingresse controllers IP Address)
|
||||
|
||||
```bash
|
||||
for i in $(seq 1 10); do curl -s --resolve echo.prod.mydomain.com:80:$INGRESS_CONTROLLER_IP echo.prod.mydomain.com | grep "Hostname"; done
|
||||
```
|
||||
|
||||
You will get the following output showing that your canary setup is working as
|
||||
expected:
|
||||
|
||||
```bash
|
||||
Hostname: production-5c5f65d859-phqzc
|
||||
Hostname: canary-6697778457-zkfjf
|
||||
Hostname: canary-6697778457-zkfjf
|
||||
Hostname: production-5c5f65d859-phqzc
|
||||
Hostname: canary-6697778457-zkfjf
|
||||
Hostname: production-5c5f65d859-phqzc
|
||||
Hostname: production-5c5f65d859-phqzc
|
||||
Hostname: production-5c5f65d859-phqzc
|
||||
Hostname: canary-6697778457-zkfjf
|
||||
Hostname: production-5c5f65d859-phqzc
|
||||
```
|
|
@ -23,6 +23,7 @@ Customization | [External authentication with response header propagation](custo
|
|||
Customization | [Sysctl tuning](customization/sysctl/README.md) | TODO | TODO
|
||||
Features | [Rewrite](rewrite/README.md) | TODO | TODO
|
||||
Features | [Session stickiness](affinity/cookie/README.md) | route requests consistently to the same endpoint | Advanced
|
||||
Features | [Canary Deployments](canary/README.md) | weigthed canary routing to a seperate deployment | Intermediate
|
||||
Scaling | [Static IP](static-ip/README.md) | a single ingress gets a single static IP | Intermediate
|
||||
TLS | [Multi TLS certificate termination](multi-tls/README.md) | TODO | TODO
|
||||
TLS | [TLS termination](tls-termination/README.md) | TODO | TODO
|
||||
|
|
Loading…
Reference in a new issue