详情页标题前

阿里云容器服务ACK通过ALB Ingress实现灰度发布-云淘科技

详情页1

当服务迭代更新升级时,需要使用灰度发布保证系统的稳定性。ALB Ingress Controller支持设置注解,将请求流量按比例匹配到灰度服务。本文介绍如何使用ALB Ingress实现服务的灰度发布。

前提条件

已创建ALBConfig和IngressClass。具体操作,请参见创建ALBConfig。

canary注解说明

ALB Ingress支持使用canary注解实现基于Header、Cookie、Weight灰度发布。三种灰度策略优先级为Header>Cookie>Weight。同时配置三种策略时,优先级高的策略优先进行灰度。关于canary注解的详细说明,请参见通过注解实现灰度发布。

步骤一:部署服务

  1. 获取集群KubeConfig并通过kubectl工具连接集群。
  2. 部署服务tea。
    1. 使用以下内容,创建tea-deploy.yaml。
      apiVersion: apps/v1kind: Deploymentmetadata:  name: teaspec:  replicas: 1  selector:    matchLabels:      app: tea  template:    metadata:      labels:        app: tea    spec:      containers:      - name: tea        image: registry.cn-hangzhou.aliyuncs.com/acs-sample/old-nginx:latest        ports:        - containerPort: 80
    2. 执行以下命令,部署服务tea。
      kubectl apply -f tea-deploy.yaml
  3. 部署名为tea-svc的Service。
    1. 使用以下内容,创建tea-svc.yaml。
      apiVersion: v1kind: Servicemetadata:  name: tea-svcspec:  ports:  - port: 80    targetPort: 80    protocol: TCP  selector:    app: tea  type: NodePort
    2. 执行以下命令,部署Service。
      kubectl apply -f tea-svc.yaml
  4. 部署名为tea-ingress的Ingress。
    1. 使用以下内容,创建tea-ingress.yaml。
      apiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: tea-ingressspec:  ingressClassName: alb  rules:   - host: demo.domain.ingress.top     http:      paths:      - path: /        pathType: Prefix        backend:          service:            name: tea-svc            port:              number: 80
    2. 执行以下命令,部署Ingress。
      kubectl apply -f tea-ingress.yaml

步骤二:灰度发布新版本服务

