plataforma A: cota maior + runtime-core e runtime-operacao ao lado dos servicos antigos (sem trafego)
This commit is contained in:
@@ -9,7 +9,21 @@ metadata:
|
||||
tenant: plataforma
|
||||
athleticmap.io/tier: platform
|
||||
---
|
||||
# Cota de recursos do tenant — protege o cluster contra consumo excessivo de um cliente
|
||||
# RASCUNHO — substitui SO o objeto ResourceQuota de
|
||||
# athletic-map-deploy/tenants/plataforma/00-namespace-quota-netpol.yaml (commit A).
|
||||
# Nao aplicar daqui: copiar para o GitOps na janela.
|
||||
#
|
||||
# Por que: medido em 07/10/2026, requests.memory 3762Mi de 4Gi. O runtime-core
|
||||
# (384Mi) nao cabe ao lado dos servicos antigos, e a migracao proposta sobe os
|
||||
# runtimes ANTES de tirar trafego dos antigos (troca sem buraco). Com 5Gi:
|
||||
# 3762 + 384 (core) + 384 (operacao) + 320 (pod novo do frontend-spa no rolling) = 4850Mi.
|
||||
# O no tem folga (12,6Gi de 32Gi pedidos em 07/10).
|
||||
#
|
||||
# Os LIMITES tambem estouram: limits.cpu 10900m/12 e limits.memory 9536Mi/11Gi
|
||||
# medidos; somando core (1 cpu/768Mi) + operacao (1 cpu/768Mi) + pod extra do
|
||||
# rolling do frontend-spa (0,7 cpu/640Mi) = 13,6 cpu / 11,7Gi. Dai 15 e 13Gi.
|
||||
#
|
||||
# Na fase 3 (antigos em replicas 0) o uso cai para ~3570Mi; voltar ao valor antigo e opcional.
|
||||
apiVersion: v1
|
||||
kind: ResourceQuota
|
||||
metadata:
|
||||
@@ -17,48 +31,10 @@ metadata:
|
||||
namespace: plataforma-prod
|
||||
spec:
|
||||
hard:
|
||||
# Dimensionada para ESTE tenant, e nao copiada.
|
||||
#
|
||||
# A copia que veio do `tenants/piloto` do repositorio de codigo trazia
|
||||
# limits.cpu 4, e com ela o Keycloak, o bff e o captacao NAO conseguiram
|
||||
# nem criar pod: "exceeded quota: tenant-quota, requested: limits.cpu=1,
|
||||
# used: 3700m, limited: 4". Os limites dos 8 deployments somam 6,2 CPU
|
||||
# contando o default do LimitRange no postgres.
|
||||
#
|
||||
# O numero do piloto no cluster e outro — limits.cpu 20, memory 16Gi,
|
||||
# pods 30 — porque aquele tenant roda 18 deployments. Aqui eram 8 quando
|
||||
# esta cota foi escrita; hoje sao 10.
|
||||
#
|
||||
# 2026-09-23: de 10 para 12, e o motivo e ROLLING UPDATE, nao consumo.
|
||||
#
|
||||
# Durante o corte de dominio (P0.9) todos os deployments trocaram ao mesmo
|
||||
# tempo, e a cota bateu no teto: "exceeded quota: tenant-quota, requested:
|
||||
# limits.cpu=500m, used: 9700m, limited: 10". O `servico-bff`, o
|
||||
# `servico-configuracao` e o `servico-captacao` nao conseguiram CRIAR pod.
|
||||
# Dois entraram aos poucos, conforme outros liberavam vaga; o terceiro
|
||||
# ficou para tras e precisou de `kubectl rollout restart` — porque o
|
||||
# ReplicaSet tinha acumulado falhas e o backoff dele ficou longo demais.
|
||||
#
|
||||
# Em repouso o uso e 8700m. Com o teto em 10 sobram 1300m, que dao para
|
||||
# DOIS pods extras — e uma atualizacao que mexe em varios servicos precisa
|
||||
# de mais. Com 12 sobram 3300m, ou seis pods de 500m (o default do
|
||||
# LimitRange logo abaixo).
|
||||
#
|
||||
# **Isto alivia; nao resolve.** A causa e o `plataforma` ser o unico tenant
|
||||
# que nao foi consolidado em runtimes: sao 10 deployments contra 3 nos
|
||||
# outros quatro. Consolidar faz a cota sobrar em vez de faltar.
|
||||
#
|
||||
# Nao mexemos em `limits.memory`: em repouso sao 8Gi de 11Gi, e 3Gi dao
|
||||
# para seis pods extras de 512Mi — a mesma folga que a CPU passa a ter.
|
||||
#
|
||||
# `limits` e teto, nao reserva: o no ja opera com 836% de limits.cpu
|
||||
# comprometidos, o que e pratica normal. O que reserva de verdade e
|
||||
# `requests`, e ai a conta importa: o no tem 8 CPU e 32Gi, com 74% da CPU
|
||||
# e 72% da memoria ja reservados. Os 8 pods pedem ~2,1Gi.
|
||||
requests.cpu: "3"
|
||||
requests.memory: 4Gi
|
||||
limits.cpu: "12"
|
||||
limits.memory: 11Gi
|
||||
requests.memory: 5Gi
|
||||
limits.cpu: "15"
|
||||
limits.memory: 13Gi
|
||||
pods: "20"
|
||||
persistentvolumeclaims: "6"
|
||||
---
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
# RASCUNHO — tenants/plataforma/65-runtime-core.yaml (commit A). Nao aplicar daqui.
|
||||
#
|
||||
# runtime-core no tenant `plataforma`: configuracao + cadastro (e, por ser o mesmo
|
||||
# processo, organizacao, documentos, agenda e retencao — esses quatro nascem VAZIOS
|
||||
# no banco da plataforma; ver docs/migrar-plataforma-para-runtimes.md §3).
|
||||
#
|
||||
# DIFERENCAS em relacao ao molde (moldes/consolidado/70-runtime-core.yaml) — todas
|
||||
# de proposito; copiar o molde sem elas quebra:
|
||||
# * banco: o Postgres PROPRIO do namespace (`postgres:5432/athleticmap`, usuario
|
||||
# `atm`, sslmode=require), e nao o PgBouncer/pg-compartilhado. E onde ja estao
|
||||
# os schemas cadastro (V014) e configuracao (V009). Sem initContainer espera-banco.
|
||||
# * Keycloak: realm `athleticmap` da plataforma, emissor auth-PLATAFORMA. O molde
|
||||
# usa auth.athleticmap.com/realms/athleticmap-N: aqui daria 401 em tudo.
|
||||
# * ATM_KC_ADMIN_ENABLED=false e SEM `kc-admin-secret`: o Secret nao existe neste
|
||||
# namespace (conferido 07/10) e o secretKeyRef obrigatorio do molde deixaria o
|
||||
# pod em CreateContainerConfigError. Efeito: criar/editar funcionario aqui nao
|
||||
# cria/atualiza login no Keycloak (fica PENDENTE). Decisao do dono (§7).
|
||||
# * ATM_PLATAFORMA_TOKEN ausente: a propria plataforma nao pede e-mail de acesso
|
||||
# a si mesma; o acesso por e-mail fica PENDENTE, o cadastro nao falha.
|
||||
# * Service SEM o rotulo athleticmap.io/metricas: as metricas continuam saindo
|
||||
# pelos Services servico-cadastro/servico-configuracao (ServiceMonitor
|
||||
# athleticmap-servicos), e o rotulo duplicaria as series.
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: runtime-core
|
||||
namespace: plataforma-prod
|
||||
labels:
|
||||
app: runtime-core
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels: { app: runtime-core }
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: runtime-core
|
||||
athleticmap.io/contexto: runtime-core
|
||||
spec:
|
||||
containers:
|
||||
- name: runtime-core
|
||||
image: docker.io/library/runtime-core:1.22-rotina-logins
|
||||
imagePullPolicy: Never
|
||||
ports: [{ containerPort: 8083 }]
|
||||
env:
|
||||
- { name: SPRING_DATASOURCE_URL, value: "jdbc:postgresql://postgres:5432/athleticmap?sslmode=require" }
|
||||
- { name: SPRING_DATASOURCE_USERNAME, value: "atm" }
|
||||
- name: SPRING_DATASOURCE_PASSWORD
|
||||
valueFrom:
|
||||
secretKeyRef: { name: db-credentials, key: password }
|
||||
- { name: SPRING_DATASOURCE_HIKARI_MAXIMUM_POOL_SIZE, value: "10" }
|
||||
- { name: ATM_JWK_SET_URI, value: "http://keycloak:8080/realms/athleticmap/protocol/openid-connect/certs" }
|
||||
- { name: ATM_ISSUER, value: "https://auth-plataforma.athleticmap.com/realms/athleticmap" }
|
||||
- { name: ATM_TENANT, value: "plataforma" }
|
||||
- { name: ATM_PLANO, value: "institucional" }
|
||||
- { name: ATM_KC_ADMIN_ENABLED, value: "false" }
|
||||
resources:
|
||||
requests: { cpu: 50m, memory: 384Mi }
|
||||
limits: { cpu: "1", memory: 768Mi }
|
||||
readinessProbe:
|
||||
httpGet: { path: /actuator/health/readiness, port: 8083 }
|
||||
initialDelaySeconds: 25
|
||||
periodSeconds: 10
|
||||
failureThreshold: 30
|
||||
livenessProbe:
|
||||
httpGet: { path: /actuator/health/liveness, port: 8083 }
|
||||
initialDelaySeconds: 90
|
||||
periodSeconds: 20
|
||||
failureThreshold: 6
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: runtime-core
|
||||
namespace: plataforma-prod
|
||||
labels:
|
||||
app: runtime-core
|
||||
spec:
|
||||
selector: { app: runtime-core }
|
||||
ports: [{ name: http, port: 80, targetPort: 8083 }]
|
||||
@@ -0,0 +1,88 @@
|
||||
# RASCUNHO — tenants/plataforma/66-runtime-operacao.yaml (commit A). Nao aplicar daqui.
|
||||
#
|
||||
# runtime-operacao no tenant `plataforma`: o FINANCEIRO da Athletic Map (webhook
|
||||
# Asaas, notas fiscais N18, conciliacao, mensalidades) — e, por ser o mesmo
|
||||
# processo, planejamento, campeonato e administrativo, que nascem VAZIOS aqui.
|
||||
#
|
||||
# Substitui `servico-financeiro:1.7-n18-standalone`. O standalone so existiu
|
||||
# porque o financeiro virou biblioteca em 18/09 e a plataforma precisava da
|
||||
# metrica N18 (29/09, scripts/publicar_financeiro_plataforma.py). O runtime-operacao
|
||||
# ja publica as mesmas series `atm_nota_fiscal_*`.
|
||||
#
|
||||
# Env copiado do 79-servico-financeiro.yaml atual (Asaas de PRODUCAO, conta da
|
||||
# Athletic Map). CRITICOS:
|
||||
# * ATM_PLANO=institucional. Sem ele o runtime nasce BRONZE e a BarreiraDePlano
|
||||
# (prefixo /api/financeiro, minimo prata) responde 403 aos tres CronJobs.
|
||||
# * ATM_ISSUER/JWK do realm `athleticmap` da plataforma (auth-plataforma).
|
||||
# * ASAAS_API_KEY e ASAAS_WEBHOOK_TOKEN do mesmo Secret asaas-credentials
|
||||
# (o AsaasConfig recusa subir se forem iguais — ja sao diferentes hoje).
|
||||
# * SEM ASAAS_SPLIT_WALLET_ID: sem carteira, nao ha split (AsaasProvedorPagamento).
|
||||
# * SEM ATM_CONSENTIMENTO_SEGREDO (Secret consentimento-selo nao existe aqui; o
|
||||
# standalone de hoje tambem roda sem: so loga aviso). SEM desafio de campeonato.
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: runtime-operacao
|
||||
namespace: plataforma-prod
|
||||
labels:
|
||||
app: runtime-operacao
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels: { app: runtime-operacao }
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: runtime-operacao
|
||||
athleticmap.io/contexto: runtime-operacao
|
||||
spec:
|
||||
containers:
|
||||
- name: runtime-operacao
|
||||
image: docker.io/library/runtime-operacao:1.23-cancelar-sessao
|
||||
imagePullPolicy: Never
|
||||
ports: [{ containerPort: 8083 }]
|
||||
env:
|
||||
- { name: SPRING_DATASOURCE_URL, value: "jdbc:postgresql://postgres:5432/athleticmap?sslmode=require" }
|
||||
- { name: SPRING_DATASOURCE_USERNAME, value: "atm" }
|
||||
- name: SPRING_DATASOURCE_PASSWORD
|
||||
valueFrom:
|
||||
secretKeyRef: { name: db-credentials, key: password }
|
||||
- { name: SPRING_DATASOURCE_HIKARI_MAXIMUM_POOL_SIZE, value: "10" }
|
||||
- { name: ATM_JWK_SET_URI, value: "http://keycloak:8080/realms/athleticmap/protocol/openid-connect/certs" }
|
||||
- { name: ATM_ISSUER, value: "https://auth-plataforma.athleticmap.com/realms/athleticmap" }
|
||||
- { name: ATM_TENANT, value: "plataforma" }
|
||||
- { name: ATM_PLANO, value: "institucional" }
|
||||
# ── Asaas de PRODUCAO (conta da Athletic Map), igual ao 79- de hoje ──
|
||||
- { name: ASAAS_BASE_URL, value: "https://api.asaas.com/v3" }
|
||||
- { name: ASAAS_AMBIENTE, value: "producao" }
|
||||
- { name: ASAAS_USER_AGENT, value: "AthleticMap/plataforma" }
|
||||
- name: ASAAS_API_KEY
|
||||
valueFrom:
|
||||
secretKeyRef: { name: asaas-credentials, key: api-key }
|
||||
- name: ASAAS_WEBHOOK_TOKEN
|
||||
valueFrom:
|
||||
secretKeyRef: { name: asaas-credentials, key: webhook-token }
|
||||
resources:
|
||||
requests: { cpu: 50m, memory: 384Mi }
|
||||
limits: { cpu: "1", memory: 768Mi }
|
||||
readinessProbe:
|
||||
httpGet: { path: /actuator/health/readiness, port: 8083 }
|
||||
initialDelaySeconds: 25
|
||||
periodSeconds: 10
|
||||
failureThreshold: 30
|
||||
livenessProbe:
|
||||
httpGet: { path: /actuator/health/liveness, port: 8083 }
|
||||
initialDelaySeconds: 90
|
||||
periodSeconds: 20
|
||||
failureThreshold: 6
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: runtime-operacao
|
||||
namespace: plataforma-prod
|
||||
labels:
|
||||
app: runtime-operacao
|
||||
spec:
|
||||
selector: { app: runtime-operacao }
|
||||
ports: [{ name: http, port: 80, targetPort: 8083 }]
|
||||
Reference in New Issue
Block a user