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-apie 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-uiusa pathIS-indicadoresredeis-auth-apieis-reports-uipodem usar hostnames dedicadosextentnão é stateless e exige storage persistente
Estrutura base dos workloads¶
O template de deployment.yaml normalmente inclui:
createdAtpara forçar rollout quando necessárioenvFrompara consumir o Secret sincronizado pelo ESOextraVarsparaTZ,JAVA_OPTSe 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:
extentusaStatefulSete PVCis-core-apiexige NFS para arquivos e mídiais-ws-apiexige NFS para mídiais4depende 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.