如何在 Kubernetes 上设置 Argo 工作流程?

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【2月更文挑战第2天】

随着容器化技术的流行,Kubernetes成为了容器编排和管理的事实标准。而在Kubernetes上运行工作流程是一项关键的任务,Argo工作流程(Argo Workflows)为此提供了强大的解决方案。

Argo 工作流程基础

在开始之前,请确保你已经安装了Kubernetes集群,并且拥有kubectl命令行工具的访问权限。同时,我们还需要在Kubernetes集群中安装Argo工作流程的控制器。

1. 安装 Argo 工作流程控制器

首先,我们需要使用kubectl安装Argo工作流程控制器。执行以下命令:

kubectl create namespace argo
kubectl apply -n argo -f https://raw.githubusercontent.com/argoproj/argo-workflows/stable/manifests/install.yaml

这将在名为argo的命名空间中安装Argo工作流程控制器。确认控制器的Pod已经正常运行:

kubectl get pods -n argo

2. 创建第一个简单的工作流程

接下来,我们将创建一个简单的Argo工作流程以了解其基本结构。创建一个名为hello-world.yaml的文件,内容如下:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: hello-world-
spec:
  entrypoint: whalesay
  templates:
  - name: whalesay
    container:
      image: docker/whalesay
      command: [cowsay]
      args: ["Hello, Argo!"]

将工作流程提交到Kubernetes集群:

kubectl apply -n argo -f hello-world.yaml

等待工作流程完成,并查看结果:

argo list -n argo
argo logs -n argo <workflow-id>

Argo 工作流程的进阶使用

1. 参数传递和输出

Argo工作流程允许在不同步骤之间传递参数,并从工作流程中提取输出。下面是一个示例工作流程,演示如何传递参数和提取输出:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: params-example-
spec:
  entrypoint: parameters-example
  templates:
  - name: parameters-example
    inputs:
      parameters:
      - name: message
    steps:
    - - name: print-message
        template: whalesay
        arguments:
          parameters:
          - name: message
            value: "{
   
   {inputs.parameters.message}}"

  - name: whalesay
    container:
      image: docker/whalesay
      command: [cowsay]
      args: ["{
   
   {inputs.parameters.message}}"]

在这个例子中,我们定义了一个名为parameters-example的工作流程,并定义了一个输入参数message。在步骤中,我们将这个参数传递给名为whalesay的模板,并在模板中使用这个参数。

kubectl apply -n argo -f params-example.yaml

等待工作流程完成,并检查输出:

argo logs -n argo <workflow-id>

2. 并行执行

Argo工作流程支持并行执行多个步骤,这在处理大规模任务时非常有用。以下是一个并行执行的例子:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: parallel-example-
spec:
  entrypoint: parallel-example
  templates:
  - name: parallel-example
    steps:
    - - name: parallel-step
        template: whalesay
        arguments:
          parameters:
          - name: message
            value: "Step 1"
    - - name: parallel-step
        template: whalesay
        arguments:
          parameters:
          - name: message
            value: "Step 2"
    - - name: parallel-step
        template: whalesay
        arguments:
          parameters:
          - name: message
            value: "Step 3"

  - name: whalesay
    container:
      image: docker/whalesay
      command: [cowsay]
      args: ["{
   
   {inputs.parameters.message}}"]

在这个例子中,我们定义了一个名为parallel-example的工作流程,其中包含三个并行执行的步骤。这些步骤将分别输出"Step 1"、"Step 2"和"Step 3"。

kubectl apply -n argo -f parallel-example.yaml

等待工作流程完成,并检查输出:

argo logs -n argo <workflow-id>

3. 持久化存储

Argo工作流程支持在不同步骤之间共享数据,这通过使用持久化卷来实现。以下是一个使用持久化存储的例子:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: persistent-storage-example-
spec:
  entrypoint: persistent-storage-example
  templates:
  - name: persistent-storage-example
    steps:
    - - name: create-persistent-volume
        template: create-pv
        arguments:
          parameters:
          - name: message
            value: "Hello, Argo!"

    - - name: use-persistent-volume
        template: use-pv
        arguments:
          parameters:
          - name: message
            valueFrom:
              path: /mnt/workspace/output.txt

  - name: create-pv
    container:
      image: busybox
      command: [sh, -c]
      args: ["echo {
   
   {inputs.parameters.message}} > /mnt/workspace/output.txt"]

  - name: use-pv
    container:
      image: busybox
      command: [cat]
      args: ["/mnt/workspace/output.txt"]

