Gerenciamento de Imagens com Harbor e Centralização de Logs com Grafana Loki no Kubernetes

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

  1. Nginx: Atua como proxy reverso, encaminhando requisições para o Portal, Core ou Registro.
  2. Core: O coração do Harbor, lidando com autenticação, gerenciamento de projetos e APIs.
  3. Registry: Gerencia o armazenamento e a transferência real das imagens Docker.
  4. Job Service: Responsável por tarefas assíncronas, como replicação e varedura.
  5. 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

  1. Promtail: Agente instalado em cada nó (DaemonSet) que coleta logs locais e os envia ao Loki.
  2. Loki: O mecanismo de armazenamento e processamento de consultas.
  3. 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.

Tags: kubernetes Harbor loki Grafana devops

Publicado em 7-27 05:01