Marcio Cunha

Gerenciamento Multi-Ambiente com Kustomize e Validação de Schema com OPA Gatekeeper

Descubra como estruturar configurações em múltiplos ambientes Kubernetes usando Kustomize sem duplicação de código e como aplicar validações estritas de conformidade com OPA Gatekeeper para evitar falhas em produção.

Marcio Cunha•6 min
Também disponível em:EnglishEspañol
Resumo
  • A separação nativa de ambientes com Kustomize elimina a duplicação massiva de código YAML em grandes clusters Kubernetes.
  • O OPA Gatekeeper atua como um policial de trânsito na API do Kubernetes, bloqueando arquivos de configuração que violam políticas de segurança.
  • Políticas baseadas em Rego transformam regras abstratas de governança em código executável auditável e automatizado.
  • A sobreposição de patches permite ajustar portas, réplicas e variáveis de ambiente mantendo a infraestrutura limpa e legível.
  • A combinação dessas ferramentas garante entregas contínuas seguras sem depender de scripts complexos de pós-processamento.

O Desafio da Complexidade em Múltiplos Ambientes no Kubernetes

Gerenciar aplicações em diferentes ambientes de tecnologia, como desenvolvimento, homologação e produção, costuma gerar uma dor de cabeça considerável para equipes de engenharia. Cada camada exige pequenas alterações em arquivos de configuração, como endereços de banco de dados, limites de memória e quantidade de servidores ativos. No ecossistema Kubernetes, o sistema automatizado de gerenciamento de contêineres, o método tradicional exigia copiar e colar centenas de linhas de código, abrindo espaço para erros humanos catastróficos onde uma alteração esquecida em produção derrubava o serviço de clientes reais. Na prática, isso significa que precisamos de uma estratégia inteligente para reutilizar o que é igual e modificar apenas o que muda de um servidor para outro, mantendo a consistência operacional intacta.

Para solucionar esse problema de proliferação de arquivos, o Kustomize surgiu como uma ferramenta nativa integrada ao Kubernetes que permite customizar arquivos de manifesto sem recorrer a substituições complexas de texto. Ele funciona através do conceito de bases e sobreposições, onde a base contém a estrutura padrão da aplicação que funciona em qualquer lugar, e as sobreposições aplicam ajustes específicos para cada ambiente. Quando um engenheiro precisa alterar o número de instâncias de um microsserviço apenas no ambiente de produção, ele não altera o código original, mas cria uma regra complementar que se aplica no momento do empacotamento. Essa abordagem mantém a auditoria limpa, pois qualquer pessoa consegue verificar exatamente o que difere entre os servidores de teste e de produção olhando apenas para arquivos enxutos e declarativos.

Construindo a Estrutura Base e Overlays com Kustomize

A arquitetura de diretórios usando Kustomize exige organização rigorosa para separar o que é comum do que é específico. Criamos uma pasta raiz chamada base que abriga os arquivos fundamentais, como o deployment que define os contêineres e o service que gerencia a rede interna. Ao lado dessa pasta base, criamos subdiretórios chamados overlays para cada ambiente, contendo arquivos de configuração que modificam sutilmente a base. Na prática, o arquivo kustomization.yaml funciona como o diretor de uma orquestra, dizendo ao sistema quais arquivos juntar e quais remendos aplicar antes de enviar o pacote final para o servidor de computação.

Para aplicar essa lógica na prática de engenharia, podemos estruturar nosso diretório base com um manifesto simples e modular. O exemplo a seguir demonstra a configuração inicial de um microsserviço genérico que serve como ponto de partida para todos os ambientes do sistema corporativo.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: minha-aplicacao
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: app
        image: minha-imagem:v1.0.0
        ports:
        - containerPort: 8080

Com a base estabelecida, o arquivo de sobreposição para o ambiente de produção adiciona o tempero necessário para escalar o sistema com segurança. O Kustomize lê essa instrução e injeta as modificações diretamente no arquivo original durante o processo de geração dos manifestos finais, eliminando a necessidade de manter cópias inteiras e desatualizadas do mesmo código espalhadas pelo repositório de controle de versão.

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patchesStrategicMerge:
- patch-replicas.yaml
patches:
- target:
    kind: Deployment
    name: minha-aplicacao
  patch: |-
    - op: replace
      path: /spec/replicas
      value: 5

