Harbor na Prática — Parte 1 Instalação via Helm no Kubernetes
Esta é a primeira parte de uma série de artigos em português sobre o Harbor, o registry de imagens open source da CNCF. O objetivo é ajudar a comunidade a implementar e operar o Harbor do zero, com exemplos práticos e explicações claras.
Pré-requisitos
Antes de começar, você precisa ter:
- Um cluster Kubernetes funcionando (kubeadm, k3s, EKS, GKE, etc.)
kubectlconfigurado e com acesso ao clusterhelminstalado (v3+)- Uma StorageClass disponível no cluster (ex: longhorn, local-path, gp2)
- Um domínio ou IP para acesso externo
O que vamos instalar
O Harbor será instalado via Helm chart oficial, com as seguintes configurações:
- Acesso via NodePort (simples para começar)
- TLS desabilitado (ideal para ambiente de desenvolvimento)
- Storage local via StorageClass
- Banco de dados PostgreSQL interno
- Redis interno
Passo 1 — Adicionar o repositório Helm do Harbor
helm repo add harbor https://helm.goharbor.io
helm repo update
Verifique se o repositório foi adicionado corretamente:
helm search repo harbor/harbor
Você deverá ver a versão mais recente do chart disponível.
Passo 2 — Criar o namespace
kubectl create namespace harbor
Passo 3 — Criar o arquivo values.yaml
O values.yaml é onde você personaliza toda a instalação. Crie o arquivo com o conteúdo abaixo:
expose:
type: nodePort
tls:
enabled: false
nodePort:
name: harbor
ports:
http:
port: 80
nodePort: 32000
https:
port: 443
nodePort: 32001
# URL externa que o Harbor vai usar para gerar links e tokens
# Substitua pelo IP ou domínio do seu cluster
externalURL: http://harbor.empresa.com:32000
# Senha do administrador — Eu inserir aqui para ficar mais pratico
harborAdminPassword: "Harbor12345"
persistence:
resourcePolicy: "keep"
persistentVolumeClaim:
registry:
storageClass: "longhorn" # substitua pela sua StorageClass
accessMode: ReadWriteOnce
size: 50Gi
jobservice:
jobLog:
storageClass: "longhorn"
size: 5Gi
database:
storageClass: "longhorn"
size: 10Gi
redis:
storageClass: "longhorn"
size: 2Gi
trivy:
storageClass: "longhorn"
size: 5Gi
Dica: O campo
externalURLé crítico. Ele define a URL base que o Harbor usa para gerar tokens de autenticação e links internos. Se estiver errado, odocker logine odocker pushvão falhar com erros de autenticação.
Passo 4 — Instalar o Harbor
helm install harbor harbor/harbor \
--namespace harbor \
--values values.yaml
Acompanhe a criação dos pods:
kubectl get pods -n harbor -w
A instalação completa leva entre 2 e 5 minutos. Todos os pods devem estar em estado Running antes de prosseguir.
Passo 5 — Verificar a instalação
kubectl get pods -n harbor
Você deverá ver algo parecido com:
NAME READY STATUS RESTARTS AGE
harbor-core-xxx 1/1 Running 0 3m
harbor-database-0 1/1 Running 0 3m
harbor-jobservice-xxx 1/1 Running 0 3m
harbor-nginx-xxx 1/1 Running 0 3m
harbor-portal-xxx 1/1 Running 0 3m
harbor-redis-0 1/1 Running 0 3m
harbor-registry-xxx 2/2 Running 0 3m
harbor-trivy-0 1/1 Running 0 3m
Verifique também os serviços:
kubectl get svc -n harbor
Passo 6 — Acessar a interface web
Abra o browser e acesse:
http://<IP-DO-SEU-NODE>:32000
Use as credenciais:
- Usuário:
admin - Senha: o valor que você definiu em
harborAdminPassword
Você verá o dashboard do Harbor com o projeto library já criado por padrão.
Explorando a interface
Ao acessar o Harbor pela primeira vez, vale conhecer os menus principais:
- Projects — onde ficam os repositórios de imagens, organizados por projeto
- Registries — para configurar endpoints de replicação e proxy cache
- Administration — gestão de usuários, configurações LDAP, quotas globais
- Logs — auditoria de todas as operações realizadas
Solução de problemas comuns
Pod harbor-core reiniciando constantemente
Verifique se o banco de dados já está pronto antes do core tentar conectar:
kubectl logs -n harbor harbor-core-xxx
kubectl logs -n harbor harbor-database-0
Erro de autenticação ao fazer docker login
Confirme que o externalURL no values.yaml corresponde exatamente ao endereço que você está usando para acessar o Harbor. Qualquer diferença (HTTP vs HTTPS, porta, domínio) causa falha na geração de tokens.
PVCs em estado Pending
Verifique se a StorageClass informada existe no cluster:
kubectl get storageclass
kubectl describe pvc -n harbor
Atualizando a instalação
Se precisar alterar alguma configuração após a instalação, edite o values.yaml e execute:
helm upgrade harbor harbor/harbor \
--namespace harbor \
--values values.yaml
Próximo artigo
Na Parte 2, vamos criar projetos e repositórios no Harbor — via interface web, via API REST e via Terraform — e entender como organizar suas imagens de forma eficiente.