Lab 7.4 - Init Containers e Sidecars
Objetivos do Lab
Ao final deste lab, você será capaz de:
- Compreender o conceito de Init Container.
- Criar Pods com Init Containers.
- Utilizar Init Containers para preparação do ambiente.
- Compreender o padrão Sidecar.
- Implementar um padrão Sidecar para logging.
Duração Estimada
45-60 minutos
Pré-requisitos
- kubectl instalado e configurado.
- Cluster Kubernetes local funcional (minikube ou kind).
- Conhecimentos sobre Init Containers e Sidecars (Capítulo 7.4).
Parte 1: Compreendendo os Init Containers
Os Init Containers são executados antes dos containers principais de um Pod. Eles são úteis para:
- Inicializar dados ou configurações
- Aguardar dependências ficarem prontas
- Preparar o ambiente antes do início da aplicação
Características:
- São executados sequencialmente (um após o outro)
- Todos devem ser bem-sucedidos antes que os containers principais iniciem
- Têm acesso aos mesmos volumes que os containers principais
Parte 2: Criando um Pod com Init Container
Vamos criar um Pod com um Init Container que prepara arquivos antes do início da aplicação.
Etapa 2.1: Criar o Pod com Init Container
Crie um arquivo pod-init-container.yaml:
# pod-init-container.yaml
apiVersion: v1
kind: Pod
metadata:
name: app-with-init
spec:
volumes:
- name: shared-data
emptyDir: {} # Volume compartilhado entre Init Container e container principal
initContainers:
- name: init-setup
image: busybox:1.35
command: ["/bin/sh", "-c"]
args:
- |
echo "Init Container: Preparando o ambiente..."
echo "Configuração inicializada" > /shared/config.txt
echo "Dados preparados" > /shared/data.txt
echo "Init Container finalizado com sucesso"
volumeMounts:
- name: shared-data
mountPath: /shared
containers:
- name: app-container
image: nginx:1.20
command: ["/bin/sh", "-c"]
args:
- |
echo "Aplicação: Lendo arquivos preparados pelo Init Container"
cat /shared/config.txt
cat /shared/data.txt
echo "Aplicação iniciada"
nginx -g "daemon off;"
volumeMounts:
- name: shared-data
mountPath: /shared
ports:
- containerPort: 80
Explicação:
- O Init Container prepara arquivos no volume compartilhado.
- O container principal lê esses arquivos após o início.
Aplique o Pod:
kubectl apply -f pod-init-container.yaml
Etapa 2.2: Verificar a Execução
Verifique o status do Pod:
kubectl get pods app-with-init
Você deve ver o Pod passando pelas fases:
Init:0/1(Init Container em execução)PodInitializingRunning(container principal iniciado)
Verifique os logs do Init Container:
kubectl logs app-with-init -c init-setup
Verifique os logs do container principal:
kubectl logs app-with-init -c app-container
Você deve ver que o container principal leu os arquivos criados pelo Init Container.
Parte 3: Init Container com Espera de Dependência
Os Init Containers podem aguardar até que serviços externos estejam disponíveis.
Etapa 3.1: Criar um Pod que Espera um Serviço
Crie um arquivo pod-init-wait.yaml:
# pod-init-wait.yaml
apiVersion: v1
kind: Pod
metadata:
name: app-wait-service
spec:
initContainers:
- name: wait-for-service
image: busybox:1.35
command: ["/bin/sh", "-c"]
args:
- |
echo "Aguardando o serviço ficar disponível..."
until nslookup kubernetes.default.svc.cluster.local; do
echo "Serviço indisponível, aguardando..."
sleep 2
done
echo "Serviço disponível!"
containers:
- name: app-container
image: busybox:1.35
command: ["/bin/sh", "-c"]
args: ["echo 'Aplicação iniciada após verificação do serviço' && sleep 3600"]
Aplique o Pod:
kubectl apply -f pod-init-wait.yaml
Verifique os logs do Init Container:
kubectl logs app-wait-service -c wait-for-service
Parte 4: Padrão Sidecar
Um Sidecar é um container auxiliar que roda no mesmo Pod que o container principal para fornecer funcionalidades complementares (logging, monitoring, proxy, etc.).
Etapa 4.1: Criar um Pod com Padrão Sidecar para Logging
Crie um arquivo pod-sidecar-logging.yaml:
# pod-sidecar-logging.yaml
apiVersion: v1
kind: Pod
metadata:
name: app-with-sidecar
spec:
volumes:
- name: shared-logs
emptyDir: {} # Volume compartilhado para os logs
containers:
- name: app-container
image: busybox:1.35
command: ["/bin/sh", "-c"]
args:
- |
counter=0
while true; do
echo "[$(date)] Log entry $counter from application" >> /logs/app.log
counter=$((counter+1))
sleep 5
done
volumeMounts:
- name: shared-logs
mountPath: /logs
- name: log-collector
image: busybox:1.35
command: ["/bin/sh", "-c"]
args:
- |
echo "Sidecar: Coletando logs da aplicação..."
while true; do
if [ -f /logs/app.log ]; then
echo "=== Novos logs ==="
tail -n 5 /logs/app.log
fi
sleep 10
done
volumeMounts:
- name: shared-logs
mountPath: /logs
readOnly: true # O sidecar apenas lê os logs
Explicação:
- O container principal escreve logs em um volume compartilhado.
- O sidecar lê esses logs e os processa (neste caso, apenas exibe).
Aplique o Pod:
kubectl apply -f pod-sidecar-logging.yaml
Etapa 4.2: Verificar o Padrão Sidecar
Verifique se ambos os containers estão em execução:
kubectl get pods app-with-sidecar
Verifique os logs do container principal:
kubectl logs app-with-sidecar -c app-container
Verifique os logs do sidecar:
kubectl logs app-with-sidecar -c log-collector
Você deve ver o sidecar exibindo os logs coletados do container principal.
Parte 5: Sidecar para Monitoring
Vamos criar outro exemplo com um sidecar para monitoring.
Etapa 5.1: Criar um Pod com Sidecar de Monitoring
Crie um arquivo pod-sidecar-monitoring.yaml:
# pod-sidecar-monitoring.yaml
apiVersion: v1
kind: Pod
metadata:
name: app-monitored
spec:
containers:
- name: app-container
image: nginx:1.20
ports:
- containerPort: 80
- name: metrics-collector
image: busybox:1.35
command: ["/bin/sh", "-c"]
args:
- |
echo "Sidecar: Coletando métricas..."
while true; do
# Simular coleta de métricas
echo "[$(date)] Métricas coletadas: CPU, Memory, Network"
sleep 15
done
Aplique o Pod:
kubectl apply -f pod-sidecar-monitoring.yaml
Verifique os logs do sidecar:
kubectl logs app-monitored -c metrics-collector
Parte 6: Vantagens dos Padrões
Init Containers:
- Separação de responsabilidades: Preparação vs execução
- Ordem garantida: Executados antes dos containers principais
- Reutilização: Mesmo Init Container para múltiplos Pods
Sidecars:
- Coesão: Containers no mesmo Pod compartilham rede e armazenamento
- Flexibilidade: Adição de funcionalidades sem modificar a aplicação principal
- Isolamento: Cada container pode ter seus próprios recursos
Parte 7: Limpeza
Remova os Pods criados:
kubectl delete pod app-with-init app-wait-service app-with-sidecar app-monitored
Resumo do Lab
Neste lab, você explorou os Init Containers e o padrão Sidecar. Você aprendeu a usar Init Containers para preparar o ambiente antes do início das aplicações, a implementar sidecars para logging e monitoring, e a entender as vantagens desses padrões para a arquitetura de aplicações.
Próximos Passos
Este módulo sobre Workloads Avançados está agora completo. Você pode avançar para o Módulo 8 sobre Ingress e Load Balancing.
Módulo 8: Ingress e Load Balancing
Lab criado em: Dezembro 2024