9e4f05c1b76a4fe3b41211ec94f5ba70.png

Applatix的Argo是一个开源项目,为Kubernetes提供了云原生工作流,将工作流中的每个步骤实现为容器。 Argo使用户能够使用类似于传统YAML的自定义DSL启动多步管道。该框架提供了复杂的循环,条件,与DAG的依赖关系管理等,这有助于提高部署应用程序堆栈时的灵活性以及配置和依赖关系的灵活性。使用Argo,用户可以定义依赖项,以编程方式构造复杂的工作流程,用于将任何步骤的输出链接为后续步骤的输入的工件管理,并在易于阅读的UI中监视计划的作业。

Argo V2被实现为Kubernetes CRD(自定义资源)。因此,可以使用kubectl管理Argo工作流程,并与其他Kubernetes服务(例如卷,Secret和RBAC)原生集成。新的Argo软件轻巧,可在一分钟内安装,但提供完整的工作流程功能,包括参数替换,工件,混合,循环和递归工作流程。

Argo中的工作流程自动化由YAML模板(易于采用,因为Kubernetes主要使用相同的DSL)驱动,使用ADSL(Argo域特定语言)设计的。使用ADSL提供的每条指令都被视为一段代码,并与应用程序代码一起托管在SCM(源代码管理)中。 Argo提供/支持6种不同的YAML构造:

  • 容器模板:根据需要创建单个容器和参数
  • 工作流程模板:定义作业,即short-running-app,工作流中的一个步骤可以是容器
  • 策略模板:用于触发/调用作业或通知的规则
  • 部署模板:创建长期运行的应用程序
  • 装置模板:在Argo之外粘贴第三方资源
  • 项目模板:工作流定义可在Argo目录中访问

Argo支持几种不同的方式来定义Kubernetes清单:Ksonnet应用程序,Helm图表和YAML / json清单的简单目录。

Argo 工作流模板

下面的模板是一个简单的模板,其中定义了工作流以创建具有两个容器的Pod,其中一个容器装有curl(仅带有curl的基于alpine的镜像),另一个是Nginx Sidecar容器(Sidecar作为第二进程与服务一起运行)并提供“平台基础架构功能”。在这里curl是一个“主”容器,它轮询nginxSidecar容器,直到准备好处理请求为止。

9abf5e88233d0dcee4dc163a9d6dbecc.png
Argo Configuration/Workflow Template

以上工作流程中的事件:

e3fb0a60b6f59613d060b5fb5f96298e.png
Detailed Events in the Workflow above

45eb0a35cb7b1968448ec66d64815bdf.png
Nginx Sidecar performing CURL operations


如上所示,工作流创建了一个容器并执行规范中定义的配置,并杀死容器状态标记为已完成的容器。

9f45eb482eb683423562b16ccd6eb231.png
Sample Workflow Lifecycle

Argo仪表板视图:

c9653b01f317c8bcb71de283059a6e75.png
Argo Dashboard Workflow Execution View

有条件的工作流程模板

Argo支持工作流程执行中的条件模式。 argo提供的Coinflip示例描述了如何在模板中使用“when”,其中执行取决于从父级收到的输出。

17b04f367ed0ea1f0209b1ab7b365026.png
Coin Flip Example

50bdf5d3494c9af86ee44c3551148fd3.png
Coin Flip Workflow Configuration


上方的工作流程会运行一个随机整数脚本,其常量为0 =正面和1 =尾数,其中特定模板(正面或反面)的调用取决于“翻转硬币”任务的输出,如上面的工作流图中所示,投币任务产生的heads只执行heads模板。

feb739823d418ccbd26563b01328f5dd.png
Argo CLI Querying Workflow

上面的工作流创建了两个容器,一个用于执行randomint python脚本,另一个用于根据脚本的结果执行heads模板。如下所示,根据来自randomint脚本的结果(result == heads)执行heads模板。

63c003ef4fa63291ca2299ce70419887.png
Coin Flip Workflow Execution

类似地,可以将递归(递归调用模板)添加到条件规范中。例如,下面的模板输出显示翻转硬币模板被执行了n次,直到结果为正面。

2f094eaa86b00c3068443f7fad879a8f.png
Coin Flip =Recursion

迭代和参数化的工作流引擎模板

Argo有助于迭代工作流模板中的一组输入,并且用户可以提供参数(例如:输入参数)。在以下工作流程中,使用两个输入参数“ hello kubernetes”和“ hello argo”执行Whalesay模板。

d5760a6a0beaf2a5df867745317fcd7f.png
Looping and Parameter based Workflow Configuration

b77292464dfac119504781ba94ed9494.png
Argo CLI Querying Loops

0eebfb15f7548703812b041793839bb5.png
Workflow — Loop Configuration

