Files
athletic-map-deploy/tenants/plataforma/00-namespace-quota-netpol.yaml
T

102 lines
3.6 KiB
YAML

# Tenant `plataforma` da Athletic Map — isolamento do tenant (namespace + quota + limites + rede)
# Modelo: 1 namespace por cliente (ver arquitetura-multitenant-pods-por-cliente.md)
apiVersion: v1
kind: Namespace
metadata:
name: plataforma-prod
labels:
name: plataforma-prod
tenant: plataforma
athleticmap.io/tier: platform
---
# Cota de recursos do tenant. 07/10/2026: requests.memory 4Gi->5Gi, limits 12->15 cpu e 11->13Gi para a
# migracao aos runtimes (runtimes sobem ao lado dos servicos antigos, sem buraco). Historico das cotas
# anteriores: git log deste arquivo. Ver docs/migrar-plataforma-para-runtimes.md no nova-atm.
apiVersion: v1
kind: ResourceQuota
metadata:
name: tenant-quota
namespace: plataforma-prod
spec:
hard:
requests.cpu: "3"
requests.memory: 5Gi
limits.cpu: "15"
limits.memory: 13Gi
pods: "20"
persistentvolumeclaims: "6"
---
# Defaults de recursos por container (para a cota ser satisfeita sem declarar em cada pod)
apiVersion: v1
kind: LimitRange
metadata:
name: defaults
namespace: plataforma-prod
spec:
limits:
- type: Container
default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 100m
memory: 128Mi
---
# Isolamento de rede: nega tráfego cross-tenant; permite intra-namespace + ingress (Traefik) + egress
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-cross-tenant
namespace: plataforma-prod
spec:
podSelector: {}
policyTypes: [Ingress, Egress]
ingress:
- from:
- podSelector: {} # mesma namespace
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system # Traefik (ingress)
egress:
- to: # intra-namespace (pods) + ClusterIPs (VIP de service, pre-DNAT)
- podSelector: {}
- ipBlock: { cidr: 10.43.0.0/16 }
- to: # DNS (CoreDNS em kube-system)
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
ports:
- { protocol: UDP, port: 53 }
- { protocol: TCP, port: 53 }
# HTTPS para a internet publica. Sem isto o provedor de pagamento e
# INALCANCAVEL, e nenhuma cobranca sai.
#
# DESCOBERTO EM 2026-09-17, ao tentar a cobranca de R$ 1,00 do card 139: o
# pod RESOLVIA `api.asaas.com` (o DNS esta liberado acima) e a conexao TCP
# morria em 5 ms — rejeicao imediata, e nao timeout. O egress desta politica
# permitia apenas pods do proprio namespace, a CIDR de servicos e o DNS.
#
# Conferido que valia para TODOS os tenants deste cluster, e nao so para este:
# `escolinha-prod` e `piloto-prod` tambem nao alcancam, e o `escolinha` — que
# e producao — tem ZERO registros em `pagamento_externo`. A integracao com o
# Asaas nunca emitiu nada neste cluster. P3.3 supunha que ela estava pronta e
# que faltava so credencial.
#
# O `except` preserva o proposito da politica. Ela se chama
# `deny-cross-tenant`, e o que precisa barrar e um tenant falando com outro —
# o que acontece por IP PRIVADO. Liberar 0.0.0.0/0 sem o `except` abriria
# exatamente o que ela existe para fechar.
#
# So TCP e so 443: nao ha integracao de saida em outra porta, e abrir mais do
# que se usa e conceder o que ninguem pediu.
- to:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
ports:
- { protocol: TCP, port: 443 }