Gerenciamento de Imagens com Harbor
O Harbor é uma solução de registro de artefatos open source que estende o Docker Distribution, adicionando funcionalidades essenciais para ambientes corporativos. Ele foca em segurança, identidade e gerenciamento de imagens em larga escala.
Principais Funcionalidades do Harbor
- Controle de Acesso Baseado em Função (RBAC): Gerenciamento granular de permissões por usuário ou grupo.
- Replicação de Imagens: Sincronização de imagens entre diferentes instâncias do Harbor para alta disponibilidade ou distribuição geográfica.
- Varredura de Vulnerabilidades: Integração com ferramentas como Trivy para identificar falhas de segurança em camadas de imagem.
- Integração AD/LDAP: Autenticação centralizada utilizando serviços de diretório existentes.
- Coleta de Lixo (Garbage Collection): Limpeza automática de imagens sem tags e liberação de espaço em disco.
- API RESTful: Facilita a automação de pipelines de CI/CD.
Arquitetura Interna
- Nginx: Atua como proxy reverso, encaminhando requisições para o Portal, Core ou Registro.
- Core: O coração do Harbor, lidando com autenticação, gerenciamento de projetos e APIs.
- Registry: Gerencia o armazenamento e a transferência real das imagens Docker.
- Job Service: Responsável por tarefas assíncronas, como replicação e varedura.
- Database: Armazena metadados de projetos, usuários e políticas.
Instalação via Helm
Para iniciar a implantação, primeiro criamos o isolamento necessário no cluster:
# Criando o namespace para o registro
kubectl create namespace infra-registry
# Adicionando o repositório oficial do Harbor
helm repo add harbor https://helm.goharbor.io
helm repo update
# Fazendo o download do chart para customização local
helm pull harbor/harbor --version 1.11.0
tar -xvf harbor-1.11.0.tgz
cd harbor/
No arquivo values.yaml, é fundamental configurar a classe de armazenamento (StorageClass) e os parâmetros de acesso (Ingress). Exemplo de ajuste via terminal:
# Definindo a storage class para persistência
sed -i 's/storageClass: ""/storageClass: "nfs-client"/g' values.yaml
# Instalando o Harbor
helm install my-registry -f values.yaml . -n infra-registry
Configuração de Autenticação no Docker
Por padrão, o Docker exige conexões seguras. Se o seu Harbor utiliza certificados autoassinados, você deve configurar o daemon do Docker ou adicionar o certificado CA:
# Opção 1: Adicionar aos registros inseguros no /etc/docker/daemon.json
{
"insecure-registries": ["hub.interno.local"]
}
# Opção 2: Adicionar o certificado CA ao host
mkdir -p /etc/docker/certs.d/hub.interno.local
# Copie o certificado ca.crt para este diretório
systemctl restart docker
# Autenticando no registro
docker login hub.interno.local
Manutenção do Scanner de Vulnerabilidades (Trivy)
Em ambientes com restrição de rede, pode ser necessário atualizar a base de dados do Trivy manualmente:
# Copiando a base de dados atualizada para o Pod do Trivy
kubectl cp trivy-db.tar.gz harbor-trivy-0:/home/scanner/.cache/trivy/db/ -n infra-registry
# Extraindo os dados dentro do container
kubectl exec -it harbor-trivy-0 -n infra-registry -- tar -xzf /home/scanner/.cache/trivy/db/trivy-db.tar.gz -C /home/scanner/.cache/trivy/db/
Observabilidade com Grafana Loki
O Loki é um sistema de agregação de logs inspirado no Prometheus. Diferente do ELK (Elasticsearch, Logstash, Kibana), o Loki não indexa o conteúdo completo dos logs, apenas os metadados (labels), o que o torna extremamente eficiente em termos de recursos.
Comparação: Loki vs ELK/EFK
- Consumo de Recursos: Loki é muito mais leve por não exigir índices pesados em disco e memória.
- Escalabilidade: Projetado nativamente para Kubernetes, escalando horizontalmente com facilidade.
- Custos: Menor custo de armazenamento e processamento para grandes volumes de logs.
Componentes da Stack Loki
- Promtail: Agente instalado em cada nó (DaemonSet) que coleta logs locais e os envia ao Loki.
- Loki: O mecanismo de armazenamento e processamento de consultas.
- Grafana: Interface gráfica utilizada para visualizar e consultar os logs via LogQL.
Implantação da Stack de Logs
Utilizamos o chart loki-stack para instalar todos os componentes de uma vez:
# Criando o namespace para observabilidade
kubectl create namespace logging-system
# Exemplo de configuração simplificada (values-custom.yaml)
loki:
enabled: true
persistence:
enabled: true
storageClassName: nfs-client
size: 5Gi
promtail:
enabled: true
config:
lokiAddress: http://loki:3100/loki/api/v1/push
grafana:
enabled: true
persistence:
enabled: true
storageClassName: nfs-client
# Instalando a stack
helm install loki-stack -f values-custom.yaml grafana/loki-stack -n logging-system
Acessando o Grafana
Após a instalação, recupere a senha do administrador e acesse a interface:
# Obtendo a senha do admin do Grafana
kubectl get secret --namespace logging-system loki-stack-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
# Expondo o serviço localmente para acesso rápido (ou use um Ingress)
kubectl port-forward service/loki-stack-grafana 3000:80 -n logging-system
Testando a Coleta de Logs
Para verificar se os logs estão sendo coletados corretamente, podemos criar um gerador de logs simples:
# Criando um deployment de teste
kubectl create deployment log-gen --image=busybox -- /bin/sh -c "while true; do echo \"$(date) - Gerando log de teste do sistema\"; sleep 5; done"
# No Grafana Explore, utilize a query LogQL:
# {app="log-gen"}
Com o LogQL, você pode filtrar logs por labels de Pod, Container ou Namespace, permitindo uma depuração rápida e eficiente de falhas no cluster.