K8s em Exemplos: Padrão Sidecar

O padrão sidecar implanta containers auxiliares junto ao container principal da aplicação no mesmo Pod. Sidecars compartilham o namespace de rede do Pod (localhost) e podem compartilhar volumes. Use para: logging, monitoramento, proxy, sincronização de configuração e segurança.

sidecar-logging.yaml

Um sidecar de logging lê logs da aplicação de um volume compartilhado e os envia para um sistema centralizado. A aplicação principal escreve logs em arquivo; o sidecar os transmite.

apiVersion: v1
kind: Pod
metadata:
  name: app-with-logging
spec:
  containers:
    - name: app
      image: my-app:v1
      volumeMounts:
        - name: logs
          mountPath: /var/log/app

O container sidecar fluentd compartilha o mesmo volume e continuamente monitora o arquivo de log, encaminhando entradas para seu agregador de logs (Elasticsearch, Loki, etc.).

    - name: log-shipper
      image: fluent/fluentd:v1.16
      volumeMounts:
        - name: logs
          mountPath: /var/log/app
          readOnly: true
  volumes:
    - name: logs
      emptyDir: {}
sidecar-git-sync.yaml

Um sidecar git-sync mantém arquivos de configuração atualizados puxando periodicamente de um repositório Git. A aplicação principal lê configurações de um volume compartilhado que o sidecar mantém sincronizado.

apiVersion: v1
kind: Pod
metadata:
  name: app-with-config
spec:
  containers:
    - name: app
      image: nginx:alpine
      volumeMounts:
        - name: config
          mountPath: /usr/share/nginx/html
    - name: git-sync
      image: registry.k8s.io/git-sync/git-sync:v4.2.1
      args:
        - --repo=https://github.com/org/config
        - --root=/data
        - --period=60s
      volumeMounts:
        - name: config
          mountPath: /data
  volumes:
    - name: config
      emptyDir: {}
sidecar-https.yaml

Um sidecar de terminação HTTPS gerencia TLS, permitindo que apps legados sirvam HTTP no localhost. Nginx termina SSL na porta 443 e faz proxy para a app no localhost:8080. Ambos containers compartilham o namespace de rede.

apiVersion: v1
kind: Pod
metadata:
  name: secure-app
spec:
  containers:
    - name: app
      image: legacy-http-app:v1
      ports:
        - containerPort: 8080
    - name: ssl-proxy
      image: nginx:alpine
      ports:
        - containerPort: 443
      volumeMounts:
        - name: ssl-certs
          mountPath: /etc/nginx/certs
        - name: nginx-conf
          mountPath: /etc/nginx/conf.d
  volumes:
    - name: ssl-certs
      secret:
        secretName: app-tls
    - name: nginx-conf
      configMap:
        name: nginx-ssl-config
terminal

Containers sidecar iniciam e param com o Pod. Verifique se ambos containers estão Running. Volumes compartilhados aparecem nas montagens de cada container. Logs de cada container são acessados separadamente.

$ kubectl get pods app-with-logging
NAME              READY   STATUS    RESTARTS   AGE
app-with-logging  2/2     Running   0          5m

$ kubectl logs app-with-logging -c app
Application started on port 8080

$ kubectl logs app-with-logging -c log-shipper
Fluentd started, tailing /var/log/app/*.log

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