No Kubernetes, a definição de recursos é feita predominantemante através de arquivos YAML. Compreender a hierarquia e os tipos de dados aceitos em cada campo é fundamental para a orquestração eficeinte de containers.
Definição de um Pod com Múltiplos Estágios
Um Pod é a menor unidade computacional no Kubernetes. O exemplo abaixo demonstra a configuração de um Pod incluindo contêineres de inicialização (init containers) e verificações de integridade (probes).
apiVersion: v1
kind: Pod
metadata:
name: servidor-web
namespace: producao
labels:
app: backend
spec:
restartPolicy: OnFailure
initContainers:
- name: instalador-dependencias
image: alpine:latest
command: ["sh", "-c", "sleep 5 && echo Inicializado"]
containers:
- name: app-principal
image: nginx:1.21
imagePullPolicy: IfNotPresent
livenessProbe:
exec:
command:
- ls
- /usr/share/nginx/html
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /healthz
port: 80
Formatos de Execução: Command e Args
Existem diferentes maneiras de definir o ponto de entrada e os parâmetros de um contêiner no YAML, permitindo flexibiildade na execução de binários ou scripts shell.
Execução direta via lista:
command: ["printf", "Iniciando o sistema..."]
Execução através de um interpretador Shell:
Útil quando é necessário utilizar variáveis de ambiente ou encadeamento de comandos.
command: ["/bin/bash", "-c"]
args:
- |
echo "O host atual é: $HOSTNAME"
uptime
Separação entre binário e argumentos:
command: ["/usr/bin/python3"]
args: ["script.py", "--porta", "9000"]
Persistência de Dados com PV e PVC
Para gerenciar o armazenamento de forma desacoplada do ciclo de vida do Pod, utilizamos o PersistentVolume (PV) e o PersistentVolumeClaim (PVC).
apiVersion: v1
kind: PersistentVolume
metadata:
name: volume-estatico-nfs
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
nfs:
server: 10.0.0.50
path: "/exports/dados"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: solicitacao-armazenamento
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
Para utilizar o volume acima em um Pod, referenciamos o PVC na seção volumes e montamos o caminho no contêiner:
spec:
containers:
- name: app-container
image: redis:alpine
volumeMounts:
- name: espaco-dados
mountPath: /data
volumes:
- name: espaco-dados
persistentVolumeClaim:
claimName: solicitacao-armazenamento
Gerenciamento de Escalabilidade com Deployments
O Deployment fornece atualizações declarativas para Pods e ReplicaSets, permitindo gerenciar o estado desejado da aplicação.
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-gateway
spec:
replicas: 4
selector:
matchLabels:
servico: gateway
template:
metadata:
labels:
servico: gateway
spec:
containers:
- name: gateway-container
image: traefik:v2.5
ports:
- containerPort: 80
Tipos de Dados em Esquemas do Kubernetes
Ao utilizar o comando kubectl explain, é possível identificar a estrutura esperada para cada campo. Os tipos mais comuns são:
- <string>: Aceita um valor de texto simples. Ex:
apiVersion: v1. - <Object>: Requer uma estrutura aninhada de campos. Ex:
metadata. - <[]Object>: Indica uma lista de objetos, iniciada por um hífen (
-). Ex:containers. - <map[string]string>: Um conjunto de pares chave-valor. Ex:
labelsouannotations.