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.
- 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.
- 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
- 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
- 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.