Kubernetes 基于Ingress Nginx 进行灰度发布【2024-02-02测试成功】
基于Ingress Nginx 的 Canary 规则
#解释1
Ingress Nginx Annotations文于的Canary规则
#nginx.ingress.kubernetes.io/canary-by-header: 基于该Annotation中指定Request Header进行流量切分,适用于灰度发布以及A/B测试
在请求报文中,若存在该Hleader且其值为always时,请求将会被发送到Canary版本
若存在该Header且其值为never时,请求将不会被发送至Canary版本
对于任何其它值,将忽略该Annotation指定的Headder,并通过优先级将请求与其他金丝雀规则进行优先级的比较
#nginx.ingress.kubernetes,io/canary-by-header-value:基于该Annotation中指定的Request Header的值进行流量切分,标头名称则由前一个Annotation (nginx.ingress.kubernetes.io/canary-by-header) 进行指定
请求报文中存在指定的标头,且其值与该Annotation的信匹配时,它将被路由到Canary版本
对于任何其它值,将忽略该Annotation
#nginx.ingress.kubernetes.io/canary-by-header-pattern
同canary-by-header-value的功能类似,但该Annotation其于正则表达式匹配Request Header的值
若该Annotation与canary-by-header-value同时存在,则该Annotation会被忽略
#nginx.ingress.kubernetes.io/canary-weight: 基于服务权重进行流量切分,适用于绿部署,权重范围0-100按百分比将请求路由到Canary Ingress中指定的服务
权重为0 意味着该金丝雀规则不会向Canary入口的服务发送任何请求
权重为100意味着所有请求都将被发送到 Canary入口
#nginx.ingress.kubernetes.io/canary-by-cookie: 基于 cookie 的流量切分,适用于灰度发布与 A/B 测试
cookie的值设置为alwavs时,它将被路山到Canarv入口
cookie的值设置为never时,请求不会被发送到Canary入口
对于任何其他值,将忽略 cookie 并将请求与其他金丝雀规则进行优先级的比较
规则的应用次序
#Canary规则会按特定的次序进行评估
canary-by-header -> canary-by-cookie-> canary-weight
实战
示例:
Production: deployment-v10, demoapp:v1.0, service-v10
Canary: deployment-v11, demoapp:v1.1, service-v11
1、部署v1.0版本应用
[root@ca-k8s-master01 Simple_fanout]# vim deploy-demoapp-v1_0.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: demoapp
name: demoapp-v10
spec:
replicas: 3
selector:
matchLabels:
app: demoapp
version: v1.0
strategy: {}
template:
metadata:
labels:
app: demoapp
version: v1.0
spec:
containers:
- image: ikubernetes/demoapp:v1.0
name: demoapp
resources: {}
---
apiVersion: v1
kind: Service
metadata:
labels:
app: demoapp
name: demoapp-v10
spec:
ports:
- name: http-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: demoapp
version: v1.0
type: ClusterIP
[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f deploy-demoapp-v1_0.yaml
deployment.apps/demoapp-v10 created
service/demoapp-v10 created
[root@ca-k8s-master01 Simple_fanout]# kubectl get pods
NAME READY STATUS RESTARTS AGE
demoapp-v10-758f9b94f-26jnn 1/1 Running 0 21s
demoapp-v10-758f9b94f-fvqzm 1/1 Running 0 21s
demoapp-v10-758f9b94f-ndn55 1/1 Running 0 21s
2、正常通过Ingress发布资源
[root@ca-k8s-master01 Simple_fanout]# vim 01-ingress-demoapp.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demoapp
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: demoapp.sheca.com
http:
paths:
- backend:
service:
name: demoapp-v10
port:
number: 80
path: /
pathType: Prefix
[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f 01-ingress-demoapp.yaml
ingress.networking.k8s.io/demoapp created
#这里的ADDRESS IP是通过MetaILB部署 分配的 Load Balance地址
[root@ca-k8s-master01 Simple_fanout]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
demoapp <none> demoapp.sheca.com 192.168.40.53 80 2m20s
#windows配置域名解析
192.168.40.53 demoapp.sheca.com
#windows通过浏览器访问 demoapp.sheca.com
#Linux编辑hosts文件 192.168.40.53 demoapp.sheca.com
[root@ca-k8s-master01 Simple_fanout]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.40.120 ca-k8s-master01
192.168.40.121 ca-k8s-node01
192.168.40.122 ca-k8s-node02
192.168.40.190 event.sheca.com argocd.magedu.com
192.168.40.104 harbor.sheca.com
192.168.40.53 demoapp.sheca.com
#Linux客户端访问
[root@ca-k8s-master01 Simple_fanout]# while true; do curl demoapp.sheca.com; sleep .8;done
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!
3、此时需要发布新版本、部署v1.1版本应用
[root@ca-k8s-master01 Simple_fanout]# vim deploy-demoapp-v1_1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: demoapp
name: demoapp-v11
spec:
replicas: 2
selector:
matchLabels:
app: demoapp
version: v1.1
strategy: {}
template:
metadata:
labels:
app: demoapp
version: v1.1
spec:
containers:
- image: ikubernetes/demoapp:v1.1
name: demoapp
resources: {}
---
apiVersion: v1
kind: Service
metadata:
labels:
app: demoapp
name: demoapp-v11
spec:
ports:
- name: http-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: demoapp
version: v1.1
type: ClusterIP
[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f deploy-demoapp-v1_1.yaml
[root@ca-k8s-master01 Simple_fanout]# kubectl get pods | grep demoapp
demoapp-v10-758f9b94f-26jnn 1/1 Running 0 10m
demoapp-v10-758f9b94f-fvqzm 1/1 Running 0 10m
demoapp-v10-758f9b94f-ndn55 1/1 Running 0 10m
demoapp-v11-59cfdb6cf9-5fdld 1/1 Running 0 71s
demoapp-v11-59cfdb6cf9-g28kq 1/1 Running 0 71s
4、配置canary策略:canary-by-header 默认值:always
# nginx.ingress.kubernetes.io/canary-by-header: "X-Canary"
# 表示 Header 请求X-Canary=always 请求到 demoapp-v11 其他都是demoapp-v10
[root@ca-k8s-master01 Simple_fanout]# vim 02-canary-by-header.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "X-Canary"
name: demoapp-canary-by-header
spec:
rules:
- host: demoapp.sheca.com
http:
paths:
- backend:
service:
name: demoapp-v11
port:
number: 80
path: /
pathType: Prefix
[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f 02-canary-by-header.yaml
ingress.networking.k8s.io/demoapp-canary-by-header created
#测试结果curl -H "X-Canary: always" demoapp.sheca.com 都到了 demoapp v1.1 版本上
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary: always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary: always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary: always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary: always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary: always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
[root@ca-k8s-master01 Simple_fanout]# kubectl describe ingress demoapp-canary-by-header
Name: demoapp-canary-by-header
Labels: <none>
Namespace: default
Address:
Ingress Class: <none>
Default backend: <default>
Rules:
Host Path Backends
---- ---- --------
demoapp.sheca.com
/ demoapp-v11:80 (10.244.132.230:80,10.244.36.59:80)
Annotations: kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: true
nginx.ingress.kubernetes.io/canary-by-header: X-Canary
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Sync 29s nginx-ingress-controller Scheduled for sync
[root@ca-k8s-master01 Simple_fanout]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
demoapp <none> demoapp.sheca.com 192.168.40.53 80 12m
demoapp-canary-by-header <none> demoapp.sheca.com 192.168.40.53 80 43s
5、配置canary策略:canary-by-header-value 指定确认值
# nginx.ingress.kubernetes.io/canary-by-header: "IsVIP"
# nginx.ingress.kubernetes.io/canary-by-header-value: "false"
# 表示 Header IsVIP=false 转给 demoapp-v11 其他转给 demoapp-v10
[root@ca-k8s-master01 Simple_fanout]# vim 03-canary-by-header-value.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "IsVIP"
nginx.ingress.kubernetes.io/canary-by-header-value: "false"
name: demoapp-canary-by-header-value
spec:
rules:
- host: demoapp.sheca.com
http:
paths:
- backend:
service:
name: demoapp-v11
port:
number: 80
path: /
pathType: Prefix
#删除之前的
[root@ca-k8s-master01 Simple_fanout]# kubectl delete -f 02-canary-by-header.yaml
ingress.networking.k8s.io "demoapp-canary-by-header" deleted
[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f 03-canary-by-header-value.yaml
ingress.networking.k8s.io/demoapp-canary-by-header-value created
[root@ca-k8s-master01 Simple_fanout]# kubectl describe ingress demoapp-canary-by-header-value
Name: demoapp-canary-by-header-value
Labels: <none>
Namespace: default
Address:
Ingress Class: <none>
Default backend: <default>
Rules:
Host Path Backends
---- ---- --------
demoapp.sheca.com
/ demoapp-v11:80 (10.244.132.230:80,10.244.36.59:80)
Annotations: kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: true
nginx.ingress.kubernetes.io/canary-by-header: IsVIP
nginx.ingress.kubernetes.io/canary-by-header-value: false
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Sync 16s nginx-ingress-controller Scheduled for sync
#测试"IsVIP: false" 转到 v1.1
[root@ca-k8s-master01 Simple_fanout]# curl -H "IsVIP: false" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
[root@ca-k8s-master01 Simple_fanout]# curl -H "IsVIP: false" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
#"IsVIP: true" 或者 其他值都是 v1.0
[root@ca-k8s-master01 Simple_fanout]# curl -H "IsVIP: true" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!
[root@ca-k8s-master01 Simple_fanout]# curl -H "IsVIP: xxx" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!
[root@ca-k8s-master01 Simple_fanout]# curl -H "xxxx" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!
6、配置canary策略:canary-by-header-pattern 通配符值
# nginx.ingress.kubernetes.io/canary: "true"
# nginx.ingress.kubernetes.io/canary-by-header: "Username"
# nginx.ingress.kubernetes.io/canary-by-header-pattern: "(vip|VIP)_.*"
# 表示 Header 访问 Username=vip_通配 或者 Username=VIP_通配 访问 demoapp-v11 其他访问 demoapp-v10
[root@ca-k8s-master01 Simple_fanout]# vim 04-canary-by-header-pattern.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "Username"
nginx.ingress.kubernetes.io/canary-by-header-pattern: "(vip|VIP)_.*"
name: demoapp-canary-by-header-pattern
spec:
rules:
- host: demoapp.sheca.com
http:
paths:
- backend:
service:
name: demoapp-v11
port:
number: 80
path: /
pathType: Prefix
#删除之前的Ingress配置
[root@ca-k8s-master01 Simple_fanout]# kubectl delete -f 03-canary-by-header-value.yaml
ingress.networking.k8s.io "demoapp-canary-by-header-value" deleted
[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f 04-canary-by-header-pattern.yaml
ingress.networking.k8s.io/demoapp-canary-by-header-pattern created
[root@ca-k8s-master01 Simple_fanout]# kubectl describe ingress demoapp-canary-by-header-pattern
Name: demoapp-canary-by-header-pattern
Labels: <none>
Namespace: default
Address:
Ingress Class: <none>
Default backend: <default>
Rules:
Host Path Backends
---- ---- --------
demoapp.sheca.com
/ demoapp-v11:80 (10.244.132.230:80,10.244.36.59:80)
Annotations: kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: true
nginx.ingress.kubernetes.io/canary-by-header: Username
nginx.ingress.kubernetes.io/canary-by-header-pattern: (vip|VIP)_.*
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Sync 10s nginx-ingress-controller Scheduled for sync
[root@ca-k8s-master01 Simple_fanout]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
demoapp <none> demoapp.sheca.com 192.168.40.53 80 26m
demoapp-canary-by-header-pattern <none> demoapp.sheca.com 192.168.40.53 80 79s
#测试"Username: VIP_abc" "Username: vip_abc" 转到 v1.1 其他访问到 v1.0
[root@ca-k8s-master01 Simple_fanout]# curl -H "Username: VIP_abc" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -H "Username: vip_abc" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -H "Username: vip_wwww" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
[root@ca-k8s-master01 Simple_fanout]# curl -H "Username: VIP_xks" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
[root@ca-k8s-master01 Simple_fanout]# curl -H "Username: VIp_xks" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
[root@ca-k8s-master01 Simple_fanout]# curl -H "Username: vIP_hy" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!
7、配置canary策略:canary-weight 流量权重
# nginx.ingress.kubernetes.io/canary: "true"
# nginx.ingress.kubernetes.io/canary-weight: "40"
# 表示权重进行流量策略
[root@ca-k8s-master01 Simple_fanout]# vim 05-canary-by-weight.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "40"
name: demoapp-canary-by-weight
spec:
rules:
- host: demoapp.sheca.com
http:
paths:
- backend:
service:
name: demoapp-v11
port:
number: 80
path: /
pathType: Prefix
#删除之前Ingress
[root@ca-k8s-master01 Simple_fanout]# kubectl delete -f 04-canary-by-header-pattern.yaml
ingress.networking.k8s.io "demoapp-canary-by-header-pattern" deleted
[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f 05-canary-by-weight.yaml
ingress.networking.k8s.io/demoapp-canary-by-weight created
[root@ca-k8s-master01 Simple_fanout]# kubectl describe ingress demoapp-canary-by-weight
Name: demoapp-canary-by-weight
Labels: <none>
Namespace: default
Address:
Ingress Class: <none>
Default backend: <default>
Rules:
Host Path Backends
---- ---- --------
demoapp.sheca.com
/ demoapp-v11:80 (10.244.132.230:80,10.244.36.59:80)
Annotations: kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: true
nginx.ingress.kubernetes.io/canary-weight: 40
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Sync 11s nginx-ingress-controller Scheduled for sync
[root@ca-k8s-master01 Simple_fanout]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
demoapp <none> demoapp.sheca.com 192.168.40.53 80 38m
demoapp-canary-by-weight <none> demoapp.sheca.com 192.168.40.53 80 30s
#测试 分配40%流量到了 v1.1
[root@ca-k8s-master01 Simple_fanout]# while true; do curl demoapp.sheca.com; sleep .8;done
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
8、配置canary策略:canary-by-cookie
#nginx.ingress.kubernetes.io/canary: "true"
#nginx.ingress.kubernetes.io/canary-by-cookie: "vip_user"
#表示 通过cookie "vip_user"=always 转发到 demoapp-v11 其他转发到 demoapp-v10
[root@ca-k8s-master01 Simple_fanout]# vim 06-canary-by-cookie.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "vip_user"
name: demoapp-canary-by-cookie
spec:
rules:
- host: demoapp.sheca.com
http:
paths:
- backend:
service:
name: demoapp-v11
port:
number: 80
path: /
pathType: Prefix
#删除之前的Ingress
[root@ca-k8s-master01 Simple_fanout]# kubectl delete -f 05-canary-by-weight.yaml
ingress.networking.k8s.io "demoapp-canary-by-weight" deleted
[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f 06-canary-by-cookie.yaml
ingress.networking.k8s.io/demoapp-canary-by-cookie created
[root@ca-k8s-master01 Simple_fanout]# kubectl describe ingress demoapp-canary-by-cookie
Name: demoapp-canary-by-cookie
Labels: <none>
Namespace: default
Address:
Ingress Class: <none>
Default backend: <default>
Rules:
Host Path Backends
---- ---- --------
demoapp.sheca.com
/ demoapp-v11:80 (10.244.132.230:80,10.244.36.59:80)
Annotations: kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: true
nginx.ingress.kubernetes.io/canary-by-cookie: vip_user
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Sync 15s nginx-ingress-controller Scheduled for sync
[root@ca-k8s-master01 Simple_fanout]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
demoapp <none> demoapp.sheca.com 192.168.40.53 80 44m
demoapp-canary-by-cookie <none> demoapp.sheca.com 192.168.40.53 80 61s
#测试 "vip_user=always" 转发到 v1.1 其他都是 v1.0
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=never" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip=never" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!
9、配置canary策略:组合使用
[root@ca-k8s-master01 Simple_fanout]# vim 07-canary-by-cookie-header-weight.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "vip_user"
nginx.ingress.kubernetes.io/canary-by-header: "X-Canary"
nginx.ingress.kubernetes.io/canary-weight: "70"
name: demoapp-canary-by-cookie-header-weight
spec:
rules:
- host: demoapp.sheca.com
http:
paths:
- backend:
service:
name: demoapp-v11
port:
number: 80
path: /
pathType: Prefix
#删除之前Ingress
[root@ca-k8s-master01 Simple_fanout]# kubectl delete -f 06-canary-by-cookie.yaml
[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f 07-canary-by-cookie-header-weight.yaml
ingress.networking.k8s.io/demoapp-canary-by-cookie-header-weight created
[root@ca-k8s-master01 Simple_fanout]# kubectl describe ingress demoapp-canary-by-cookie-header-weight
Name: demoapp-canary-by-cookie-header-weight
Labels: <none>
Namespace: default
Address:
Ingress Class: <none>
Default backend: <default>
Rules:
Host Path Backends
---- ---- --------
demoapp.sheca.com
/ demoapp-v11:80 (10.244.132.230:80,10.244.36.59:80)
Annotations: kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: true
nginx.ingress.kubernetes.io/canary-by-cookie: vip_user
nginx.ingress.kubernetes.io/canary-by-header: X-Canary
nginx.ingress.kubernetes.io/canary-by-weight: 70
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Sync 13s nginx-ingress-controller Scheduled for sync
[root@ca-k8s-master01 Simple_fanout]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
demoapp <none> demoapp.sheca.com 192.168.40.53 80 54m
demoapp-canary-by-cookie-header-weight <none> demoapp.sheca.com 192.168.40.53 80 41s
#测试1 正常访问70% v1.1 其他 v1.0上
[root@ca-k8s-master01 Simple_fanout]# while true; do curl demoapp.sheca.com; sleep .8;done
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
#测试2 "vip_user=always"转给 v1.1 "vip_user=never" 转给1.0
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=never" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
# 其他值根据负载策略随机转发 "vip_user=xxx" "vip_user=xks"
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=xxx" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=xxx" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=xxx" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=xxx" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
#测试3 "X-Canary: always" 转发v1.1 "X-Canary: never"转发v1.0
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary: always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary: never" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!
#"X-Canary: xxxx" 其他值根据负载策略随机转发
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary: xxxx" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary: xxxx" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary: xxxx" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary: xxxx" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!