云容器引擎 CCE-ELB Ingress配置灰度发布:灰度发布服务部署

时间:2024-05-31 08:37:31

灰度发布服务部署

  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

support.huaweicloud.com/usermanual-cce/cce_10_0736.html