为ELB Ingress配置灰度发布
独享型ELB Ingress支持使用以下方式设置灰度发布:
- 支持按比例的方式发布灰度Ingress
- 支持按HTTP请求头的方式发布灰度Ingress
- 支持按Cookie发布的方式发布灰度Ingress
Ingress的灰度发布功能依赖ELB能力,使用该功能前请提交工单申请开通ELB灰度发布能力。
前提条件
- 已创建一个CCE Standard或CCE Turbo集群,且集群版本满足以下要求:
- v1.23集群:v1.23.14-r0 及以上版本
- v1.25集群:v1.25.9-r0 及以上版本
- v1.27集群:v1.27.6-r0 及以上版本
- v1.28集群:v1.28.4-r0 及以上版本
- 其他更高版本的集群
约束与限制
- 创建灰度Ingress后,不应删除原Ingress。
- 单个ELB下的监听器,如果关联的多个Ingress配置了多个灰度策略,按HTTP请求头的灰度策略优先级最高,按Cookie的灰度策略次之,按比例的灰度策略优先级最低。
- 该特性依赖ELB高级转发策略,开启后将不再根据域名/路径匹配确定优先级,请您根据实际需要自定义转发策略优先级。关于转发策略优先级详情请参见ELB Ingress转发策略优先级说明。
通过控制台配置灰度发布服务
- 登录CCE控制台,单击集群名称进入集群。
- 部署原服务。
- 在左侧导航栏中选择“工作负载”,单击右上角“创建工作负载”,部署名为origin-server的工作负载。配置参数说明请参见创建无状态负载(Deployment)。
- 在左侧导航栏中选择“服务”,切换至“服务”页签,单击右上角“创建服务”,创建名为origin-service的Service,并关联刚创建的origin-server工作负载(CCE Standard集群创建nodeport类型Service,Turbo集群创建ClusterIP类型Service)。
- 在左侧导航栏中选择“服务”,切换至“路由”页签,单击右上角“创建路由”,创建名为origin-ingress的Ingress,并关联刚创建的origin-service服务。参数配置说明请参见通过控制台创建ELB Ingress。
- 灰度发布新版本服务。
- 在左侧导航栏中选择“服务”,切换至“路由”页签,选择需要设置灰度发布的路由,在操作列单击“更多>创建灰度发布”。
- 设置灰度发布参数。
表1 关键参数说明 参数
配置说明
示例
灰度发布
- 按HTTP请求头:当HTTP请求的header键值对匹配时,访问灰度发布服务。
- 如果Ingress转发策略配置了域名和路径,最多支持配置8个Values值。
- 如果Ingress转发策略仅配置了路径,最多支持配置9个Values值。
- 按Cookie发布:当请求的Cookie键值对匹配时,访问灰度发布服务。
- 按比例发布:按访问灰度发布服务的请求比例。
按HTTP请求头
- 键:a
- 值:b
灰度转发策略配置
- 域名:实际访问的域名地址,不配置时可通过IP地址访问Ingress。请确保所填写的域名已注册并备案,一旦配置了域名规则后,必须使用域名访问。
- 开启灰度:开启灰度后,集群外部访问流量将按此规则转发至目标服务。
- 灰度规则:支持按HTTP请求头、按Cookie发布、按比例(灰度服务请求比例0%),请按需选择。
- 目标服务名称:请选择已有Service或新建Service。页面列表中的查询结果已自动过滤不符合要求的Service。
- 目标服务访问端口:可选择目标Service的访问端口。
- 域名:无需填写
- 开启灰度:开启
- 灰度规则:按HTTP请求头
- 目标服务名称:nginx
- 目标服务访问端口:80
- 按HTTP请求头:当HTTP请求的header键值对匹配时,访问灰度发布服务。
- 单击“确定”,创建灰度发布服务。
- 查看灰度发布新版本服务是否成功。
- 老版本服务下线。
新版本服务运行稳定后,需要下线老版本服务。下线流程将原服务Ingress中的Service修改为新版本服务的Service,使流量都路由到新版本服务上,然后删除灰度Ingress。
通过kubectl命令行配置灰度发布服务
- 部署原服务。
- 部署名为origin-server的工作负载。
- 部署名为origin-service的service,关联刚创建的origin-server工作负载。(CCE Standard集群创建nodeport类型Service,Turbo集群创建ClusterIP类型Service)
- 部署名为origin-ingress的Ingress,关联刚创建的origin-service服务。
Ingress的配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: origin-ingress namespace: default annotations: kubernetes.io/elb.port: '81' kubernetes.io/elb.id: e491f4e7-2351-4984-ad0a-8569e5e964a3 kubernetes.io/elb.class: performance spec: rules: - host: example.com http: paths: - path: / backend: service: name: origin-service port: number: 81 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH pathType: ImplementationSpecific ingressClassName: cce
- 灰度发布新版本服务。
部署新版本工作负载、服务和Ingress,使得流量能够通过权重或者头域导流到新版本服务上。
- 部署名为canary-server的工作负载。
- 部署名为canary-service的服务,关联刚创建的canary-server工作负载。(CCE Standard集群创建nodeport类型Service,Turbo集群创建ClusterIP类型Service)
- 创建灰度发布的Ingress。关于灰度发布的参数说明请参见参数说明。
- 场景一:按HTTP请求头,表示当HTTP请求的header键值对匹配时,访问灰度发布服务。
部署名为canary-header-ingress的Ingress,关联刚创建的canary-service服务,实现Header灰度发布。
Ingress的配置如下:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: canary-header-ingress namespace: default annotations: kubernetes.io/elb.canary: 'true' #设置为true,表示启用canary注解功能 kubernetes.io/elb.canary-by-header: 'location' # header的key值设置为location kubernetes.io/elb.canary-by-header-value: '{"values":["hz","sz","sh"]}' #header的value值设置为hz、sz、sh kubernetes.io/elb.class: performance #仅独享型ELB支持灰度发布 kubernetes.io/elb.id: e491f4e7-2351-4984-ad0a-8569e5e964a3 kubernetes.io/elb.port: '81' spec: ingressClassName: cce rules: - host: example.com http: paths: - path: / pathType: ImplementationSpecific backend: service: name: canary-service port: number: 80 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
- 场景二:按比例,即设置访问灰度发布服务的请求比例。
部署名为canary-weight-ingress的Ingress,关联刚创建的canary-service服务,实现权重灰度发布。
Ingress的配置如下:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: canary-weight-ingress namespace: default annotations: kubernetes.io/elb.canary: 'true' #设置为true,表示启用canary注解功能 kubernetes.io/elb.canary-weight: '40' #权重值设置,表示对应请求40%的流量将被导流到新版本服务上 kubernetes.io/elb.class: performance #仅独享型ELB支持灰度发布 kubernetes.io/elb.id: e491f4e7-2351-4984-ad0a-8569e5e964a3 kubernetes.io/elb.port: '81' spec: ingressClassName: cce rules: - host: example.com http: paths: - path: / pathType: ImplementationSpecific backend: service: name: canary-service port: number: 81 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
- 场景三:按Cookie,表示当请求的Cookie键值对匹配时,访问灰度发布服务。
部署名为canary-cookie-ingress的Ingress,关联刚创建的canary-service服务,实现按Cookie灰度发布。
Ingress的配置如下:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: canary-cookie-ingress namespace: default annotations: kubernetes.io/elb.canary: 'true' #设置为true,表示启用canary注解功能 kubernetes.io/elb.canary-by-cookie: 'location' # header的key值设置为location kubernetes.io/elb.canary-by-cookie-value: '{"values":["hz","sz","sh"]}' // header的value值设置为hz、sz、sh kubernetes.io/elb.class: performance #仅独享型ELB支持灰度发布 kubernetes.io/elb.id: e491f4e7-2351-4984-ad0a-8569e5e964a3 kubernetes.io/elb.port: '81' spec: ingressClassName: cce rules: - host: example.com http: paths: - path: / pathType: ImplementationSpecific backend: service: name: canary-service port: number: 81 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
- 场景一:按HTTP请求头,表示当HTTP请求的header键值对匹配时,访问灰度发布服务。
- 查看灰度发布新版本服务是否成功。
- 查看Ingress创建:
$ kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE canary-cookie-ingress cce example.com 88.88.88.165 80 16s canary-header-ingress cce example.com 88.88.88.165 80 46s canary-weight-ingress cce example.com 88.88.88.165 80 117s origin-ingress cce example.com 88.88.88.165 80 2m25s
- 查看ELB生成规则:
- 服务请求返回结果:
- 使用location:hz请求头的请求访问服务:
$ curl -H "Host: example.com" -H "location: hz" http://88.88.88.165:81/
预期结果:$ new
多次访问,返回结果均为new。
- 不使用请求头的请求访问服务:
$ curl -H "Host: example.com" http://88.88.88.165:81/
预期结果:返回值40%为new,60%为old。
- 使用location:hz请求头的请求访问服务:
- 查看Ingress创建:
- 老版本服务下线。
新版本服务运行稳定后,需要下线老版本服务。下线流程将原服务Ingress中的Service修改为新版本服务的Service,使流量都路由到新版本服务上,然后删除灰度Ingress。
- 将原服务Ingress关联的Service更新为新版本Service。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: origin-ingress namespace: default annotations: kubernetes.io/elb.port: '81' kubernetes.io/elb.id: e491f4e7-2351-4984-ad0a-8569e5e964a3 kubernetes.io/elb.class: performance spec: rules: - host: example.com http: paths: - path: / backend: service: name: canary-service port: number: 81 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH pathType: ImplementationSpecific ingressClassName: cce
- 验证老版本服务是否下线完成。
- 使用带header和不带header的请求,多次访问。
$ curl -H "Host: example.com" -H "location: hz" http://88.88.88.165:81/ $ curl -H "Host: example.com" http://88.88.88.165:81/
- 预期结果:输出均为new,无old返回。
- 使用带header和不带header的请求,多次访问。
- 确认老版本服务下线完成后,删除灰度发布Ingress。
$ kubectl delete ingress canary-weight-ingress canary-header-ingress
- 将原服务Ingress关联的Service更新为新版本Service。
参数说明
参数 |
是否必填 |
参数类型 |
描述 |
---|---|---|---|
kubernetes.io/elb.canary |
否 |
string |
设置Ingress灰度发布的开关。设置为true后,配合不同的注解,可以实现不同的灰度发布功能。 取值范围:true
|
kubernetes.io/elb.canary-weight |
否 |
string |
权重灰度发布权重值,设置后Ingress以权重灰度形式发布。
|
kubernetes.io/elb.session-affinity-mode |
否 |
string |
开启权重灰度发布后,配置会话保持能力。 灰度发布仅支持设置为 "HTTP_COOKIE"。 |
kubernetes.io/ elb.session-affinity-option |
否 |
string |
开启权重灰度发布会话保持能力后,会话保持的超时时间。 参数值为json字符串,格式如下: {"persistence_timeout": "1440"} 参数说明:
|
kubernetes.io/elb.canary-by-header |
否 |
string |
header灰度发布的Key值,表示请求头参数的名称。需要与kubernetes.io/elb.canary-by-header-value成对使用。 参数说明: 长度限制1-40字符,只允许包含字母、数字、中划线(-)和下划线(_)。 |
kubernetes.io/elb.canary-by-header-value |
否 |
string |
header灰度发布的Values值,需要与kubernetes.io/elb.canary-by-header成对使用。 参数值为json格式的数组,例如: '{"values":["a","b"]}' 参数说明:
|
kubernetes.io/elb.canary-by-cookie |
否 |
string |
cookie灰度发布的key值,表示请求cookie参数的名称。需要与kubernetes.io/elb.canary-by-cookie-value成对使用。 参数说明: 长度限制1-100字符,支持包含字母、数字、以及 !%'"()*+,./:=?@^\\-_`~ 等字符。 |
kubernetes.io/elb.canary-by-cookie-value |
否 |
string |
cookie灰度发布的values值,需要与kubernetes.io/elb.canary-by-cookie成对使用。 参数值为json格式的数组,例如: '{"values":["a","b"]}' 参数说明:
|
kubernetes.io/elb.canary-related-ingress-uid |
否 |
string |
灰度发布Ingress关联的原始Ingress的uid信息,用于前端展示原始Ingress和灰度发布的Ingress的关联关系。 ● 参数格式:字符串 ● 取值:原始Ingress的metadata.uid字段 |