Tornando o Harbor Pronto para Produção: Considerações Essenciais para Implantação

Tornando o Harbor Pronto para Produção: Considerações Essenciais
Harbor é um container registry open-source que protege artefatos com políticas e controle de acesso baseado em role-based access control (RBAC), garantindo que as imagens sejam escaneadas em busca de vulnerabilidades e assinadas como confiáveis. Para saber mais sobre o Harbor e como implantá-lo em uma Virtual Machine (VM) e no Kubernetes (K8s), consulte as partes 1 e 2 desta série. Embora a implantação do Harbor seja direta, torná-lo pronto para produção exige uma consideração cuidadosa de vários aspectos cruciais.
Este blog descreve fatores críticos para garantir que sua instância do Harbor seja robusta, segura e escalável para ambientes de produção. Para este artigo, focaremos no Harbor upstream (v 2.14) implantado no Kubernetes via Helm como nossa base e forneceremos sugestões para essa implantação específica.
1. Alta Disponibilidade (HA) e Escalabilidade
Para um ambiente de produção, pontos únicos de falha (single points of failure) são inaceitáveis. Isso é especialmente verdadeiro para registries de imagens que atuam como um repositório central para armazenar e puxar (pull) imagens e artefatos. Portanto, implementar a alta disponibilidade para o Harbor é crucial e envolve várias considerações importantes:
Implantação com um Ingress
Configure um Service do Kubernetes do tipo Ingress controller (por exemplo, Traefik) na frente de suas instâncias do Harbor para distribuir o tráfego de entrada de forma eficiente e fornecer um ponto de entrada unificado, juntamente com o cert-manager para gerenciamento de certificados. Você pode especificar isso em seu arquivo values.yaml em:
expose:
# Available Options: "loadBalancer", "ingress", "clusterIP", "nodePort"
type: ingress
expose:
# Available Options: "loadBalancer", "ingress", "clusterIP", "nodePort"
type: ingress
Para localizar seu arquivo values.yaml, consulte o blog anterior.
Utilize Múltiplas Instâncias do Harbor
Aumente a contagem de réplicas (replica count) para componentes críticos do Harbor (por exemplo, core, jobservice, portal, registry, trivy) em seu values.yaml para garantir a redundância.
core:
replicas: 3
jobservice:
replicas: 3
portal:
replicas: 3
registry:
replicas: 3
trivy:
replicas: 3
# Embora não seja estritamente para o HA do registry em si, considere aumentar as réplicas do exporter para robustez na disponibilidade de monitoramento
exporter:
replicas: 3
# Opcionalmente, se estiver usando Ingress, considere aumentar as réplicas do Nginx para melhorar a disponibilidade do Ingress
nginx:
replicas: 3
core:
replicas: 3
jobservice:
replicas: 3
portal:
replicas: 3
registry:
replicas: 3
trivy:
replicas: 3
# Embora não seja estritamente para o HA do registry em si, considere aumentar as réplicas do exporter para robustez na disponibilidade de monitoramento
exporter:
replicas: 3
# Opcionalmente, se estiver usando Ingress, considere aumentar as réplicas do Nginx para melhorar a disponibilidade do Ingress
nginx:
replicas: 3
Habilite o HA do Banco de Dados (PostgreSQL)
O Harbor inclui um banco de dados PostgreSQL interno, mas não o recomendamos para uso em produção. Veja o porquê:
- Falta de Alta Disponibilidade (HA): A configuração padrão interna do PostgreSQL dentro do Helm chart do Harbor é tipicamente uma única instância. Isso cria um ponto único de falha. Se esse pod de banco de dados cair, toda a sua instância do Harbor ficará indisponível.
- Escalabilidade Limitada: Um banco de dados embedded não foi projetado para escalonamento independente. Se o uso do seu Harbor crescer, você pode atingir gargalos de desempenho do banco de dados que são difíceis de resolver sem interromper o próprio Harbor.
- Gerenciamento de Ciclo de Vida Complexo: Gerenciar backups, recuperação pontual (point-in-time recovery), aplicação de patches e upgrades para um banco de dados stateful diretamente dentro do Helm chart de uma aplicação pode ser significativamente mais complexo e propenso a erros do que com soluções de banco de dados dedicadas.
Assim, é recomendado implantar um cluster PostgreSQL de alta disponibilidade dentro do Kubernetes (por exemplo, usando um Helm chart para Patroni ou CloudNativePG) ou utilizar um serviço de banco de dados gerenciado (managed database service) fora do cluster.
Configure o Harbor para se conectar a este banco de dados HA atualizando o values.yaml:
database:
type: "external"
external:
host: "192.168.0.1"
port: "5432"
username: "user"
password: "password"
coreDatabase: "registry"
# Se estiver usando um secret existente, a chave deve ser "password"
existingSecret: ""
# "disable" - Sem SSL
# "require" - Sempre SSL (ignora verificação)
# "verify-ca" - Sempre SSL (verifica se o certificado apresentado pelo
# servidor foi assinado por uma CA confiável)
# "verify-full" - Sempre SSL (verifica se o certificado apresentado pelo
# servidor foi assinado por uma CA confiável e o hostname do servidor corresponde ao
# certificado)
sslmode: "verify-full"
database:
type: "external"
external:
host: "192.168.0.1"
port: "5432"
username: "user"
password: "password"
coreDatabase: "registry"
# Se estiver usando um secret existente, a chave deve ser "password"
existingSecret: ""
# "disable" - Sem SSL
# "require" - Sempre SSL (ignora verificação)
# "verify-ca" - Sempre SSL (verifica se o certificado apresentado pelo
# servidor foi assinado por uma CA confiável)
# "verify-full" - Sempre SSL (verifica se o certificado apresentado pelo
# servidor foi assinado por uma CA confiável e o hostname do servidor corresponde ao
# certificado)
sslmode: "verify-full"
Implemente o Redis HA
Implante um cluster Redis de alta disponibilidade no Kubernetes (por exemplo, usando um Helm chart para Redis Sentinel ou Redis Cluster) ou utilize um serviço Redis gerenciado. Configure o Harbor para se conectar a esta instância Redis HA atualizando redis.type e os detalhes de conexão em values.yaml.
redis:
type: external
external:
addr: "192.168.0.2:6397"
sentinelMasterSet: ""
tlsOptions:
enable: true
username: ""
password: ""
redis:
type: external
external:
addr: "192.168.0.2:6397"
sentinelMasterSet: ""
tlsOptions:
enable: true
username: ""
password: ""
2. Melhores Práticas de Segurança
A segurança é fundamental para qualquer sistema de produção, especialmente um container registry.
Habilite TLS/SSL
Sempre habilite TLS/SSL para todos os componentes do Harbor. Para gerenciamento automatizado de certificados no Kubernetes, integre com o Cert-Manager e configure-o dentro do seu values.yaml do Helm do Harbor:
expose:
tls:
enabled: true
certSource: auto # change to manual if using cert-manager
auto:
commonName: ""
internalTLS:
enabled: true
strong_ssl_ciphers: true
certSource: "auto"
core:
secretName: ""
jobService:
secretName: ""
registry:
secretName: ""
portal:
secretName: ""
trivy:
secretName: ""
expose:
tls:
enabled: true
certSource: auto # change to manual if using cert-manager
auto:
commonName: ""
internalTLS:
enabled: true
strong_ssl_ciphers: true
certSource: "auto"
core:
secretName: ""
jobService:
secretName: ""
registry:
secretName: ""
portal:
secretName: ""
trivy:
secretName: ""
Configure Role-Based Access Control (RBAC)
Aproveite o RBAC do Kubernetes para gerenciar o acesso aos recursos do Harbor. Após a implantação, integre o Harbor com provedores de identidade corporativos, como LDAP ou OIDC. Consulte os guias de configuração do Harbor para etapas detalhadas: [Configure LDAP/Active Directory Authentication] ou [Configure OIDC Provider Authentication].
Implemente o Escaneamento de Vulnerabilidades
Garanta que o escaneamento de vulnerabilidades esteja habilitado em values.yaml. O Harbor usa o Trivy por padrão. Verifique sua ativação e configuração dentro do Helm chart.
trivy:
enabled: true
trivy:
enabled: true
Ative o Content Trust
O Harbor suporta múltiplos mecanismos de content trust para garantir a integridade de seus artefatos. Para a assinatura moderna de artefatos OCI, o Harbor recomenda Cosign e Notation. Imponha a segurança da implantação no nível do projeto dentro da UI do Harbor ou via Harbor API. Isso permite apenas a implantação de imagens verificadas e criptograficamente assinadas.
Mantenha Atualizações Regulares
Atualize regularmente seu Helm chart do Harbor e os componentes subjacentes do Kubernetes para se beneficiar dos patches de segurança e correções de bugs mais recentes. Use helm upgrade para essa finalidade.
3. Considerações de Storage
O storage eficiente e confiável é crítico para o desempenho e estabilidade do Harbor.
Configure Shared Storage
Para dados persistentes, configure Kubernetes StorageClasses e PersistentVolumes para usar soluções de storage compartilhado como vSAN, NFS, object storage compatível com S3 (por exemplo, MinIO implantado in-cluster ou S3 externo), ou um sistema de arquivos distribuído. Especifique-os em seu values.yaml em:
persistence:
enabled: true
resourcePolicy: "keep"
persistentVolumeClaim:
registry:
#Se deixado vazio, a storage class padrão do cluster kubernetes será usada
storageClass: "your-storage-class"
jobservice:
storageClass: "your-storage-class"
database:
storageClass: "your-storage-class"
redis:
storageClass: "your-storage-class"
trivy:
storageClass: "your-storage-class"
persistence:
enabled: true
resourcePolicy: "keep"
persistentVolumeClaim:
registry:
#Se deixado vazio, a storage class padrão do cluster kubernetes será usada
storageClass: "your-storage-class"
jobservice:
storageClass: "your-storage-class"
database:
storageClass: "your-storage-class"
redis:
storageClass: "your-storage-class"
trivy:
storageClass: "your-storage-class"
Escolha o Tipo de Storage Apropriado
Defina Kubernetes StorageClasses que se alinhem com sua infraestrutura subjacente (por exemplo, nfs-client, s3). Especifique essas configurações em seu values.yaml:
persistence:
enabled: true
resourcePolicy: "keep"
imageChartStorage:
#Specify storage type: "filesystem", "azure", "gcs", "s3", "swift", "oss"
type: ""
#Configure specific storage type section based on the selected option
persistence:
enabled: true
resourcePolicy: "keep"
imageChartStorage:
#Specify storage type: "filesystem", "azure", "gcs", "s3", "swift", "oss"
type: ""
#Configure specific storage type section based on the selected option
Estime o Dimensionamento do Storage
Calcule cuidadosamente suas necessidades de storage com base no número e tamanho antecipados das imagens de container, bem como em suas políticas de retenção definidas. Configure o tamanho para seus PersistentVolumeClaims em values.yaml.
Implemente Backup e Recuperação Robustos
Estabeleça uma estratégia de backup abrangente para todos os dados do Harbor. Para backups nativos do Kubernetes, considere usar ferramentas como Velero para fazer backup de PersistentVolumes e recursos do Kubernetes. Para object storage, utilize soluções de backup externas. Teste regularmente seus procedimentos de recuperação.
Configure e Execute Garbage Collection
Configure e execute rotineiramente o garbage collection do Harbor. Isso pode ser configurado através da UI do Harbor, definindo um agendamento para execuções automatizadas para remover blobs não utilizados e recuperar espaço de storage de forma eficiente.
4. Monitoramento e Alerta (Alerting)
O monitoramento proativo e o alerta são essenciais para identificar e resolver problemas antes que afetem os usuários.
Colete Métricas Abrangentes
Implante o Prometheus e configure-o para coletar (scrape) métricas dos componentes do Harbor. O Helm chart do Harbor expõe endpoints compatíveis com Prometheus no arquivo values.yaml. Visualize essas métricas usando o Grafana.
metrics:
enabled: true
core:
path: /metrics
port: 8001
registry:
path: /metrics
port: 8001
jobservice:
path: /metrics
port: 8001
exporter:
path: /metrics
port: 8001
serviceMonitor:
enabled: true
metrics:
enabled: true
core:
path: /metrics
port: 8001
registry:
path: /metrics
port: 8001
jobservice:
path: /metrics
port: 8001
exporter:
path: /metrics
port: 8001
serviceMonitor:
enabled: true
Centralize o Logging
Implemente uma solução de logging centralizada dentro do Kubernetes, como a stack ELK (Elasticsearch, Logstash, Kibana) ou Grafana com Fluentd/Fluent Bit.
Configure Alertas Críticos
Configure regras de alerta no Prometheus (Alertmanager) ou Grafana para eventos críticos, como falhas de componentes, alta utilização de recursos (CPU/memory limits), storage se aproximando da capacidade, falhas em escaneamentos de vulnerabilidade ou tentativas de acesso não autorizado. Defina esses limites com base nos seus requisitos de produção.
5. Configuração de Rede
A configuração de rede adequada garante uma comunicação suave entre os componentes do Harbor e os clientes externos.
Configure Ingress e Resolução de DNS
Conforme já mencionado, implante um Kubernetes Ingress controller ou Load Balancer para expor o Harbor externamente. Garanta que os registros DNS adequados estejam configurados para apontar para o endereço IP do seu Load Balancer.
Configure Proxy Settings (se aplicável)
Se os componentes do Harbor precisarem acessar recursos externos através de um proxy corporativo, configure as definições de proxy dentro do values.yaml. É crucial notar que o campo proxy.components define explicitamente quais componentes do Harbor (por exemplo, core, jobservice, trivy) utilizarão essas configurações de proxy para suas comunicações externas.
proxy:
httpProxy:
httpsProxy:
noProxy: 127.0.0.1,localhost,.local,.internal
components:
- core
- jobservice
- trivy
proxy:
httpProxy:
httpsProxy:
noProxy: 127.0.0.1,localhost,.local,.internal
components:
- core
- jobservice
- trivy
Aloque Largura de Banda Suficiente
Garanta que a infraestrutura de rede subjacente do seu cluster Kubernetes e os nodes tenham largura de banda suficiente para lidar com picos de pushes e pulls de imagens. Monitore o I/O de rede nos nodes que executam os pods do Harbor.
Conclusão
Embora esta não seja uma lista exaustiva de considerações para tornar o Harbor pronto para produção, ao abordar diligentemente esses pontos, você pode transformar sua implantação básica do Harbor em um container registry robusto, seguro e de alta disponibilidade.
Essa abordagem garante que o Harbor sirva como um pilar de sua infraestrutura cloud-native, capaz de suportar fluxos de trabalho exigentes de desenvolvimento e produção. Desde a implementação de Alta Disponibilidade e medidas de segurança rigorosas até a otimização do storage e o estabelecimento de monitoramento proativo, cada etapa contribui para um sistema de gerenciamento de artefatos resiliente e eficiente.
Acompanhe nossa série de blogs sobre Harbor:
- Blog 1 – Harbor: Your Enterprise-Ready Container Registry for a Modern Private Cloud (Harbor: Seu Container Registry Empresarial Pronto para uma Nuvem Privada Moderna)
- Blog 2 – Reducing Harbor Deployment Complexity on Kubernetes (Reduzindo a Complexidade da Implantação do Harbor no Kubernetes)
Descubra mais em VMware Cloud Foundation (VCF) Blog.
Precisa de ajuda com suas soluções de TI?
A VirtuAllIT Solutions oferece consultoria especializada em virtualização, cloud computing e infraestrutura tecnológica.

