如何在ACK中进行自动化应用灰度发布

简介: # 什么是灰度发布 灰度发布,又称金丝雀发布,是将应用的旧版本A与新版本B同时部署在环境中,业务请求可能会被路由到版本A的后端上,也可能会被路由到版本B的后端上。您可以自定义灰度发布策略,快速调整版本A和B的流量占比。 灰度发布可以在发布新版本应用时,自定义控制新版本应用流量比重,渐进式完成新版本应用的全量上线,最大限度地控制新版本发布带来的业务风险,降低故障带来的影响面,同时支持快速回滚

什么是灰度发布

灰度发布,又称金丝雀发布,是将应用的旧版本A与新版本B同时部署在环境中,业务请求可能会被路由到版本A的后端上,也可能会被路由到版本B的后端上。您可以自定义灰度发布策略,快速调整版本A和B的流量占比。

灰度发布可以在发布新版本应用时,自定义控制新版本应用流量比重,渐进式完成新版本应用的全量上线,最大限度地控制新版本发布带来的业务风险,降低故障带来的影响面,同时支持快速回滚。

在传统的应用部署方式下,可以通过使用Nginx配置upstream来实现灰度发布以及流量控制等。那么在今天云原生大行其道的前提之下,我们有哪几种方式呢?

目前社区有Ingress 、Linkerd 以及 Istio等几种方案来实现灰度发布。目前也有相应的开源方案实现了以上几种灰度发布方案。更加详细的可以参考Flagger社区

Flagger介绍

Flagger是一个渐进的交付工具,它自动化了运行在Kubernetes上的应用程序的发布过程。在度量度量和运行一致性测试的同时,通过逐渐地将流量转移到新版本,它减少了在生产中引入新软件版本的风险。

Flagger通过使用服务网格(App mesh, Istio,Linkerd)或Ingress控制器(Contour, Gloo, NGINX, Skipper, Traefik)进行流量路由的方式实现了多种部署策略(Canary发布,A/B测试,蓝/绿镜像)。同时Flagger可以与
Prometheus等监控工具进行结合,通过采集运行期的metrics,来实现更加自动化的发布能力。同时也可以与Slack、MS Teams等工具集成实现告警。

那么ACK在社区Flagger版本的基础上,结合业务发展的阶段,做了不同的策略,例如手动发布的支持、集成钉钉报警等。更多的能力会在后续的版本中进行增强

下面是Flagger的概览图以及灰度发布的流程图。

Flagger概览图:

flagger-canary-overview.png

灰度发布流程图:

image.png

灰度发布

  • 创建一个ACK集群,具体可以参考创建ACK集群
  • 在集群中安装Flagger控制器,具体可以参考安装灰度发布组件
  • 创建灰度发布测试应用,其中包括对应的Deployment,Service和Ingress。可以将下边的yaml保存到本地为podinfo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: podinfo
  name: podinfo
  namespace: default
spec:
  minReadySeconds: 5
  progressDeadlineSeconds: 60
  replicas: 4
  revisionHistoryLimit: 5
  selector:
    matchLabels:
      app: podinfo
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: podinfo
    spec:
      containers:
        - image: 'registry.cn-hangzhou.aliyuncs.com/acs/rollouts-demo:blue'
          imagePullPolicy: IfNotPresent
          name: podinfod
          ports:
            - containerPort: 8080
              name: http
              protocol: TCP
          readinessProbe:
            failureThreshold: 3
            initialDelaySeconds: 5
            periodSeconds: 10
            successThreshold: 1
            tcpSocket:
              port: 8080
            timeoutSeconds: 5
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

---

apiVersion: v1
kind: Service
metadata:
  name: my-podinfo-svc
  namespace: default
spec:
  clusterIP: 172.24.8.231
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 8080
  selector:
    app: podinfo
  sessionAffinity: None
  type: ClusterIP

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  labels:
    app: podinfo
  name: podinfo
  namespace: default
spec:
  rules:
    - host: app.example.com
      http:
        paths:
          - backend:
              serviceName: my-podinfo-svc
              servicePort: 80
  • 创建灰度发布,可以将如下的保存到本地文件为 podinfo-canary.yaml
apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
  annotations:
    # 该处的annotations 务必主要,加了该注解后执行ACK实现的逻辑
    alicloud.canary.extension.switch: 'true'
  name: podinfo-default
  namespace: default