部署新版本服务和Ingress,使得当请求Header为location: hz时将路由到新版本服务canary,其他请求Header以及不携带请求Header将以50%的权重路由到新版本服务canary。

  1. 部署新版本服务canary。
    1. 使用以下内容,创建canary-deploy.yaml。
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: canary
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: canary
        template:
          metadata:
            labels:
              app: canary
          spec:
            containers:
            - name: canary
              image: registry.cn-hangzhou.aliyuncs.com/acs-sample/new-nginx:latest
              ports:
              - containerPort: 80
    2. 执行以下命令,部署canary。
      kubectl apply -f canary-deploy.yaml
  2. 部署名为canary-svc的Service。
    1. 使用以下内容,创建canary-svc.yaml。
      apiVersion: v1
      kind: Service
      metadata:
        name: canary-svc
      spec:
        ports:
        - port: 80
          targetPort: 80
          protocol: TCP
        selector:
          app: canary
        type: NodePort
    2. 执行以下命令,部署Service。
      kubectl apply -f canary-svc.yaml
  3. 部署基于Header分配流量的Ingress。
    1. 使用以下内容,创建canary-header-ingress.yaml。
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        annotations:
          alb.ingress.kubernetes.io/canary: "true"
          alb.ingress.kubernetes.io/canary-by-header: "location"
          alb.ingress.kubernetes.io/canary-by-header-value: "hz"
        name: canary-header-ingress
        namespace: default
      spec:
        ingressClassName: alb
        rules:
          - host: demo.domain.ingress.top
            http:
              paths:
                - backend:
                    service:
                      name: canary-svc
                      port:
                        number: 80
                  path: /
                  pathType: Prefix
      • alb.ingress.kubernetes.io/canary:设置为true,表示启用canary注解功能。
      • alb.ingress.kubernetes.io/canary-by-header与alb.ingress.kubernetes.io/canary-by-header-value:设置请求Header的键值对。本文设置为location: hz,表示请求Header为location: hz,请求流量会被分配到新版本服务;对于其他Header,将会忽略Header,并通过灰度优先级将请求流量分配到其他规则设置的新版本服务。
    2. 执行以下命令,部署基于Header分配流量的Ingress。
      kubectl apply -f canary-header-ingress.yaml
  4. 部署基于权重分配流量的Ingress。
    1. 使用以下内容,创建canary-weight-ingress.yaml。
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        annotations:
          alb.ingress.kubernetes.io/canary: "true"
          alb.ingress.kubernetes.io/canary-weight: "50"
        name: canary-weight-ingress
        namespace: default
      spec:
        ingressClassName: alb
        rules:
          - host: demo.domain.ingress.top
            http:
              paths:
                - backend:
                    service:
                      name: canary-svc
                      port:
                        number: 80
                  path: /
                  pathType: Prefix

      alb.ingress.kubernetes.io/canary-weight:设置路由到新版本服务的流量百分比。本文设置为50,表示50%流量将路由到新版本服务。

    2. 执行以下命令,部署基于权重分配流量的Ingress。
      kubectl apply -f canary-weight-ingress.yaml
  5. 验证灰度发布新版本服务是否成功。
    1. 执行以下命令,获取ALB实例访问地址。
      kubectl get ing

      预期输出:

      NAME                    CLASS   HOSTS                     ADDRESS                                              PORTS   AGE
      canary-header-ingress   alb     demo.domain.ingress.top   alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com   80      8m23s
      canary-weight-ingress   alb     demo.domain.ingress.top   alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com   80      8m16s
      tea-ingress             alb     demo.domain.ingress.top   alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com   80      7m5s
    2. 执行以下命令,多次使用携带location: hz请求头的请求访问服务。
      curl -H Host:demo.domain.ingress.top -H "location:hz" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      预期输出:

      new

      多次使用携带location: hz请求头的请求访问服务,都返回new的结果,说明使用携带location: hz请求头的请求访问服务时,请求都路由到新版本服务。

    3. 多次执行以下命令,使不携带请求头的请求访问服务。
      curl -H Host:demo.domain.ingress.top http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      多次不携带请求头的请求访问服务,50%概率返回new的结果,50%概率返回old的结果,说明不携带请求头的请求访问服务时,请求按照50%权重路由到新版本服务。

    4. 多次执行以下命令,使携带location: bj请求头的请求访问服务。
      curl -H Host:demo.domain.ingress.top -H "location:bj" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      多次携带location: bj请求头的请求访问服务,50%概率返回new的结果,50%概率返回old的结果,说明携带location: bj请求头的请求访问服务时,请求按照50%权重路由到新版本服务。

    根据以上结果,可以看到当请求Header为location: hz时将路由到新版本服务canary,不携带请求Header以及其他请求Header以50%的权重路由到新版本服务canary,说明灰度发布canary服务成功。

步骤三:下线老版本服务

系统运行一段时间后,当新版本服务已经稳定并且符合预期后,需要下线老版本的服务,仅保留新版本服务在线上运行。为了达到该目标,需要将原服务的Ingress中的Service修改为新版本服务的Service,使得流量都路由到新版本服务,然后删除灰度Ingress。

  1. 执行以下命令,将tea-ingress.yaml文件中的Service由tea-svc修改为canary-svc。
    vim tea-ingress.yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: tea-ingress
    spec:
      ingressClassName: alb
      rules:
       - host: demo.domain.ingress.top
         http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: canary-svc
                port:
                  number: 80
  2. 执行以下命令,使修改后的Ingress生效。
    Kubectl apply -f tea-ingress.yaml
  3. 验证下线老版本服务是否成功。
    1. 执行以下命令,多次使用携带location: hz请求头的请求访问服务。
      curl -H Host:demo.domain.ingress.top -H "location:hz" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      预期输出:

      new

      多次使用携带location: hz请求头的请求访问服务,都返回new的结果,说明使用携带location: hz请求头的请求访问服务时,请求都路由到新版本服务。

    2. 执行以下命令,多次使用不携带请求头的请求访问服务。
      curl -H Host:demo.domain.ingress.top http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      预期输出:

      new

      多次使用不携带请求头的请求访问服务,都返回new的结果,说明使用不携带请求头的请求访问服务时,请求都路由到新版本服务。

    3. 执行以下命令,使多次携带location: bj请求头的请求访问服务。
      curl -H Host:demo.domain.ingress.top -H "location:bj" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      预期输出:

      new

      多次使用携带location: bj请求头的请求访问服务,都返回new的结果,说明使用携带location: bj请求头的请求访问服务时,请求都路由到新版本服务。

    根据以上结果,可以看到携带location: hz请求头,携带其他请求头,或者不携带请求头的请求都路由到新版本服务,说明下线老版本服务成功。

  4. 执行以下命令,删除名为canary-weight-ingress和canary-header-ingress的灰度Ingress。
    kubectl delete ing canary-weight-ingress canary-header-ingress