O Perigo Silencioso de Configurações Inadequadas

Mesmo com uma organização impecável de pastas e arquivos, o fator humano ainda representa um risco crítico na administração de infraestruturas modernas. Desenvolvedores bem-intencionados podem acidentalmente subir arquivos de configuração utilizando imagens sem tags fixas, esquecer de definir limites de consumo de memória ou expor portas sensíveis diretamente para a internet sem proteção adequada. Em ambientes corporativos de grande escala, confiar apenas na boa vontade da equipe para revisar cada linha de código em busca de falhas de segurança é uma estratégia fadada ao fracasso. Na prática, precisamos de barreiras automatizadas que impeçam a entrada de códigos defeituosos ou inseguros no cluster antes mesmo que eles comecem a rodar nos servidores.

É exatamente nesse ponto crítico que entra o OPA Gatekeeper, uma ferramenta de validação que atua como um fiscal rigoroso na porta de entrada da API do Kubernetes. O Open Policy Agent, motor por trás do Gatekeeper, utiliza uma linguagem declarativa própria chamada Rego para escrever regras de negócio e de segurança que funcionam como leis inegociáveis. Quando qualquer usuário ou sistema tenta enviar um manifesto para o cluster, o Gatekeeper intercepta a requisição, analisa o conteúdo contra todas as políticas ativas e decide instantaneamente se o arquivo será aprovado ou rejeitado com uma mensagem clara explicando o motivo da recusa.

Implementando Políticas de Validação com Rego e Gatekeeper

Para colocar o OPA Gatekeeper em funcionamento, precisamos definir dois componentes principais: a restrição que define quais recursos devem ser fiscalizados e o modelo de restrição que contém a lógica de programação em Rego. Essa separação permite que os engenheiros criem regras genéricas, como proibir imagens sem versão fixa, e apliquem essas regras de forma seletiva a namespaces específicos do cluster. Na prática, isso significa que podemos ser mais rigorosos no ambiente de produção do que em ambientes de testes, garantindo flexibilidade operacional sem abrir mão da segurança essencial.

Abaixo apresentamos um exemplo prático de um modelo de restrição que valida se todas as imagens de contêineres possuem uma tag explícita, impedindo o uso da tag genérica latest que costuma causar instabilidades imprevisíveis em sistemas corporativos críticos.

apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  name: k8srequiredimages
spec:
  crd:
    spec:
      names:
        kind: K8sRequiredImages
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8srequiredimages
        violation[{"msg": msg}] {
          c := input.review.object.spec.containers[_]
          endswith(c.image, ":latest")
          msg := sprintf("Uso da tag latest é proibido na imagem: %v", [c.image])
        }

Com o modelo publicado no cluster, criamos a restrição propriamente dita para aplicar a regra em todos os namespaces da organização. Qualquer tentativa de aplicar um manifesto contendo a palavra latest na imagem do contêiner será bloqueada de imediato pelo sistema de admissão, protegendo a estabilidade operacional da empresa contra descuidos humanos cotidianos.

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredImages
metadata:
  name: proibir-tag-latest
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Deployment"]
  parameters: {}

Considerações Finais sobre Governança e Escalabilidade

A adoção combinada de Kustomize e OPA Gatekeeper representa um salto maduro na maturidade operacional de equipes que utilizam infraestruturas modernas baseadas em contêineres. Enquanto o Kustomize resolve o problema logístico de espalhar e modificar configurações entre dezenas de ambientes sem cair na armadilha da duplicação excessiva, o Gatekeeper garante que a autonomia dada aos desenvolvedores venha acompanhada de salvaguardas rígidas de segurança e conformidade. Na prática, essa integração transforma a governança de TI de um processo burocrático e lento em um mecanismo automatizado e transparente. Investir tempo na configuração correta dessas ferramentas reduz custos operacionais a longo prazo e blinda a organização contra falhas humanas evitáveis.