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

简介: 【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
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
2月前
|
Prometheus Kubernetes 监控
容器服务ACK常见问题之pod设置securityContext调整参数失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
7月前
|
Kubernetes Cloud Native 数据可视化
【云原生】Rancher部署k8s集群流程—2023.03
【云原生】Rancher部署k8s集群流程—2023.03
235 0
|
8月前
|
Kubernetes 监控 调度
在 Kubernetes 中应该如何设置 CPU 的 requests 和 limits
在 Kubernetes 中应该如何设置 CPU 的 requests 和 limits
98 0
|
8月前
|
存储 Kubernetes 调度
容器技术基础-Kubernetes 流程及场景
容器技术基础-Kubernetes 流程及场景
97 0
容器技术基础-Kubernetes 流程及场景
|
9月前
|
Kubernetes 应用服务中间件 调度
k8s--pod 基本配置、镜像拉取策略、启动命令、端口设置、资源配额
k8s--pod 基本配置、镜像拉取策略、启动命令、端口设置、资源配额
k8s--pod 基本配置、镜像拉取策略、启动命令、端口设置、资源配额
|
5月前
|
机器学习/深度学习 运维 安全
阿里云 ACK One Serverless Argo 助力深势科技构建高效任务平台
阿里云 ACK One Serverless Argo 助力深势科技构建高效任务平台
101180 8
|
5月前
|
Kubernetes Docker 容器
k8s学习-CKS真题-Runtime设置gVisor
k8s学习-CKS真题-Runtime设置gVisor
42 0
|
6月前
|
Kubernetes 调度 容器
二进制 k8s 集群下线 worker 组件流程分析和实践
二进制 k8s 集群下线 worker 组件流程分析和实践
63 0
|
6月前
|
JSON Kubernetes 应用服务中间件
二进制 k8s 集群下线 master 组件流程分析和实践
二进制 k8s 集群下线 master 组件流程分析和实践
77 0
|
7月前
|
Kubernetes 算法 调度

推荐镜像

更多