Construindo Pipelines com ArgoWorkflow: Conceitos de Workflow e Template

O ArgoWorkflow trabalha com três conceitos principais:

  • Workflow: Instância real de um pipeline em execução, semelhante ao PipelineRun no Tekton
  • WorkflowTemplate: Modelo de pipeline que pode ser usado para criar Workflows, análogo ao Pipeline no Tekton
  • ClusterWorkflowTemplate: Modelo de pipeline com escopo de cluster, similar à relação entre Role e ClusterRole no Kubernetes
  • templates: Unidade mínima de um Workflow ou WorkflowTemplate, representando uma etapa específica do pipeline

A relação entre esses elementos pode ser compreendida da seguinte forma:

  • template: Unidade básica que compõe um Template, representando uma etapa específica
  • Template: Pipeline completo geralmente composto por múltiplos templates
  • Workflow: Instância em execução de um pipeline, geralmente criado a partir de um Template
  1. Workflow

O Workflow é o recurso mais importante no ArgoWorkflow, responsável por:

  • Definir a estrutura do fluxo de trabalho
  • Armazenar o estado da execução

Estrutura Básica

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: fluxo-
spec:
  entrypoint: principal
  templates:
  - name: principal
    steps:
    - - name: passo-inicial
        template: saudacao
        arguments:
          parameters: [{name: mensagem, value: "olá mundo"}]
  - name: saudacao
    inputs:
      parameters:
      - name: mensagem
    container:
      image: docker/whalesay
      command: [cowsay]
      args: ["{{inputs.parameters.mensagem}}"]

Componentes Principais

  • entrypoint: Ponto de entrada do fluxo, similar ao método main em programas
  • templates: Lista de templates que compõem o pipeline

Tipos de Templates

O ArgoWorkflow suporta seis tipos de templates:

Container

- name: executar-tarefa
  container:
    image: nginx:latest
    command: [nginx, -g, "daemon off;"]
    ports:
    - containerPort: 80

Script

- name: gerar-numero
  script:
    image: python:3.8
    command: [python]
    source: |
      import random
      numero = random.randint(1, 1000)
      print(f"Número gerado: {numero}")

Resource

- name: criar-recursos
  resource:
    action: create
    manifest: |
      apiVersion: v1
      kind: ConfigMap
      metadata:
        generateName: config-
      data:
        chave: valor

Suspend

- name: pausar-execucao
  suspend:
    duration: "30s"

Steps

- name: etapas-paralelas
  steps:
  - - name: passo1
      template: prepara-dados
  - - name: passo2a
      template: processa-primeira-parte
    - name: passo2b
      template: processa-segunda-parte

DAG (Directed Acyclic Graph)

- name: fluxo-dependencias
  dag:
    tasks:
    - name: tarefaA
      template: processa-inicial
    - name: tarefaB
      dependencies: [tarefaA]
      template: processa-intermediario
    - name: tarefaC
      dependencies: [tarefaA]
      template: processa-alternativo
    - name: tarefaD
      dependencies: [tarefaB, tarefaC]
      template: processa-final

Classificação de Templates

Os templates podem ser diivdidos em duas categorias:

  • Template Definitions: Definem o conteúdo de cada etapa (container, script, resource, suspend)
  • Template Invocators: Combinam outros templates controlando a ordem de execução (steps, dag)

Parâmetros

Os parâmetros no Workflow podem ser:

  • Parâmetros formais: Definidos através do campo inputs em templates
  • Parâmetros reais: Definidos através do campo arguments em templates invocadores

Exemplo com Parâmetros

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: exemplo-parametros-
spec:
  entrypoint: principal
  arguments:
    parameters:
    - name: mensagem-global
      value: "mensagem padrão"
  templates:
  - name: principal
    steps:
    - - name: passo1
        template: processa-mensagem
        arguments:
          parameters:
          - name: texto
            value: "{{workflow.parameters.mensagem-global}}"
  - name: processa-mensagem
    inputs:
      parameters:
      - name: texto
        value: "valor padrão"
    container:
      image: alpine
      command: [/bin/sh, -c]
      args: ["echo {{inputs.parameters.texto}}"]

  1. WorkflowTemplate

O WorkflowTemplate é uma definição de Workflow que reside no cluster, permitindo:

  • Reutilização de templates entre diferentes Workflows
  • Manutenção centralizada das definições
  • Separação entre lógica de negócio e configuração

Exemplo de WorkflowTemplate

apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: modelo-processamento
  namespace: default
spec:
  workflowMetadata:
    labels:
      app: processamento-dados
  entrypoint: fluxo-principal
  arguments:
    parameters:
      - name: entrada
        value: "padrao"
  templates:
    - name: fluxo-principal
      steps:
      - - name: iniciar
          template: prepara-ambiente
      - - name: processar
          template: executa-processamento
          arguments:
            parameters:
            - name: arquivo
              value: "{{workflow.parameters.entrada}}"
    - name: prepara-ambiente
      container:
        image: busybox
        command: [sh, -c]
        args: ["echo 'Preparando ambiente...'"]
    - name: executa-processamento
      inputs:
        parameters:
        - name: arquivo
      container:
        image: python:3.9
        command: [python, -c]
        args: ["print(f'Processando: {{inputs.parameters.arquivo}}')"]

  1. Referenciando Templates

workflowTemplateRef

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: usando-modelo-
spec:
  arguments:
    parameters:
      - name: entrada
        value: "dados-especificos"
  workflowTemplateRef:
    name: modelo-processamento

clusterWorkflowTemplateRef

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: usando-modelo-cluster-
spec:
  arguments:
    parameters:
      - name: configuracao
        value: "producao"
  workflowTemplateRef:
    name: modelo-global
    clusterScope: true

templateRef

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: usando-template-
spec:
  entrypoint: fluxo-completo
  templates:
  - name: fluxo-completo
    steps:
    - - name: etapa1
        template: pre-processamento
    - - name: etapa2
        templateRef:
          name: modelo-utilities
          template: limpeza-dados
        arguments:
          parameters:
          - name: nivel
            value: "alto"
  - name: pre-processamento
    container:
      image: busybox
      command: [sh, -c]
      args: ["echo 'Pre-processando dados...'"]

  1. Práticas Recomendadas

  • WorkflowTemplates como modelos completos: Defina todos os templates e entrypoints no WorkflowTemplate, e use workflowTemplateRef no Workflow
  • WorkflowTemplates como biblioteca de templates: Defina templates comuns reutilizáveis e use templateRef nos Workflows quando necessário
  • Escolha entre Steps e DAG:
    • Use Steps quando a sequência de execução é clara e linear
    • Use DAG quando há dependências complexas entre as tarefas
  • Gerenciamento de parâmetros:
    • Defina valores padrão nos templates
    • Use parâmetros globais quando necessário em múltiplos templates
    • Priorize: Workflow arguments > WorkflowTemplate arguments > Template inputs

Tags: ArgoWorkflow kubernetes Orquestração de Workflows CI/CD

Publicado em 6-18 04:29