Automatizando a Extração em Massa de Helm Charts do Harbor com Scripts Shell

Introdução

Em ecossistemas Kubernetes, o Harbor serve como um repositório centralizado para armazenar Helm Charts. Durante operações de backup, migração ou implantação em ambientes sem aceso à internet, extrair múltiplos Charts manualmente pode ser ineficiente. Este guia demonstra como combinar a CLI do Helm com scripts Bash para automatizar a extração em massa a partir de uma instância do Harbor.

  1. Configuração Inicial do Repositório Helm

1.1 Registrar o Repositório Harbor

Execute o comando a seguir para adicionar o repositório ao Helm, ajustando as variáveis de acordo com seu ambiente:


HARBOR_HOST="https://harbor.suaempresa.com"
PROJECT_ID="projeto-exemplo"
USER="operador"
PASS="senha_segura"

helm repo add harbor-helm-repo ${HARBOR_HOST}/chartrepo/${PROJECT_ID} \
  --username=${USER} \
  --password=${PASS}

helm repo update --force-update harbor-helm-repo

Observação: Para versões do Harbor superiores a 2.6, certifique-se de que o modo OCI esteja habilitado e o ChartMuseum esteja desativado.

1.2 Verificar Disponibilidade dos Charts

Confirme se o repositório está acessível listando os Charts:


helm search repo harbor-helm-repo

Se nenhum Chart for retornado, valide no painel do Harbor se os artefatos foram carregados corretamente.

  1. Desenvolvimento do Script de Extração

2.1 Estrutura do Script de Automação

Crie um arquivo exportar-charts.sh com a lógica abaixo para baixar todas as versões dos Charts:


#!/bin/bash

ALIAS_REPO="harbor-helm-repo"
DESTINO="./harbor-export"
mkdir -p "${DESTINO}"

# Recuperar lista completa de Charts
CHART_LIST=$(helm search repo ${ALIAS_REPO} -l | tail -n +2 | cut -d'/' -f2)

for ITEM in ${CHART_LIST}; do
  # Obter versões disponíveis
  VERSIONS=$(helm search repo "${ALIAS_REPO}/${ITEM}" --versions -o json | jq -r '.[].version')
  
  for VER in ${VERSIONS}; do
    echo "Exportando ${ITEM} na versão ${VER}"
    helm pull "${ALIAS_REPO}/${ITEM}" --version "${VER}" --destination "${DESTINO}"
  done
done

echo "Processo concluído. Charts armazenados em: ${DESTINO}"

2.2 Execução do Script

Conceda permissões e inicie a execução:


chmod +x exportar-charts.sh
./exportar-charts.sh

O diretório de saída terá a seguinte estrutura:


harbor-export/
├── grafana/
│   ├── grafana-5.0.1.tgz
│   └── grafana-6.2.4.tgz
└── prometheus/
    ├── prometheus-10.0.2.tgz
    └── prometheus-11.1.0.tgz

  1. Tratamento de Problemas Frequentes

3.1 Falhas de Autenticação (HTTP 403)

Atualize as credenciais no repositório Helm para resolver erros de permissão:


helm repo update harbor-helm-repo --username=${USER} --password=${PASS}

O usuário no Harbor deve possuir, no mínimo, o papel de Guest.

3.2 Listagem Incompleta de Charts

Caso o Helm não retorne todos os Charts, utilize a API REST do Harbor para consulta paginada:


PAGINA=1
TOTAL_CHARTS=()
while true; do
  RESPOSTA=$(curl -sk -u "${USER}:${PASS}" \
    "${HARBOR_HOST}/api/v2.0/projects/${PROJECT_ID}/repositories?page=${PAGINA}&page_size=100")
  # Processar resposta JSON e adicionar itens à lista...
  PAGINA=$((PAGINA + 1))
  # Sair do loop quando não houver mais páginas
done

3.3 Falhas de Conexão ou Timeouts

Implemente uma lógica de retentativa no script para downloads instáveis:


for VER in ${VERSIONS}; do
  CONTADOR=0
  MAX_TENTATIVAS=3
  while [ ${CONTADOR} -lt ${MAX_TENTATIVAS} ]; do
    if helm pull "${ALIAS_REPO}/${ITEM}" --version "${VER}" --destination "${DESTINO}"; then
      break
    fi
    CONTADOR=$((CONTADOR + 1))
    echo "Tentativa ${CONTADOR} falhou para ${VER}. Aguardando..."
    sleep 10
  done
done

  1. Casos de Uso Avançados

4.1 Exportar Somente a Versão Mais Recente

Ajuste a extração de versões para selecionar apenas a primeira ocorrência:


VERSIONS=$(helm search repo "${ALIAS_REPO}/${ITEM}" --versions -o json | jq -r '.[0].version')

4.2 Integração com Pipelines de CI/CD

Em um arquivo .gitlab-ci.yml, adicione uma etapa dedicada:


exportar-charts:
  stage: preparar
  script:
    - apk add --no-cache helm jq curl
    - ./exportar-charts.sh
  artifacts:
    paths:
      - harbor-export/

4.3 Distribuição em Ambientes Isolados

Empacote os Charts exportados para transferência offline:


tar -czvf charts-harbor-$(date +%F).tar.gz harbor-export/

Este método permite a replicação de Charts entre clusters ou para ambientes sem conecitvidade direta com o Harbor.

Tags: Harbor Helm kubernetes Bash-Scripting CI/CD

Publicado em 6-2 03:03 por Thomas