Estrutura e Sintaxe de Manifestos YAML no Kubernetes

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: labels ou annotations.

Tags: kubernetes K8s YAML persistentvolume Deployment

Publicado em 6-23 20:46