K8s em Exemplos: Padrão Ambassador

O padrão ambassador usa um container proxy para intermediar conexões entre sua aplicação e serviços externos. A app conecta ao localhost; o ambassador gerencia service discovery, sharding, balanceamento de carga ou tradução de protocolo. Use para: sharding de banco de dados, broker de serviços, testes A/B, circuit breaking.

ambassador-redis-shard.yaml

Um ambassador de sharding Redis. A app conecta ao localhost:6379 pensando ser uma única instância Redis. O ambassador twemproxy distribui chaves entre múltiplos shards Redis automaticamente.

apiVersion: v1
kind: Pod
metadata:
  name: app-with-redis
spec:
  containers:
    - name: app
      image: my-app:v1
      env:
        - name: REDIS_HOST
          value: "localhost"
        - name: REDIS_PORT
          value: "6379"

O ambassador twemproxy escuta no localhost:6379 e roteia requisições para o shard Redis apropriado baseado em hash de chave. O código da app não precisa de lógica de sharding.

    - name: redis-ambassador
      image: ganomede/twemproxy:latest
      ports:
        - containerPort: 6379
      volumeMounts:
        - name: twemproxy-config
          mountPath: /etc/nutcracker
  volumes:
    - name: twemproxy-config
      configMap:
        name: twemproxy-config
twemproxy-config.yaml

Configuração do Twemproxy define a estratégia de sharding. ketama usa hashing consistente para que adicionar/remover shards minimize redistribuição de chaves.

apiVersion: v1
kind: ConfigMap
metadata:
  name: twemproxy-config
data:
  nutcracker.yaml: |
    redis:
      listen: 127.0.0.1:6379
      hash: fnv1a_64
      distribution: ketama
      auto_eject_hosts: true
      redis: true
      servers:
        - redis-shard-0.redis:6379:1
        - redis-shard-1.redis:6379:1
        - redis-shard-2.redis:6379:1
terminal

Debug ambassadors verificando seus logs e conectividade. A app vê apenas localhost; o ambassador gerencia a complexidade de múltiplos backends, failover e distribuição de carga.

$ kubectl logs app-with-redis -c redis-ambassador
nutcracker: started on pid 1
nutcracker: listening on 127.0.0.1:6379

$ kubectl exec app-with-redis -c app -- redis-cli -h localhost ping
PONG

$ kubectl exec app-with-redis -c app -- redis-cli -h localhost set foo bar
OK

Índice | GitHub | Use as setas do teclado para navegar |