Korzen
Bot Protection

Kubernetes

Bot Protection numa aplicação no Kubernetes: a API key como Secret, o IP do visitante pelo load balancer e pelo ingress-nginx, e a saída de rede.

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-headers ligado sem nada seu na frente: o visitante escreve o X-Forwarded-For e escolhe o próprio endereço.
  • A chave num ConfigMap ou dentro da imagem, onde quem lê o namespace ou o registry a vê.