102 lines
3.6 KiB
YAML
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 }
|