ArgoWorkflow: Compartilhamento de Arquivos entre Etapas com Artifacts

Este artigo explica como configurar e utilizar artifacts no ArgoWorkflow para compartilhar arquivos entre etapas de um workflow, focando na integração com S3 para armazenamento persistente.

Configuração do Repositório de Artifacts

Para habilitar o armazenamento de artifacts com S3 no ArgoWorkflow, é necessário definir um repositório de artifacts. Existem três métodos de configuração, com as seguintes prioridades: Configuração no Workflow > Configuração Padrão por Namespace > Configuração Global. Importante: o Secret contendo as credenciais S3 (AKSK) deve existir no mesmo namespace onde o workflow é executado.

Configuração Global

Esta é a configuração mais ampla, aplicável a todos os workflows. Ela é definida no ConfigMap referenciado pelo controlador de workflows. Exemplo de ConfigMap global:

apiVersion: v1
kind: ConfigMap
metadata:
  name: controlador-config-global
  namespace: argo-sistema
data:
  repositorioArtifacts: |
    s3:
      pontoExtremo: minio.padrao.svc:9000
      bucket: artifacts-loja
      inseguro: true
      chaveAcessoSecreta:
        name: segredo-s3-loja
        key: chaveAcesso
      chaveSecreta:
        name: segredo-s3-loja
        key: chaveSecreta

Configuração Padrão por Namespace

Cada namespace pode ter sua própria configuração padrão de repositório de artifacts. O ArgoWorkflow procura por um ConfigMap chamado repositorios-artifacts no namespace do workflow. Dentro do ConfigMap, a anotação workflows.argoproj.io/repositorio-artifacts-padrao define qual chave é a padrão.

apiVersion: v1
kind: ConfigMap
metadata:
  name: repositorios-artifacts
  namespace: namespace-projeto-a
  annotations:
    workflows.argoproj.io/repositorio-artifacts-padrao: s3-projeto-a
data:
  s3-projeto-a: |
    s3:
      bucket: dados-projeto-a
      pontoExtremo: minio.interno.svc:9000
      inseguro: true
      chaveAcessoSecreta:
        name: segredo-s3-projeto-a
        key: chaveAcesso
      chaveSecreta:
        name: segredo-s3-projeto-a
        key: chaveSecreta

Configuração Específica no Workflow

Para maior flexibilidade, você pode referenciar um repositório de artifacts diretamente dentro da especificação do workflow.

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: workflow-customizado-
spec:
  repositorioArtifactsRef:
    configMap: repositorios-artifacts
    key: s3-projeto-a
  # ... restante da definição do workflow

Alternativamente, é possível definir as credenciais S3 inline diretamente nos templates, embora não seja recomendado para manutenção.

Utilizando Artifacts em Workflows

Após configurar o repositório de artifacts, você pode usá-los para transferir dados entre etapas. Um workflow simples demonstra isso: uma etapa gera um arquivo e o armazena como artifact, e a segunda etapa o consome.

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: compartilhamento-arquivo-
spec:
  entrypoint: processo-principal
  templates:
  - name: processo-principal
    steps:
    - - name: gerar-dados
        template: gerar-conteudo
    - - name: exibir-dados
        template: consumir-conteudo
        argumentos:
          artifacts:
          - name: arquivo-dados
            from: "{{steps.gerar-dados.outputs.artifacts.arquivo-txt}}"

  - name: gerar-conteudo
    container:
      image: ferramentas/python:3.9
      comando: [python, -c]
      argumentos: ["with open('/tmp/dados.txt', 'w') as f: f.write('Conteúdo compartilhado')"]
    outputs:
      artifacts:
      - name: arquivo-txt
        path: /tmp/dados.txt

  - name: consumir-conteudo
    inputs:
      artifacts:
      - name: arquivo-dados
        path: /tmp/entrada.txt
    container:
      image: ferramentas/python:3.9
      comando: [python, -c]
      argumentos: ["open('/tmp/entrada.txt').read()"]

Neste exemplo, o template gerar-conteudo produz um artifact chamado arquivo-txt, que é então passado para consumir-conteudo usando a sintaxe de referência.

Comportamento de Compressão

Por padrão, artifacts são compactados em formato tar.gz. Você pode controlar isso usando o campo archive no template:

outputs:
  artifacts:
    - name: documento-raw
      path: /tmp/documento.txt
      archive:
        none: {}  # Desativa a compactação

    - name: documento-comprimido
      path: /tmp/dados-grandes.dat
      archive:
        tar:
          nivelCompressao: 9  # Nível máximo de compressão gzip

Gerenciamento de Ciclo de Vida dos Artifacts

Para evitar o acúmulo de artifacts no armazenamento, o ArgoWorkflow oferece políticas de limpeza automática. Configure no spec do workflow:

spec:
  gerenciamentoCicloVidaArtifacts:
    estrategia: AoExcluirWorkflow  # Exclui artifacts quando o workflow é removido
  templates:
    - name: tarefa-efemera
      outputs:
        artifacts:
          - name: arquivo-temporario
            path: /tmp/log-temp.txt
            gerenciamentoCicloVidaArtifacts:
              estrategia: Nunca  # Sobrescreve a política global para este artifact

As estratégias disponíveis são AoConcluirWorkflow e AoExcluirWorkflow. Para forçar a remoção do finalizer mesmo em caso de falha na limpeza, use forcarRemocaoFinalizador: true.

Extensoes de Artifacts

Além do S3, o ArgoWorkflow suporta nativamente artifacts de repositórios Git e URLs HTTP:

inputs:
  artifacts:
    - name: codigo-fonte
      path: /src
      git:
        repo: https://github.com/exemplo/projeto.git
        revisao: "v2.1"
    - name: ferramenta
      path: /usr/local/bin/tool
      modo: 0755
      http:
        url: https://releases.exemplo.com/tool-3.0.tar.gz

Tags: ArgoWorkflow kubernetes S3 Artifacts pipelines

Publicado em 6-16 21:03 por Thomas