用Argo滚动的渐进式交付。蓝绿色的部署

557 阅读9分钟

DZone>DevOps Zone>使用Argo滚动的渐进式交付。蓝绿色的部署

使用Argo的渐进式交付。蓝绿部署

在这篇深入的文章中,我们讨论了如何使用Argo Rollouts执行蓝绿部署--一种渐进式交付的形式。

Ninad Desai user avatar 通过

倪纳德-德赛

-

22年6月27日 - DevOps Zone -教程

喜欢 (1)

评论

保存

鸣叫

58次浏览

加入DZone社区,获得完整的会员体验。

免费加入

持续集成(CI)和持续交付(CD)在现代软件开发中已被广泛采用,使企业能够快速将这些软件部署到客户手中。但以正确的方式进行同样重要,因为在某些情况下,未完成的代码会导致故障,客户不得不面对停机。为了解决这个问题,渐进式交付被引入,它能够在适当的时间向适当数量的客户交付具有适当变化的软件。更准确地说,它控制了一个软件的变化部署速度。

传统的CI/CD和渐进式交付

持续集成(CI)是一个自动化过程,有助于持续集成软件开发的变化。它使源代码的构建、测试和验证自动化。它的目标是最终产生一个可供部署的打包工件。

持续交付(CD)有助于将软件变化部署给用户。它需要CI来产生一个可以部署给用户的工件。

但是持续交付带来了许多挑战,例如处理快速交付的变化和管理高风险的故障,以确保正常运行时间和高效的软件性能。为了解决持续交付的上述问题,渐进式交付与不同的部署策略(如蓝绿部署和金丝雀部署)一起开始发挥作用。

渐进式交付比持续交付领先一步。它通过减少失败的风险,以可控的方式交付软件更新。它是通过首先将新的软件变化暴露给较小的用户组来实现的。然后,通过观察和分析正确的行为,再将其逐步暴露给更多的用户。众所周知,它的动作很快,但控制力更强。

默认的 "RollingUpdate "Kubernetes部署策略的挑战

Kubernetes带有一个默认的RollingUpdate 部署策略。目前,它有以下一系列的限制。

  • 对推广速度的控制较少
  • 无法控制流向新版本的流量
  • 不能使用准备度探针进行更深入的、压力或一次性的检查
  • 你不能查询外部指标来验证一个更新
  • 你可以停止进展,但不能自动中止和回滚更新

Argo项目

Argo是一个由许多开源项目组成的小组,通过扩展Kubernetes的功能,帮助快速安全地交付软件。

  • Argo工作流。容器原生工作流引擎
  • Argo CD。声明式GitOps持续交付
  • Argo Events。基于事件的依赖性管理
  • Argo Rollouts。渐进式交付,支持金丝雀和蓝绿部署策略
  • Argoproj-labs。单独的GitHub组织,为与Argoproj生态系统相关的社区贡献而设置。

为了克服原生Kubernetes部署策略的局限性,Argo Rollouts已经被引入。它包含一组不同的项目,详见下文。

什么是Argo Rollouts?

Argo Rollouts是一个Kubernetes控制器和一套CRD,它提供了渐进式的交付功能,以及蓝绿、金丝雀和金丝雀分析等高级部署。它有可能通过入口控制器和服务网格来控制和转移流量到较新版本的软件。

下表显示了默认Kubernetes部署策略与Argo Rollouts的能力比较分析。

Argo Rollouts是如何工作的?

Argo Rollouts控制器帮助寻找和检测某种资源。在集群中管理复制集的Rollout,就像Kubernetes部署一样。它为老版本的软件创建一个稳定的复制集,为新版本的软件创建一个金丝雀复制集。

源。 Argo-Rollout-Architecture

AnalysisTemplate ,通过AnalysisRun 组件帮助做复制集的分析。它们一起帮助观察新部署的版本的工作情况。相应地,它可以自动推出到一个较新的版本或回滚。为此,可以使用任何度量工具,如 普罗米修斯, Kubernetes作业,等等。

实验/实践Argo的推广与蓝绿部署

如果你没有现成的K8s集群来做进一步的实验,那么我们建议尝试本文中基于CloudYuga平台的版本。否则,你可以建立自己的kind本地集群,同时部署nginx控制器,并按照下面的命令对你的kind集群执行。

克隆Argo Rollouts例子的GitHub repo,或者最好是请分叉这个。

git clone https://github.com/NiniiGit/argo-rollouts-example.git

Argo Rollouts控制器的安装

创建命名空间来安装Argo Rollouts控制器。

kubectl create namespace argo-rollouts

你会看到命名空间已经被创建。

kubectl get ns argo-rollouts

我们将使用最新的版本来安装Argo Rollouts控制器。

kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml

你会看到控制器和其他组件已经被部署。等待pods处于Running 状态。

kubectl get all -n argo-rollouts

curl 安装Argo Rollouts Kubectl插件,以方便与Rollout控制器和资源互动。

curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64
chmod +x ./kubectl-argo-rollouts-linux-amd64
sudo mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts
kubectl argo rollouts version

Argo Rollouts也有自己的GUI,你可以用下面的命令访问。

kubectl argo rollouts dashboard

现在你可以通过访问浏览器上的http://localhost:3100 来访问Argo Rollout控制台。你将会看到一个如下所示的用户界面(目前,它不会显示任何东西,因为我们还没有部署任何基于Argo Rollouts的应用程序)。