spec:
  analysis:
    # 定义webhooks
    webhooks:
      - name: "canary released"
        # webhook类型,更多的webhook类型如下:
        type: post-rollout
        timeout: "5s"
        # webhook地址
        url: https://enaeqge6875ahr8.m.pipedream.net
        # webhook元数据,
        metadata:
            data: "{\"msgtype\": \"text\",\"text\": {\"content\": \"deploy success\"}}"
    # 定义灰度版本每次增加的Replica数量
    canaryReplicas: 1
    canaryWeight: 0
    interval: 3s
    maxReplicas: 4
    maxWeight: 100
    # 步长
    stepWeight: 20
    threshold: 5
  # 对应的应用的Ingress配置
  ingressRef:
    apiVersion: extensions/v1beta1
    kind: Ingress
    name: podinfo
  provider: nginx
  # 对应Deployment的Service配置
  service:
    name: my-podinfo-svc
    port: 80
    targetPort: 8080
  # 灰度发布的目标,为Deployment
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: podinfo

更多的webhooks类型如下

// RolloutHook execute webhook during the canary analysis
RolloutHook HookType = "rollout"
// PreRolloutHook execute webhook before routing traffic to canary
PreRolloutHook HookType = "pre-rollout"
// PreRolloutHook execute webhook after the canary analysis
PostRolloutHook HookType = "post-rollout"
// ConfirmRolloutHook halt canary analysis until webhook returns HTTP 200
ConfirmRolloutHook HookType = "confirm-rollout"
// ConfirmPromotionHook halt canary promotion until webhook returns HTTP 200
ConfirmPromotionHook HookType = "confirm-promotion"
// EventHook dispatches Flagger events to the specified endpoint
EventHook HookType = "event"
// RollbackHook rollback canary analysis if webhook returns HTTP 200
RollbackHook HookType = "rollback"
  • 修改灰度发布的版本,该处主要值得是修改对应的镜像版本

通过上述的步骤创建完测试应用以及对应的灰度发布以后,可以通过ACK控制台观察灰度发布的状态,当状态有初始化中->初始化完毕后,可以修改对应的发布应用的镜像版本。如下图左上方红色框标记处,点击编辑。

image.png

目前ACK的测试镜像提供了Tag为blue和green的镜像,根据部署应用的Tag修改为其相反的即可。

image.png

  • 等待发布完成

当完成以上部署后,等待灰度发布的自动完成。最终可以通过灰度发布的事件看到完成的发布过程。如下图

image.png

  • 完成发布以后,在控制台点击完成,或者使用API来删除本次的灰度发布。这个过程中,会回收由本次发布而创建的Deployment,Service,Ingress等资源。

通过以上步骤,就可以完成一次全自动化的基于Ingress的灰度发布。

  • 由于在灰度发布中,我们定义了相应的webhook。当灰度发布完成后,我们会收到相应的调用。在本次测试中,我们使用了https://pipedream.com/ 的一个webhook测试平台,我们可以从下图看到webhook正确接收到了我们的测试数据。

image.png

总结

在该示例中,我们主要是通过Flagger控制改变Ingress的注解的方式来完成自动化的灰度发布。同时配置对应的webhook,可以在应用发布完成后做相应的事情。例如进行集成测试等。

参考

