From 8f437c7d59be3b52f36826a0b14bfd45fc39c027 Mon Sep 17 00:00:00 2001 From: deploy Date: Tue, 29 Sep 2026 17:49:39 +0000 Subject: [PATCH] fix(N16): resumo diario pelo Service interno do captacao (o nome publico nao conecta de dentro do cluster); regras de rede tenants<->captacao 8083 --- .../00-namespace-quota-netpol.yaml | 2 ++ moldes/consolidado/56-cronjob-resumo.yaml | 4 +-- .../18-netpol-captacao-compartilhado.yaml | 18 ++++++++++++ tenants/acme/56-cronjob-resumo.yaml | 4 +-- .../18-netpol-captacao-compartilhado.yaml | 18 ++++++++++++ tenants/demo/56-cronjob-resumo.yaml | 4 +-- .../18-netpol-captacao-compartilhado.yaml | 18 ++++++++++++ tenants/escolinha/56-cronjob-resumo.yaml | 4 +-- .../18-netpol-captacao-compartilhado.yaml | 18 ++++++++++++ tenants/piloto/56-cronjob-resumo.yaml | 4 +-- .../23-netpol-tenants-no-captacao.yaml | 29 +++++++++++++++++++ 11 files changed, 113 insertions(+), 10 deletions(-) create mode 100644 tenants/acme/18-netpol-captacao-compartilhado.yaml create mode 100644 tenants/demo/18-netpol-captacao-compartilhado.yaml create mode 100644 tenants/escolinha/18-netpol-captacao-compartilhado.yaml create mode 100644 tenants/piloto/18-netpol-captacao-compartilhado.yaml create mode 100644 tenants/plataforma/23-netpol-tenants-no-captacao.yaml diff --git a/moldes/consolidado/00-namespace-quota-netpol.yaml b/moldes/consolidado/00-namespace-quota-netpol.yaml index 45e3be3..fbefd99 100644 --- a/moldes/consolidado/00-namespace-quota-netpol.yaml +++ b/moldes/consolidado/00-namespace-quota-netpol.yaml @@ -162,6 +162,8 @@ spec: - { protocol: TCP, port: 5432 } - { protocol: TCP, port: 6432 } - { protocol: TCP, port: 8080 } + # captacao (N16, 2026-09-29): o resumo diario vai pelo Service interno. + - { protocol: TCP, port: 8083 } # 4. HTTPS para a internet publica. Ver o cabecalho: nao da para estreitar # com flannel, e uma lista de CIDR de SaaS quebraria a cobranca sem aviso. diff --git a/moldes/consolidado/56-cronjob-resumo.yaml b/moldes/consolidado/56-cronjob-resumo.yaml index d4dcf99..9857b6b 100644 --- a/moldes/consolidado/56-cronjob-resumo.yaml +++ b/moldes/consolidado/56-cronjob-resumo.yaml @@ -12,7 +12,7 @@ # 1. token do client `operacao` no realm do tenant (o mesmo das tarefas do # financeiro: Secret `operacao-credentials`); # 2. GET http://runtime-operacao/api/resumo-do-tenant (lista de 1 ou 2 meses); -# 3. POST https://plataforma.athleticmap.com/api/public/resumo-do-tenant/{{TENANT}} +# 3. POST http://servico-captacao.plataforma-prod.svc/api/public/resumo-do-tenant/{{TENANT}} # com o cabecalho `x-atm-resumo-token` — do Secret `resumo-credentials`, que # so vale para ESTE tenant (HMAC do nome dele com a chave da plataforma). # @@ -117,7 +117,7 @@ spec: - name: ISSUER_HOST value: auth.athleticmap.com - name: DESTINO - value: https://plataforma.athleticmap.com/api/public/resumo-do-tenant/{{TENANT}} + value: http://servico-captacao.plataforma-prod.svc/api/public/resumo-do-tenant/{{TENANT}} - name: CLIENT_SECRET valueFrom: secretKeyRef: diff --git a/tenants/acme/18-netpol-captacao-compartilhado.yaml b/tenants/acme/18-netpol-captacao-compartilhado.yaml new file mode 100644 index 0000000..30769cd --- /dev/null +++ b/tenants/acme/18-netpol-captacao-compartilhado.yaml @@ -0,0 +1,18 @@ +# N16 (2026-09-29): saida do CronJob do resumo para o captacao da plataforma, pelo +# Service interno (porta 8083 do pod). Par da 23-netpol-tenants-no-captacao da plataforma. +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: egress-captacao-compartilhado + namespace: acme-prod +spec: + podSelector: {} + policyTypes: [Egress] + egress: + - to: + - namespaceSelector: + matchLabels: { kubernetes.io/metadata.name: plataforma-prod } + podSelector: + matchLabels: { app: servico-captacao } + ports: + - { protocol: TCP, port: 8083 } diff --git a/tenants/acme/56-cronjob-resumo.yaml b/tenants/acme/56-cronjob-resumo.yaml index 2106a12..b8c10e2 100644 --- a/tenants/acme/56-cronjob-resumo.yaml +++ b/tenants/acme/56-cronjob-resumo.yaml @@ -12,7 +12,7 @@ # 1. token do client `operacao` no realm do tenant (o mesmo das tarefas do # financeiro: Secret `operacao-credentials`); # 2. GET http://runtime-operacao/api/resumo-do-tenant (lista de 1 ou 2 meses); -# 3. POST https://plataforma.athleticmap.com/api/public/resumo-do-tenant/acme +# 3. POST http://servico-captacao.plataforma-prod.svc/api/public/resumo-do-tenant/acme # com o cabecalho `x-atm-resumo-token` — do Secret `resumo-credentials`, que # so vale para ESTE tenant (HMAC do nome dele com a chave da plataforma). # @@ -117,7 +117,7 @@ spec: - name: ISSUER_HOST value: auth.athleticmap.com - name: DESTINO - value: https://plataforma.athleticmap.com/api/public/resumo-do-tenant/acme + value: http://servico-captacao.plataforma-prod.svc/api/public/resumo-do-tenant/acme - name: CLIENT_SECRET valueFrom: secretKeyRef: diff --git a/tenants/demo/18-netpol-captacao-compartilhado.yaml b/tenants/demo/18-netpol-captacao-compartilhado.yaml new file mode 100644 index 0000000..73b9097 --- /dev/null +++ b/tenants/demo/18-netpol-captacao-compartilhado.yaml @@ -0,0 +1,18 @@ +# N16 (2026-09-29): saida do CronJob do resumo para o captacao da plataforma, pelo +# Service interno (porta 8083 do pod). Par da 23-netpol-tenants-no-captacao da plataforma. +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: egress-captacao-compartilhado + namespace: demo-prod +spec: + podSelector: {} + policyTypes: [Egress] + egress: + - to: + - namespaceSelector: + matchLabels: { kubernetes.io/metadata.name: plataforma-prod } + podSelector: + matchLabels: { app: servico-captacao } + ports: + - { protocol: TCP, port: 8083 } diff --git a/tenants/demo/56-cronjob-resumo.yaml b/tenants/demo/56-cronjob-resumo.yaml index 3737f46..9d3134d 100644 --- a/tenants/demo/56-cronjob-resumo.yaml +++ b/tenants/demo/56-cronjob-resumo.yaml @@ -12,7 +12,7 @@ # 1. token do client `operacao` no realm do tenant (o mesmo das tarefas do # financeiro: Secret `operacao-credentials`); # 2. GET http://runtime-operacao/api/resumo-do-tenant (lista de 1 ou 2 meses); -# 3. POST https://plataforma.athleticmap.com/api/public/resumo-do-tenant/demo +# 3. POST http://servico-captacao.plataforma-prod.svc/api/public/resumo-do-tenant/demo # com o cabecalho `x-atm-resumo-token` — do Secret `resumo-credentials`, que # so vale para ESTE tenant (HMAC do nome dele com a chave da plataforma). # @@ -117,7 +117,7 @@ spec: - name: ISSUER_HOST value: auth.athleticmap.com - name: DESTINO - value: https://plataforma.athleticmap.com/api/public/resumo-do-tenant/demo + value: http://servico-captacao.plataforma-prod.svc/api/public/resumo-do-tenant/demo - name: CLIENT_SECRET valueFrom: secretKeyRef: diff --git a/tenants/escolinha/18-netpol-captacao-compartilhado.yaml b/tenants/escolinha/18-netpol-captacao-compartilhado.yaml new file mode 100644 index 0000000..8013d0f --- /dev/null +++ b/tenants/escolinha/18-netpol-captacao-compartilhado.yaml @@ -0,0 +1,18 @@ +# N16 (2026-09-29): saida do CronJob do resumo para o captacao da plataforma, pelo +# Service interno (porta 8083 do pod). Par da 23-netpol-tenants-no-captacao da plataforma. +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: egress-captacao-compartilhado + namespace: escolinha-prod +spec: + podSelector: {} + policyTypes: [Egress] + egress: + - to: + - namespaceSelector: + matchLabels: { kubernetes.io/metadata.name: plataforma-prod } + podSelector: + matchLabels: { app: servico-captacao } + ports: + - { protocol: TCP, port: 8083 } diff --git a/tenants/escolinha/56-cronjob-resumo.yaml b/tenants/escolinha/56-cronjob-resumo.yaml index 1e1d11c..02ec6fc 100644 --- a/tenants/escolinha/56-cronjob-resumo.yaml +++ b/tenants/escolinha/56-cronjob-resumo.yaml @@ -12,7 +12,7 @@ # 1. token do client `operacao` no realm do tenant (o mesmo das tarefas do # financeiro: Secret `operacao-credentials`); # 2. GET http://runtime-operacao/api/resumo-do-tenant (lista de 1 ou 2 meses); -# 3. POST https://plataforma.athleticmap.com/api/public/resumo-do-tenant/escolinha +# 3. POST http://servico-captacao.plataforma-prod.svc/api/public/resumo-do-tenant/escolinha # com o cabecalho `x-atm-resumo-token` — do Secret `resumo-credentials`, que # so vale para ESTE tenant (HMAC do nome dele com a chave da plataforma). # @@ -117,7 +117,7 @@ spec: - name: ISSUER_HOST value: auth.athleticmap.com - name: DESTINO - value: https://plataforma.athleticmap.com/api/public/resumo-do-tenant/escolinha + value: http://servico-captacao.plataforma-prod.svc/api/public/resumo-do-tenant/escolinha - name: CLIENT_SECRET valueFrom: secretKeyRef: diff --git a/tenants/piloto/18-netpol-captacao-compartilhado.yaml b/tenants/piloto/18-netpol-captacao-compartilhado.yaml new file mode 100644 index 0000000..4c9ead2 --- /dev/null +++ b/tenants/piloto/18-netpol-captacao-compartilhado.yaml @@ -0,0 +1,18 @@ +# N16 (2026-09-29): saida do CronJob do resumo para o captacao da plataforma, pelo +# Service interno (porta 8083 do pod). Par da 23-netpol-tenants-no-captacao da plataforma. +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: egress-captacao-compartilhado + namespace: piloto-prod +spec: + podSelector: {} + policyTypes: [Egress] + egress: + - to: + - namespaceSelector: + matchLabels: { kubernetes.io/metadata.name: plataforma-prod } + podSelector: + matchLabels: { app: servico-captacao } + ports: + - { protocol: TCP, port: 8083 } diff --git a/tenants/piloto/56-cronjob-resumo.yaml b/tenants/piloto/56-cronjob-resumo.yaml index ff2fe04..41ed9af 100644 --- a/tenants/piloto/56-cronjob-resumo.yaml +++ b/tenants/piloto/56-cronjob-resumo.yaml @@ -12,7 +12,7 @@ # 1. token do client `operacao` no realm do tenant (o mesmo das tarefas do # financeiro: Secret `operacao-credentials`); # 2. GET http://runtime-operacao/api/resumo-do-tenant (lista de 1 ou 2 meses); -# 3. POST https://plataforma.athleticmap.com/api/public/resumo-do-tenant/piloto +# 3. POST http://servico-captacao.plataforma-prod.svc/api/public/resumo-do-tenant/piloto # com o cabecalho `x-atm-resumo-token` — do Secret `resumo-credentials`, que # so vale para ESTE tenant (HMAC do nome dele com a chave da plataforma). # @@ -117,7 +117,7 @@ spec: - name: ISSUER_HOST value: auth.athleticmap.com - name: DESTINO - value: https://plataforma.athleticmap.com/api/public/resumo-do-tenant/piloto + value: http://servico-captacao.plataforma-prod.svc/api/public/resumo-do-tenant/piloto - name: CLIENT_SECRET valueFrom: secretKeyRef: diff --git a/tenants/plataforma/23-netpol-tenants-no-captacao.yaml b/tenants/plataforma/23-netpol-tenants-no-captacao.yaml new file mode 100644 index 0000000..ce90cfc --- /dev/null +++ b/tenants/plataforma/23-netpol-tenants-no-captacao.yaml @@ -0,0 +1,29 @@ +# N16 (2026-09-29): o CronJob `resumo-para-a-plataforma` de cada tenant entrega o +# resumo diario ao captacao pelo Service interno — de dentro do cluster o nome +# publico nao conecta (hairpin pelo balanceador). Mesmo padrao do +# 16-netpol-tenants-no-keycloak: tenants novos pelo label, os 4 antigos pelo nome. +# So a porta do captacao; nenhum outro pod da plataforma fica exposto. +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: tenants-no-captacao + namespace: plataforma-prod +spec: + podSelector: + matchLabels: { app: servico-captacao } + policyTypes: [Ingress] + ingress: + - from: + - namespaceSelector: + matchExpressions: + - { key: athleticmap.io/tenant, operator: Exists } + - namespaceSelector: + matchLabels: { kubernetes.io/metadata.name: piloto-prod } + - namespaceSelector: + matchLabels: { kubernetes.io/metadata.name: demo-prod } + - namespaceSelector: + matchLabels: { kubernetes.io/metadata.name: acme-prod } + - namespaceSelector: + matchLabels: { kubernetes.io/metadata.name: escolinha-prod } + ports: + - { protocol: TCP, port: 8083 }