在这个例子中,我们首先创建一个持久化卷,并将"Hello, Argo!"写入文件。然后,我们在另一个步骤中使用了这个持久化卷,读取文件内容并输出。

kubectl apply -n argo -f persistent-storage-example.yaml

等待工作流程完成,并检查输出:

argo logs -n argo <workflow-id>

Argo 工作流程在生产环境中的部署与管理

1. 安全性配置

在生产环境中,安全性是至关重要的一环。我们需要确保Argo工作流程的运行是安全的,并且只有授权的用户能够访问相关资源。

使用 Kubernetes 的 Role-Based Access Control(RBAC)来限制对Argo资源的访问。创建一个名为 argo-rbac.yaml 的文件,内容如下:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: argo-role
  namespace: argo
rules:
- apiGroups: [""]
  resources: ["workflows", "workflowtemplates"]
  verbs: ["get", "list", "watch", "create", "update", "delete"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: argo-role-binding
  namespace: argo
subjects:
- kind: ServiceAccount
  name: default
  namespace: argo
roleRef:
  kind: Role
  name: argo-role
  apiGroup: rbac.authorization.k8s.io

这将创建一个名为 argo-role 的角色,授予对工作流程和工作流程模板的访问权限。然后,通过角色绑定将该角色与默认的ServiceAccount绑定。

kubectl apply -n argo -f argo-rbac.yaml

在生产环境中,建议启用HTTPS来加密通信。可以通过在Argo工作流程控制器的参数中配置 --secure 选项来启用HTTPS。确保配置了相应的 TLS 证书。

2. 高可用性配置

为了确保Argo工作流程的高可用性,我们可以在多个节点上运行工作流程控制器。

将Argo工作流程控制器部署到多个节点,可以使用Kubernetes的Deployment对象。创建一个名为 argo-ha.yaml 的文件,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: argo-controller
  namespace: argo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: argo-controller
  template:
    metadata:
      labels:
        app: argo-controller
    spec:
      containers:
      - name: argo-controller
        image: argoproj/workflow-controller:v3.2.0 # 替换为实际的版本

这将创建一个名为 argo-controller 的 Deployment,其中包含3个副本。通过适当的标签选择器,确保Pods能够正确地被选中和负载均衡。

kubectl apply -n argo -f argo-ha.yaml

为了确保持久性和高可用性,可以考虑将Argo工作流程的数据库组件使用外部数据库。这可以是Kubernetes外的托管数据库服务,如Amazon RDS或Google Cloud SQL。

3. 监控与日志

在生产环境中,监控和日志记录对于追踪问题和性能调优至关重要。Argo工作流程提供了Prometheus指标和日志输出,我们可以集成它们到监控系统中。

Argo工作流程控制器会暴露Prometheus指标,我们可以使用Prometheus来收集这些指标。确保Prometheus已经在你的集群中安装并配置。

在Prometheus的配置中,添加以下作业配置:

- job_name: 'argo'
  kubernetes_sd_configs:
  - role: endpoints
  relabel_configs:
  - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_pod_name]
    action: keep
    regex: argo
  - source_labels: [__meta_kubernetes_namespace]
    action: replace
    target_label: kubernetes_namespace
  - source_labels: [__meta_kubernetes_pod_name]
    action: replace
    target_label: kubernetes_pod_name

Argo工作流程的日志可以通过kubectl或argo命令行工具来获取,但在生产环境中可能需要更为强大的日志聚合和检索系统,例如ELK Stack(Elasticsearch, Logstash, Kibana)。

集成Argo工作流程的日志到ELK Stack中,可以使用Fluentd或Filebeat来将日志数据转发到Elasticsearch。

Argo 工作流程的高级特性和最佳实践

1. 动态参数化