Flagger
集群管理
灰度发布

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1天前
|
JSON 监控 调度
局域网管理软件的自动化任务调度:Python 中的 APScheduler 库的应用
使用 Python 的 APScheduler 库可简化局域网管理中的自动化任务调度。APScheduler 是一个轻量级定时任务调度库,支持多种触发方式如间隔、时间、日期和 Cron 表达式。示例代码展示了如何创建每 10 秒执行一次的定时任务。在局域网管理场景中,可以利用 APScheduler 定期监控设备状态,当设备离线时自动提交数据到网站,提升管理效率。
12 0
|
2天前
|
Kubernetes 应用服务中间件 nginx
Kubernetes详解(六)——Pod对象部署和应用
在Kubernetes系列中,本文聚焦Pod对象的部署和管理。首先,通过`kubectl run`命令创建Pod,如`kubectl run pod-test --image=nginx:1.12 --port=80 --replicas=1`。接着,使用`kubectl get deployment`或`kubectl get pods`查看Pod信息,添加`-o wide`参数获取详细详情。然后,利用Pod的IP地址进行访问。最后,用`kubectl delete pods [Pod名]`删除Pod,但因Controller控制器,删除后Pod可能自动重建。了解更多细节,请参阅原文链接。
9 5
|
4天前
|
Java 测试技术 持续交付
自动化测试框架选型与实战:深入探索与应用
【5月更文挑战第8天】本文探讨了自动化测试框架的选型与实战应用,强调了其在软件质量保障中的重要性。选型原则包括考虑项目需求、技术栈、可扩展性和可维护性,以及社区支持和文档。介绍了Selenium、Appium、JUnit和Pytest等常用框架,并概述了实战应用的步骤,包括明确需求、搭建环境、编写测试用例、执行测试、分析结果、维护代码和持续集成。合理选型与实践能提升测试效率,保障项目成功。
|
5天前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
|
5天前
|
JSON 前端开发 JavaScript
快照测试在前端自动化测试中的应用
在前端自动化测试中,快照测试常用于检验组件渲染与布局。
|
6天前
|
Kubernetes Cloud Native 持续交付
构建高效云原生应用:Kubernetes与微服务架构的融合
【5月更文挑战第6天】 在数字化转型的浪潮中,企业正迅速采纳云原生技术以实现敏捷性、可扩展性和弹性。本文深入探讨了如何利用Kubernetes这一领先的容器编排平台,结合微服务架构,构建和维护高效、可伸缩的云原生应用。通过分析现代软件设计原则和最佳实践,我们提出了一个综合指南,旨在帮助开发者和系统架构师优化云资源配置,提高部署流程的自动化水平,并确保系统的高可用性。
29 1
|
12天前
|
敏捷开发 测试技术 持续交付
探索自动化测试在敏捷开发中的应用移动应用的未来:跨平台开发与操作系统的融合
【4月更文挑战第30天】随着软件开发周期的不断缩短,传统的软件测试方法逐渐显得力不从心。本文将深入探讨自动化测试在敏捷开发环境中的关键作用,分析其如何提高测试效率、减少人力资源成本,并确保软件产品的质量与稳定性。通过案例分析,我们还将讨论实施自动化测试的最佳实践和面临的挑战,为追求高效敏捷开发的组织提供参考。
|
12天前
|
数据采集 机器学习/深度学习 人工智能
自动化测试中AI辅助技术的应用与挑战
【4月更文挑战第30天】随着人工智能(AI)技术的飞速发展,其在软件自动化测试领域的应用日益增多。本文探讨了AI辅助技术在自动化测试中的应用情况,包括智能化测试用例生成、测试执行监控、缺陷预测及测试结果分析等方面。同时,文章还分析了在融合AI技术时所面临的挑战,如数据质量要求、模型的透明度与解释性问题以及技术整合成本等,并提出了相应的解决策略。
|
12天前
|
前端开发 IDE 数据可视化
深入理解与应用自动化测试框架Selenium的最佳实践
【4月更文挑战第30天】 本文将深入剖析自动化测试框架Selenium的核心原理,并结合最佳实践案例,探讨如何有效提升测试覆盖率和效率。文中不仅涉及Selenium的架构解析,还将提供针对性的策略来优化测试脚本,确保测试流程的稳定性与可靠性。通过实例演示,读者可以掌握如何在不同测试场景中灵活运用Selenium,以及如何处理常见的技术挑战。
|
12天前
|
敏捷开发 监控 前端开发
深入理解与应用自动化测试框架:以Selenium为例
【4月更文挑战第30天】 在软件开发的快速迭代周期中,质量保证(QA)团队面临持续的压力,需确保产品在每次发布时都达到预期的质量标准。为了应对这一挑战,自动化测试成为了关键工具,它不仅提高了测试效率,还确保了测试的一致性和可重复性。本文将探讨自动化测试框架Selenium的核心组件、工作原理及其在实际测试中的应用。通过分析Selenium的优势和面临的常见问题,我们将讨论如何有效地集成Selenium到现有的测试流程中,以及如何克服常见的技术障碍。我们的目标是为读者提供一个清晰的指南,帮助他们理解和利用自动化测试框架来优化他们的软件测试实践。