相关文档

  • 通过AlbConfig配置ALB实例
  • ALB Ingress服务高级用法
  • 通过ALB Ingress访问服务

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家

阿里云企业补贴进行中: 马上申请

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心。

购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠

转转请注明出处:https://www.yunxiaoer.com/158051.html

(0)
上一篇 2023年12月10日 上午1:14
下一篇 2023年12月10日 上午1:14
详情页2

相关推荐

  • 阿里云容器服务ACK通过ALB Ingress访问服务-云淘科技

    ALB Ingress基于阿里云应用型负载均衡ALB(Application Load Balancer) 实现的Ingress服务,适用于有明显波峰波谷的业务场景。本文介绍如何在ACK集群中使用ALB Ingress访问服务。 前提条件 已创建ACK托管集群或ACK专有集群,Kubernetes版本为1.18及以上版本。具体操作,请参见创建Kubernet…

    阿里云容器服务 2023年12月10日
  • 阿里云容器服务ACKALB Ingress服务高级用法-云淘科技

    在ACK Serverless集群中,ALB Ingress对集群服务(Service)中外部可访问的API对象进行管理,提供七层负载均衡能力。本文介绍如何使用ALB Ingress将来自不同域名或URL路径的请求转发给不同的后端服务器组、将HTTP访问重定向至HTTPS及实现灰度发布等功能。 索引 前提条件 基于域名转发请求 基于URL路径转发请求 配置健…

    阿里云容器服务 2023年12月10日
  • 阿里云负载均衡使用ALB实现灰度发布-云淘科技

    灰度发布(又称为金丝雀发布)是一种平滑过渡的发布方式,将老版本应用与新版本应用同时部署在环境中,让一部分用户继续使用老版本应用,一部分用户开始使用新版本应用,然后根据用户使用情况调整新版本流量占比,逐步把所有用户都迁移到新版本应用。 应用场景 互联网产品需要快速迭代开发上线,同时又要保证质量。为保证刚上线的系统出现问题后可以很快控制影响,需要设计一套灰度发布…

    2023年12月10日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 阿里云负载均衡自建Kubernetes集群使用ALB Ingress最佳实践-云淘科技

    本文指导您如何在阿里云云上自建的Kubernetes集群中通过ALB Ingress,来使用阿里云应用型负载均衡ALB(Application Load Balancer)产品。 场景示例 本文以下图场景为例。您已依托阿里云云上资源自建Kubernetes集群,并希望该集群可以通过ALB Ingress转发请求。 您可以通过在自建Kubernetes集群中部…

    2023年12月10日
  • 阿里云容器服务ACKALB Ingress服务高级用法-云淘科技

    在ACK Serverless集群中,ALB Ingress对集群服务(Service)中外部可访问的API对象进行管理,提供七层负载均衡能力。本文介绍如何使用ALB Ingress将来自不同域名或URL路径的请求转发给不同的后端服务器组、将HTTP访问重定向至HTTPS及实现灰度发布等功能。 索引 前提条件 基于域名转发请求 基于URL路径转发请求 配置健…

    阿里云容器服务 2023年12月10日

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。