一、前言
在 Kubernetes Ingress 中,Canary 功能是一种基于流量分流和测试的部署策略,用于逐步引入新版本的应用程序并对其进行测试,canary可以通过权重、请求头、cookie来路由流量到不同的环境中
二、使用
权重
这里通过两个不同的服务去展示关于通过权重对流量的切分
vi ingress-web.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web
namespace: nodejs
spec:
rules:
- host: mz.njq.com
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: nodejs
port:
number: 80
ingressClassName: nginx
vi ingree-nacos.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nacos
annotations:
nginx.ingress.kubernetes.io/canary: "true" #开启canary功能
nginx.ingress.kubernetes.io/canary-weight: "30" #配置百分之三十的流量权重到该服务上
spec:
rules:
- host: mz.njq.com #使用相同的域名
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service: #后端服务是不同的
name: nacos
port:
number: 8848
ingressClassName: nginx
使用curl测试是否实现
访问到第四次的时候,跳转到了另一个服务上
请求头
通过两个不同的ingress服务去展示关于通过请求头对流量的切分
vi ingress-web.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web
namespace: nodejs
spec:
rules:
- host: mz.njq.com
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: nodejs
port:
number: 80
ingressClassName: nginx
vi ingree-nacos.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nacos
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "env" #定义请求头
nginx.ingress.kubernetes.io/canary-by-header-value: "green" #定义请求头的值,不定义值的话可以在使用请求头的时候用always或者neve,always则表示所有请求都路由到该服务上,never表示所有请求都不路由到该服务上
#nginx.ingress.kubernetes.io/canary-by-header-pattern: "blue|green" #该项也是定义请求头的值,只不过这个是使用正则表达式定义,如果与value同时存在,该项不生效
spec:
rules:
- host: mz.njq.com
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: nacos
port:
number: 8848
ingressClassName: nginx
使用curl测试是否实现
可以看到通过加上请求头是访问到不同的服务
cookie
通过两个不同的ingress服务去展示关于通过cookie对流量的切分
vi ingress-web.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web
namespace: nodejs
spec:
rules:
- host: mz.njq.com
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: nodejs
port:
number: 80
ingressClassName: nginx
vi ingree-nacos.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nacos
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "test" #定义cookie,cookie的值不能自定义只能是always或者never,如果是always则所有请求都路由到该服务上,如果是never则不路由到该服务上
spec:
rules:
- host: mz.njq.com
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: nacos
port:
number: 8848
ingressClassName: nginx
使用curl测试是否实现
可以看到指定cookie值为always后是访问到指定服务中