Skip to content

Helm Charts — Padrões

Introdução

Todos os charts seguem padrões consistentes para integração com a stack de infraestrutura: External Secrets Operator (ESO) para segredos, Gateway API para roteamento, External DNS para criação de registros e Stakater Reloader para rollout automático quando secrets mudam.

Integração ESO → Vault

Cada chart inclui pelo menos dois ExternalSecrets.

Config da aplicação

O template principal sincroniza segredos da aplicação para um Secret do Kubernetes:

yaml apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret spec: refreshInterval: "15s" secretStoreRef: kind: ClusterSecretStore name: vault-backend target: name: {{ .Release.Name }}-config dataFrom: - extract: key: tenants/{{ .Release.Namespace }}/{{ .Values.app.name }}/config

Caminho padrão: tenants/{namespace}/{app}/config

Pull secrets

Todos os charts também precisam das credenciais globais do registry:

yaml apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret spec: secretStoreRef: kind: ClusterSecretStore name: vault-backend target: name: {{ .Release.Name }}-pull-secrets template: type: kubernetes.io/dockerconfigjson dataFrom: - extract: key: system/global-pull-secrets

Tenant-scoped vs system-scoped

  • Tenant-scoped: maioria das aplicações, usando tenants/{namespace}/{app}/config
  • System-scoped: serviços compartilhados ou especiais, como redeis-auth-api, redeis-ws-api e alguns secrets globais

Para APIs que precisam de chaves específicas, como auth-api, o ESO também pode mapear propriedades individuais com decodingStrategy: Base64.

HTTPRoute com Gateway API

O roteamento HTTP é feito via Gateway API integrado com Istio:

yaml apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: annotations: external-dns.enabled: "true" spec: parentRefs: - name: gateway namespace: istio-system hostnames: - "{{ .Release.Namespace }}.{{ .Values.domain }}" rules: - matches: - path: type: PathPrefix value: {{ .Values.httpRoute.path }} backendRefs: - name: {{ include "app.fullname" . }} port: {{ .Values.service.port }}

Padrão de hostname: {tenant}.{domain}

Contrato com o ExternalDNS

O pipeline instala o ExternalDNS com annotation-filter: "external-dns.enabled==true". Na prática, o recurso só ganha reconciliação de DNS se essa annotation existir e o hostname estiver dentro do domínio filtrado pelo ambiente.

O detalhamento do controller e do fluxo de publicação está em Networking & Service Mesh > DNS Automático.

Diferença API vs UI

Aspecto APIs Backend UIs Frontend
Path /auth-api, /is-core-api, etc. / ou path da UI
Rewrite Opcional Em geral não
Porta 7000+ ou 8080 80

Casos que fogem do padrão:

  • is-indicadores-ui usa path IS-indicadores
  • redeis-auth-api e is-reports-ui podem usar hostnames dedicados
  • extent não é stateless e exige storage persistente

Estrutura base dos workloads

O template de deployment.yaml normalmente inclui:

  • createdAt para forçar rollout quando necessário
  • envFrom para consumir o Secret sincronizado pelo ESO
  • extraVars para TZ, JAVA_OPTS e parâmetros extras
  • annotations do Reloader
  • probes configuráveis por values

Diferença API vs UI

Aspecto APIs Backend UIs Frontend
Container port 7000+ ou 8080 80
extraVars TZ + JAVA_OPTS TZ e configuração da UI
OTel comum em apps Java não aplicável na maioria das UIs
Probes startup + readiness + liveness readiness/liveness HTTP

HPA

O HPA segue o padrão autoscaling/v2 com CPU e memória:

yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler spec: minReplicas: {{ .Values.autoscaling.minReplicas }} maxReplicas: {{ .Values.autoscaling.maxReplicas }} metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} - type: Resource resource: name: memory target: type: Utilization averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}

HPA desabilitado por padrão

O HPA normalmente vem desabilitado nos valores padrão e é ativado por ambiente ou tenant quando necessário.

Storage e workloads especiais

Nem todos os charts são Deployment stateless:

  • extent usa StatefulSet e PVC
  • is-core-api exige NFS para arquivos e mídia
  • is-ws-api exige NFS para mídia
  • is4 depende de NFS para operação legada

Esses requisitos precisam existir antes do deploy efetivo da aplicação.

Imagem Docker

As imagens são publicadas no OCIR:

yaml image: repository: gru.ocir.io/gr9qdgmg7kig/{app-name} tag: latest pullPolicy: Always

Tags reais

As tags usadas nos tenants ficam fora do chart base e são definidas nos arquivos de configuração do ambiente ou tenant.