动态参数化允许我们在运行时根据条件来选择参数值。这对于处理不同环境、不同数据源或根据上一步骤的输出动态生成参数等情况非常有用。以下是一个动态参数化的示例:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: dynamic-params-example-
spec:
  entrypoint: dynamic-params-example
  templates:
  - name: dynamic-params-example
    inputs:
      parameters:
      - name: environment
        value: "dev"
    steps:
    - - name: select-param-value
        template: select-param
        arguments:
          parameters:
          - name: environment
            value: "{
   
   {inputs.parameters.environment}}"

  - name: select-param
    inputs:
      parameters:
      - name: environment
    outputs:
      parameters:
      - name: paramValue
        value: "{
   
   {if eq (inputs.parameters.environment) 'dev' }}dev-value{
   
   { else }}prod-value{
   
   { end }}"
    script:
      image: alpine
      command: [sh]
      source: |
      echo "paramValue={
   
   {outputs.parameters.paramValue}}"

在这个例子中,我们根据输入的environment参数的值,在 select-param 步骤中动态选择参数值。

kubectl apply -n argo -f dynamic-params-example.yaml

2. 外部依赖与初始化容器

在一些场景中,工作流程可能需要依赖外部系统或服务。Argo工作流程允许通过初始化容器(initContainer)来满足这些外部依赖。以下是一个使用初始化容器的示例:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: init-container-example-
spec:
  entrypoint: init-container-example
  templates:
  - name: init-container-example
    initContainers:
    - name: init-setup
      image: busybox
      command: ['sh', '-c', 'echo "Initialize external dependencies"']
    container:
      image: alpine
      command: ['sh']
      source: |
        echo "Running the main container"

在这个例子中,init-setup 初始化容器用于初始化外部依赖,然后主容器运行实际的工作负载。

kubectl apply -n argo -f init-container-example.yaml

3. 子工作流程与循环

Argo工作流程允许我们使用子工作流程来组织和复用工作流程的组件。同时,循环结构也是一种强大的工具,用于处理需要重复执行的任务。以下是一个子工作流程和循环的示例:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: subworkflow-loop-example-
spec:
  entrypoint: subworkflow-loop-example
  templates:
  - name: subworkflow-loop-example
    steps:
    - - name: loop
        withItems:
        - "item-1"
        - "item-2"
        template: subworkflow
        arguments:
          parameters:
          - name: item
            value: "{
   
   {item}}"

  - name: subworkflow
    inputs:
      parameters:
      - name: item
    steps:
    - - name: print-item
        template: whalesay
        arguments:
          parameters:
          - name: message
            value: "{
   
   {inputs.parameters.item}}"

  - name: whalesay
    container:
      image: docker/whalesay
      command: [cowsay]
      args: ["{
   
   {inputs.parameters.message}}"]

在这个例子中,subworkflow-loop-example 工作流程包含一个循环结构,遍历两个项目并调用 subworkflow 子工作流程。

kubectl apply -n argo -f subworkflow-loop-example.yaml
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
6月前
|
Prometheus Kubernetes 监控
容器服务ACK常见问题之pod设置securityContext调整参数失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
1月前
|
存储 Kubernetes 监控
Kubernetes设置
【10月更文挑战第3天】Kubernetes设置
|
3月前
|
存储 Kubernetes 监控
在K8S中,发布应用流程是什么?
在K8S中,发布应用流程是什么?
|
8天前
|
弹性计算 Kubernetes Perl
k8s 设置pod 的cpu 和内存
在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
|
17天前
|
存储 Kubernetes 监控
|
7天前
|
Kubernetes 监控 Java
如何设置 Kubernetes的垃圾回收策略为定期
如何设置 Kubernetes的垃圾回收策略为定期
|
4月前
|
Prometheus Kubernetes Cloud Native
云原生周刊:Argo Rollouts 支持 Kubernetes Gateway API 1.0 | 2024.7.1
探索开源世界:Kubetools的推荐系统[Krs](https://github.com/kubetoolsca/krs)助力K8s优化,追踪K8s组件清单,指引IAC集成。阅读建议: Prometheus与Thanos的进化故事,Adidas容器平台管理经验,K8s请求实现详解。关注云原生:Argo Rollouts支持Gateway API 1.0,Kubewarden v1.14强化策略与镜像安全。
|
2月前
|
存储 Kubernetes 监控
|
3月前
|
Kubernetes Java 开发工具
Kubernetes部署项目流程(新手上线新版本服务整个流程)
【8月更文挑战第1天】Kubernetes(k8s)新手上线新版本服务整个流程
|
3月前
|
存储 Kubernetes API
在K8S中,陈述⼀下创建Pod的流程?
在K8S中,陈述⼀下创建Pod的流程?