O Kubernetes muda três coisas na chamada do seu servidor: onde fica a API key, como o endereço do visitante sobrevive ao load balancer e ao ingress, e se o pod consegue mesmo chegar ao korzen.dev. A chamada em si é a do seu framework: use o guia da sua stack.
A chave
Guarde a API key num Secret, nunca na imagem nem num ConfigMap, e passe para o container como variável de ambiente:
kubectl create secret generic korzen --from-literal=api-key=ak_your_key
# deployment.yaml, in your app's container env: - name: KORZEN_API_KEY valueFrom: secretKeyRef: name: korzen key: api-key
O IP do visitante
Por padrão, o load balancer da nuvem esconde o visitante atrás do próprio endereço, e o ingress também. Duas configurações o preservam: externalTrafficPolicy: Local no Service do ingress controller, e o ingress-nginx confiando no cabeçalho que o load balancer acrescenta. A sua aplicação então lê X-Real-IP, ou a última entrada do X-Forwarded-For, que o ingress-nginx define; atrás do Cloudflare, CF-Connecting-IP.
# The ingress controller's Service: keep the visitor's address on the way in. apiVersion: v1 kind: Service metadata: name: ingress-nginx-controller namespace: ingress-nginx spec: type: LoadBalancer externalTrafficPolicy: Local
# ingress-nginx's ConfigMap: trust the load balancer in front, pass the address on. apiVersion: v1 kind: ConfigMap metadata: name: ingress-nginx-controller namespace: ingress-nginx data: use-forwarded-headers: "true" # only if a load balancer you control is in front compute-full-forwarded-for: "true" # use-proxy-protocol: "true" # instead, if your cloud's load balancer speaks PROXY protocol
Saída
Se o cluster bloqueia o tráfego de saída de um namespace por padrão, o pod precisa poder chegar à porta 443:
# Only if your cluster blocks egress by default: let the app reach HTTPS. # A plain NetworkPolicy matches addresses, not names, and korzen.dev answers from # Cloudflare's ranges; with Cilium, an FQDN rule can name korzen.dev itself. apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: app-egress-https spec: podSelector: matchLabels: app: shop policyTypes: [Egress] egress: - ports: - port: 443 protocol: TCP - ports: - port: 53 protocol: UDP
Em produção
- Um cliente HTTP por pod, mantido aberto; cada réplica abre a sua conexão, e tudo bem.
- Nunca faça um readiness ou liveness probe depender do Bot Protection: quando ele estiver lento, os pods precisam continuar no ar e fazer fail open.
- O timeout do seu SDK depende de onde o cluster roda: um cluster no oeste dos EUA precisa de uns 300 ms.
Erros comuns
- O endereço do próprio ingress enviado como o do visitante: todas as decisões ficam com um IP só, e o Bot Protection vê um visitante muito ocupado.
use-forwarded-headersligado sem nada seu na frente: o visitante escreve oX-Forwarded-Fore escolhe o próprio endereço.- A chave num ConfigMap ou dentro da imagem, onde quem lê o namespace ou o registry a vê.