上面的模板包含一个模板,该模板将使用项目列表并根据提供的参数值的数量运行任务。因此,这将创建两个Pod,一个执行工作流消费参数“ hello kubernetes”,另一个使用“ hello argo”,如下所示:

5992d73ea01c76879c0018aaaf3261f4.png
Workflow Execution with Looping Configuration

同样复杂的循环:支持迭代一组项目,动态生成项目列表。

具有由DAG(有向无环图)和步骤定义的依赖关系的多步骤工作流模板

Argo允许用户使用简单的Python对象DAG(有向无环图)启动多步管道,还可以方便地在工作流程规范(嵌套工作流程)中定义多个模板:

2c76ac26f56c5b2f251aac101376941d.png
DAG Workflow Execution Pattern

871bc68f8ebeba416507110bc7449303.png
DAG Dependency based Workflow Configuration

11c0caadd3fbd78f140bf4d17a29a1b4.png
DAG Execution

类似地,步骤可用于定义多步骤工作流,以下示例包括两个模板hello-hello-hello和whalesay(嵌套工作流)。

使用步骤的多步骤工作流程:

d95c581fd2c07c5b228de89153038be8.png
Sequencing based on configration

5e520fdc114ff402feaf1eb5a8c21c96.png
Template Configuration

在此,根据步骤控制流程,并根据破折号定义运行格式。

Minio的工件管理和Argo的集成

工件是任何工作流程(例如CI-CD)的组成部分,工作流程中的步骤会生成工件,然后其他后续步骤将消耗这些工件。


这里使用的工件存储库是Minio:具有Amazon S3兼容API的开源对象存储服务器。

a97ed8447614756554a49f9fef65b342.png
Artifactory Management

28cf3452208b6403745522db74ecfd11.png
Artifactory Management Configuration

上面的工作流程包括两个步骤:1.生成工件:使用whalesay模板生成工件;以及2.消费工件:使用在步骤1中创建的工件并打印消息。根据配置中的定义,两个任务都按顺序运行。第一步中生成的工件存储在Minio中,可以通过在工作流配置映射中提供以下配置,将工件存储库与Argo集成。

6048612635091a87bd66dc4b650a91b2.png
WorkFlow Configuration for Artifactory Management

93fa2244db81de7643d1c79ea02ede9c.png
Minio

上面创建的工件存储在My-bucket的Minio中。消费工件任务将根据提供的配置拉出工件。 Minio类似于S3,并提供了一个共享链接来使用工件,如下所示。

c032e45e13ac5b336d63d9c017ffea3e.png
Minio-Bucket View

119b0f0be134a95ffe2c176a47e09b4e.png
Minio Artifact List

使用Argo部署具有长期运行的应用程序(部署和服务)的完整应用程序栈(应用程序,数据库,监视,日志和跟踪)

如上所示,Argo支持各种可用于部署简化的工作流的结构,以使用定义明确的规则集创建复杂的应用程序堆栈。在下面的示例中,部署了完整的Web应用程序(示例袜子商店应用程序),并带有日志记录(使用Elastic Search,Kibana和FluentD),监视(Prometheus和Grafana),跟踪(Zipkin)。

Argo可以使用传统的基于YAML的文件使用各种Kubernetes配置(部署,服务,群集角色等)。在此示例中,工作流程目录包含所有基于Argo的工作流程配置,这些配置使用Kubernetes-spec目录中的Kubernetes对象配置。

  • Kubernetes Spec目录内容:

如下所示,应用程序栈配置分为日志,监视,数据库(shock-shop-db),应用程序(sock-shop)和zipkin(跟踪),它们是单独的子目录,分别构成特定于服务的部署,服务,configmap,集群-roles等(基本上是部署应用程序所需的所有Kubernetes配置)。例如,Zipkin包含:Mysql部署,Mysql服务,Zipkin部署,Zipkin服务。