现在,让我们继续前进,使用蓝绿部署策略部署我们的第一个样本应用程序。

使用Argo Rollouts的蓝绿部署

为了体验蓝绿部署如何与Argo Rollouts一起工作,我们将部署包含Rollouts、Service和Ingress的Kubernetes对象的示例应用。

rollout.yaml 内容。

# This example demonstrates a Rollout using the blue-green update strategy, which contains a manual
# gate before promoting the new stack.
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: rollout-bluegreen
spec:
  replicas: 2
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: rollout-bluegreen
  template:
    metadata:
      labels:
        app: rollout-bluegreen
    spec:
      containers:
      - name: rollouts-demo
        image: argoproj/rollouts-demo:blue
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
  strategy:
    blueGreen: 
      # activeService specifies the service to update with the new template hash at time of promotion.
      # This field is mandatory for the blueGreen update strategy.
      activeService: rollout-bluegreen-active
      # previewService specifies the service to update with the new template hash before promotion.
      # This allows the preview stack to be reachable without serving production traffic.
      # This field is optional.
      previewService: rollout-bluegreen-preview
      # autoPromotionEnabled disables automated promotion of the new stack by pausing the rollout
      # immediately before the promotion. If omitted, the default behavior is to promote the new
      # stack as soon as the ReplicaSet are completely ready/available.
      # Rollouts can be resumed using: `kubectl argo rollouts promote ROLLOUT`
      autoPromotionEnabled: false

service.yaml 内容。

kind: Service
apiVersion: v1
metadata:
  name: rollout-bluegreen-active
spec:
  selector:
    app: rollout-bluegreen
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

---
kind: Service
apiVersion: v1
metadata:
  name: rollout-bluegreen-preview
spec:
  selector:
    app: rollout-bluegreen
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

ingress.yaml content:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rollout-bluegreen
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: rollout-bluegreen-active
            port:
              number: 80

现在,让我们暂时在默认命名空间中创建所有这些对象。请执行下面的命令。

kubectl apply -f argo-rollouts-example/blue-green-deployment-example/

通过运行下面的命令,你将能够看到在default 命名空间中创建的所有对象。

kubectl get all

现在,你可以通过访问浏览器上的http://localhost:80 来访问你的示例应用程序。
你将能够看到如下所示的应用程序。

现在,再次访问Argo-Rollouts控制台。这一次,你可以在Argo Rollouts控制台看到部署的样本,如下图。

你可以在控制台中点击这个rollout-bluegreen ,它将向你展示它的当前状态,如下图。

今后,你可以使用这个GUI,或者(最好)使用下面的命令来继续这个演示。

你也可以通过运行下面的命令来查看这个推广的当前状态。

kubectl argo rollouts get rollout rollout-bluegreen

现在,让我们通过命令行部署绿色版本的应用程序。

kubectl argo rollouts set image rollout-bluegreen rollouts-demo=argoproj/rollouts-demo:green

你将能够看到新的,即基于green 版本的我们的样本应用程序的pods集。

kubectl get pods

现在,几秒钟后,你将能够看到你的旧的pod集(版本为蓝色)以及新的pod集(版本为绿色)都可用。同时,在Argo控制台,你将能够看到新的应用程序的修订版,并运行改变后的图像版本,如下所示。

如果你在浏览器上访问http://localhost:80,你仍然会看到只有蓝色版本是可见的--正确的,因为我们还没有完全推广绿色版本的应用程序。你现在可以通过运行下面的命令来确认这一点,这表明新版本处于暂停状态。

kubectl argo rollouts get rollout rollout-bluegreen

现在,让我们通过执行下面的命令来推广我们的应用程序的绿色版本。

kubectl argo rollouts promote rollout-bluegreen

运行下面的命令,你会看到它正在完全扩展我们的应用程序的新版本,即绿色版本。

kubectl argo rollouts get rollout rollout-bluegreen

同样可以通过运行下面的命令来确认,它显示了旧的pods集,即我们的应用程序的旧的蓝色版本,正在终止或已经终止了。

kubectl get pods

如果你在浏览器上访问应用程序的URL http://localhost:80,你会看到现在只有绿色版本是可见的,因为我们已经完全推广了我们的应用程序的绿色版本。

祝贺你!你已经成功地完成了一个蓝-绿版本。你已经成功地使用Argo Rollouts完成了蓝绿色的部署。

你可以使用下面的命令删除整个设置,即我们部署的样本应用程序。

kubectl delete -f argo-rollouts-example/blue-green-deployment-example/

总结

在这篇文章中,我们讨论了渐进式交付是什么以及它的特点。我们还了解了Argo Rollouts的自定义控制器,以及它如何帮助实现蓝绿部署,这最终是一种渐进式交付的形式。

我希望你觉得这篇文章内容丰富,引人入胜。

下一步是什么?现在我们已经对渐进式交付有了一定的了解,并创建了一个蓝绿色的部署,接下来就是使用Argo Rollouts尝试金丝雀部署

Kubernetes 软件开发 应用 交付(商业)

经Ninad Desai许可发表于DZone。请看原文。

DZone贡献者所表达的观点属于他们自己。

DZone上的热门文章


评论

DevOps 合作伙伴资源