更新时间:2024-04-23 GMT+08:00
分享

ELB Ingress配置灰度发布

独享型ELB Ingress支持使用以下方式设置灰度发布:

  • 支持以权重的方式发布灰度Ingress
  • 支持以头域的方式发布灰度Ingress
  • 支持以Cookie的方式发布灰度Ingress

Ingress的灰度发布功能依赖ELB能力,使用该功能前请提交工单申请开通ELB灰度发布能力。

约束与限制

  • 该特性存在集群版本限制,仅在以下版本中生效:
    • 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配置了多个灰度策略,头域优先级最高,cookie次之,权重优先级最低。

参数说明

表1 灰度发布参数说明

参数

是否必填

参数类型

描述

kubernetes.io/elb.canary

string

设置Ingress灰度发布的开关。设置为true后,配合不同的注解,可以实现不同的灰度发布功能。

取值范围:true

  • 独享型负载均衡器生效。
  • 设置为true后,不允许删除或修改。

kubernetes.io/elb.canary-weight

string

权重灰度发布权重值,设置后Ingress以权重灰度形式发布。

  • 取值为0-100的正整数,为灰度流量分配的百分比。
  • 发布成权重灰度Ingress时,该参数必填。
  • 不能与其他灰度发布功能同时设置。

kubernetes.io/elb.session-affinity-mode

string

开启权重灰度发布后,配置会话保持能力。

灰度发布仅支持设置为 "HTTP_COOKIE"。

kubernetes.io/

elb.session-affinity-option

string

开启权重灰度发布会话保持能力后,会话保持的超时时间。

参数值为json字符串,格式如下:

{"persistence_timeout": "1440"}

参数说明:

  • 超时时间范围为1-1440。
  • 默认值为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"]}'

参数说明:

  • 数组长度:最小值为1,最大值为10。
  • 数组取值:长度限制1-128字符,不支持空格,双引号,支持以下通配符:*(匹配0个或更多字符)和?(正好匹配1个字符)。

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"]}'

参数说明:

  • 数组长度:最小值为1,最大值为10。
  • 数组取值:长度限制1-100字符,不支持空格,支持包含字母、数字、以及 !%'"()*+,./:=?@^\\-_`~ 等字符。

kubernetes.io/elb.canary-related-ingress-uid

string

灰度发布Ingress关联的原始Ingress的uid信息,用于前端展示原始Ingress和灰度发布的Ingress的关联关系。

● 参数格式:字符串

● 取值:原始Ingress的metadata.uid字段

灰度发布服务部署

  1. 部署原服务。

    1. 部署名为origin-server的工作负载。
    2. 部署名为origin-service的service,关联刚创建的origin-server工作负载。(CCE Standard集群创建nodeport类型Service,Turbo集群创建ClusterIP类型Service)
    3. 部署名为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: nginx1.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

  2. 灰度发布新版本服务。

    部署新版本工作负载、服务和Ingress,使得流量能够通过权重或者头域导流到新版本服务上。

    1. 部署名为canary-server的工作负载。
    2. 部署名为canary-service的服务,关联刚创建的canary-server工作负载。(CCE Standard集群创建nodeport类型Service,Turbo集群创建ClusterIP类型Service)
    3. 部署名为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: nginx1.com
            http:
              paths:
                - path: /
                  pathType: ImplementationSpecific
                  backend:
                    service:
                      name: canary-service
                      port:
                        number: 81
                  property:
                    ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
    4. 部署名为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'
          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
          kubernetes.io/elb.id: e491f4e7-2351-4984-ad0a-8569e5e964a3
          kubernetes.io/elb.port: '81'
      spec:
        ingressClassName: cce
        rules:
          - host: nginx1.com
            http:
              paths:
                - path: /
                  pathType: ImplementationSpecific
                  backend:
                    service:
                      name: canary-service
                      port:
                        number: 80
                  property:
                    ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
    5. 查看灰度发布新版本服务是否成功。
      1. 查看Ingress创建:
        $ kubectl get ingress
        NAME                    CLASS   HOSTS        ADDRESS        PORTS   AGE
        canary-header-ingress   cce     nginx1.com   88.88.88.165   80      46s
        canary-weight-ingress   cce     nginx1.com   88.88.88.165   80      117s
        origin-ingress          cce     nginx1.com   88.88.88.165   80      2m25s
      2. 查看ELB生成规则:

      3. 服务请求返回结果:
        1. 使用location:hz请求头的请求访问服务:
          $ curl -H "Host: nginx1.com" -H "location: hz" http://88.88.88.165:81/
        2. 预期结果:
          $ new

          多次访问,返回结果均为new

        3. 不使用请求头的请求访问服务:
          $ curl -H "Host: nginx1.com" http://88.88.88.165:81/
        4. 预期结果:返回值40%为new,60%为old。

  3. 老版本服务下线。

    新版本服务运行稳定后,需要下线老版本服务。下线流程将原服务Ingress中的Service修改为新版本服务的Service,使流量都路由到新版本服务上,然后删除灰度Ingress。

    1. 将原服务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: nginx1.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
    2. 验证老版本服务是否下线完成。
      1. 使用带header和不带header的请求,多次访问。
        $ curl -H "Host: nginx1.com" -H "location: hz" http://88.88.88.165:81/
        $ curl -H "Host: nginx1.com" http://88.88.88.165:81/
      2. 预期结果:输出均为new,无old返回。
    3. 确认老版本服务下线完成后,删除灰度发布Ingress。
      $ kubectl delete ingress canary-weight-ingress canary-header-ingress

分享:

    相关文档

    相关产品