kubernetes-spec
├── logging
│   ├── elasticsearch.yml
│   ├── fluentd-crb.yml
│   ├── fluentd-daemon.yml
│   ├── fluentd-sa.yaml
│   └── kibana.yml
├── logging-cr
│   └── fluentd-cr.yml
├── monitoring
│   ├── grafana-dep.yaml
│   ├── grafana-svc.yaml
│   ├── prometheus-alertrules.yaml
│   ├── prometheus-configmap.yaml
│   ├── prometheus-crb.yml
│   ├── prometheus-dep.yaml
│   ├── prometheus-exporter-disk-usage-ds.yaml
│   ├── prometheus-exporter-kube-state-dep.yaml
│   ├── prometheus-exporter-kube-state-svc.yaml
│   ├── prometheus-sa.yml
│   └── prometheus-svc.yaml
├── monitoring-cfg
│   ├── grafana-configmap.yaml
│   └── grafana-import-dash-batch.yaml
├── monitoring-cr
│   └── prometheus-cr.yml
├── sock-shop-db
│   ├── carts-db-dep.yaml
│   ├── carts-db-svc.yaml
│   ├── catalogue-db-dep.yaml
│   ├── catalogue-db-svc.yaml
│   ├── orders-db-dep.yaml
│   ├── orders-db-svc.yaml
│   ├── session-db-dep.yaml
│   ├── session-db-svc.yaml
│   ├── user-db-dep.yaml
│   └── user-db-svc.yaml
├── sock-shop-persist-db
│   ├── carts-db-ss.yaml
│   ├── carts-db-svc.yaml
│   ├── catalogue-db-dep.yaml
│   ├── catalogue-db-svc.yaml
│   ├── orders-db-ss.yaml
│   ├── orders-db-svc.yaml
│   ├── session-db-dep.yaml
│   ├── session-db-svc.yaml
│   ├── user-db-ss.yaml
│   └── user-db-svc.yaml
├── sock-shop-usvc
│   ├── carts-dep.yaml
│   ├── carts-svc.yml
│   ├── front-end-dep.yaml
│   ├── front-end-svc.yaml
│   ├── orders-dep.yaml
│   ├── orders-svc.yaml
│   ├── queue-master-dep.yaml
│   ├── queue-master-svc.yaml
│   ├── rabbitmq-dep.yaml
│   ├── rabbitmq-svc.yaml
│   ├── shipping-dep.yaml
│   └── shipping-svc.yaml
├── sock-shop-zipkin-usvc
│   ├── catalogue-dep.yaml
│   ├── catalogue-svc.yaml
│   ├── payment-dep.yaml
│   ├── payment-svc.yaml
│   ├── user-dep.yaml
│   └── user-svc.yaml
└── zipkin
    ├── zipkin-cron-dep.yml
    ├── zipkin-dep.yaml
    ├── zipkin-mysql-dep.yaml
    ├── zipkin-mysql-svc.yaml
    └── zipkin-svc.yaml
10 directories, 63 files
  • 工作流目录内容:

工作流程目录包含所有基于Argo的工作流程配置,这些配置使用上面的Kubernetes规范文件。

workflows/
├── logging-workflow.yaml
├── monitoring-workflow.yaml
├── sock-shop-persist-workflow.yaml
└── sock-shop-workflow.yaml
0 directories, 4 files

查看上面的日志记录工作流示例:

a5f6d2108b7dc6dcc778484089e3c352.png
Logging Workflow Configuration

同样,所有特定的工作流程都使用特定的Kubernetes资源来无缝部署应用程序,如下面的工作流程所示。

  • 日志

bd45115b1cbb33ab5187981f454adf4d.png
Logging WorkFlow

708ed78e07b4e51ad6372d4c9c9afa13.png
Argo CLI querying Logging WorkFlow

如上所示,日志记录工作流创建ElasticSearch:部署和服务,Kibana:部署和服务,Fluentd:服务帐户,守护程序。

  • 监控

49e33c24fc5065e43ec163c23571efd6.png
Monitoring WorkFlow

e7cc3f084f2908d6f744cef37a828319.png
Argo CLI querying Monitoring WorkFlow

如上所示,监视工作流为正在运行的Prometheus和Grafana堆栈创建所需的资源。

c31674860ff7bc6ea9923b262304681b.png
Kubernetes Resources deployed by Argo WorkFlow engine
  • Sock-Shop

e2053791fbc0cda7718c0487d7302749.png
Sock-Shop WorFlow Execution

如上所示,此工作流构成了多应用程序/模板工作流,其中Zipkin与具有依赖要求的袜子商店一起部署。

169c83f9ebe909301315775803097bc3.png
Sock-Shop Argo WorkFlow Execution

73da82edc2ca39f8fe062d7fe2309d5a.png
Sock-Shop deployed on Kubernetes

be21858313a4ff1a18c4f6ab22cec2eb.png
Application Tracing Components

有了这个完整的应用程序,就可以在线进行日志记录,监视和跟踪。将根据提供的配置创建所有必需的服务。

8572024364d57de46d5633926576fccc.png
Kubernetes Services for the Components created above

通过将工作流引擎的丰富功能集与原生工件管理,准入控制,“fixtures”,对DinD(Docker-in-Docker)的内置支持和策略相结合,Argo在诸如传统CI之类的场景中具有极其重要的意义。 CD管道,具有顺序和并行步骤以及相关性的复杂作业,根据策略体系结构协调分布式应用程序的部署并触发基于时间/事件的工作流。

PS: 本文属于翻译,原文

更多推荐