Skip to content

Kubernetes para Desenvolvedores

🚀 Visão Geral

Kubernetes (K8s) é uma plataforma de orquestração de containers open-source que automatiza o deploy, scaling e gerenciamento de aplicações containerizadas.

📋 Conceitos Fundamentais

Cluster

O que é: Conjunto de máquinas (nodes) que executam aplicações containerizadas.

Componentes:

  • Master Node: Controla o cluster
  • Worker Nodes: Executam as aplicações
  • Control Plane: Gerencia o estado do cluster

Pod

O que é: Menor unidade deployável no Kubernetes.

Características:

  • Pode conter um ou mais containers
  • Compartilha rede e storage
  • Lifecycle efêmero
yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80

Deployment

O que é: Recurso que gerencia replicas de Pods.

Benefícios:

  • Rolling updates
  • Rollback automático
  • Scaling horizontal
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.19
        ports:
        - containerPort: 80

Service

O que é: Abstração que expõe aplicações rodando em Pods.

Tipos:

  • ClusterIP: Acesso interno
  • NodePort: Acesso externo via porta do node
  • LoadBalancer: Acesso externo via load balancer
yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: LoadBalancer

🏗️ Arquitetura do Cluster

Control Plane Components

kube-apiserver

  • API REST do Kubernetes
  • Ponto de entrada para todas as operações
  • Valida e processa requests

etcd

  • Banco de dados distribuído
  • Armazena configuração do cluster
  • Fonte única da verdade

kube-scheduler

  • Escolhe nodes para novos Pods
  • Considera recursos disponíveis
  • Políticas de scheduling

kube-controller-manager

  • Gerencia controllers do cluster
  • Node controller, replication controller
  • Mantém estado desejado

Worker Node Components

kubelet

  • Agente em cada node
  • Gerencia Pods no node
  • Comunica com API server

kube-proxy

  • Proxy de rede
  • Implementa Service concept
  • Load balancing

Container Runtime

  • Docker, containerd, CRI-O
  • Executa containers
  • Gerencia isolamento

📦 Recursos Principais

ConfigMap

O que é: Armazena dados de configuração não-confidenciais.

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  database_url: "postgresql://localhost:5432/mydb"
  log_level: "INFO"

Secret

O que é: Armazena dados sensíveis (senhas, tokens).

yaml
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  username: YWRtaW4=  # base64 encoded
  password: cGFzc3dvcmQ=

PersistentVolume (PV)

O que é: Recurso de storage no cluster.

yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-example
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

PersistentVolumeClaim (PVC)

O que é: Request por storage persistente.

yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-example
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

🔄 Networking

Pod Network

  • Cada Pod tem IP único
  • Comunicação direta entre Pods
  • CNI (Container Network Interface)

Service Network

  • Abstração sobre Pods
  • Load balancing automático
  • DNS interno

Ingress

O que é: Gerencia acesso externo aos serviços.

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
spec:
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: app-service
            port:
              number: 80

📊 Monitoramento e Observabilidade

Liveness Probe

O que é: Verifica se aplicação está viva.

yaml
livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10

Readiness Probe

O que é: Verifica se aplicação está pronta para receber tráfego.

yaml
readinessProbe:
  httpGet:
    path: /ready
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5

Resource Limits

O que é: Define limites de recursos para containers.

yaml
resources:
  requests:
    memory: "64Mi"
    cpu: "250m"
  limits:
    memory: "128Mi"
    cpu: "500m"

🚀 Deploy e Scaling

Horizontal Pod Autoscaler (HPA)

O que é: Escala automaticamente baseado em métricas.

yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: app-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

Rolling Update

O que é: Atualiza aplicação sem downtime.

bash
kubectl set image deployment/app-deployment app=nginx:1.20

Rollback

O que é: Reverte para versão anterior.

bash
kubectl rollout undo deployment/app-deployment

🔧 Ferramentas e Comandos

kubectl - Comandos Essenciais

Informações do Cluster

bash
kubectl cluster-info
kubectl get nodes
kubectl get pods --all-namespaces

Gerenciamento de Pods

bash
kubectl get pods
kubectl describe pod <pod-name>
kubectl logs <pod-name>
kubectl exec -it <pod-name> -- /bin/bash

Deploy e Scaling

bash
kubectl apply -f deployment.yaml
kubectl scale deployment <name> --replicas=5
kubectl rollout status deployment/<name>

Debugging

bash
kubectl port-forward <pod-name> 8080:80
kubectl top pods
kubectl get events

🛠️ Desenvolvimento Local

Minikube

O que é: Cluster Kubernetes local para desenvolvimento.

bash
# Instalar Minikube
minikube start
minikube dashboard

# Parar cluster
minikube stop

Docker Desktop

O que é: Inclui Kubernetes local integrado.

kind (Kubernetes in Docker)

O que é: Ferramenta para criar clusters locais usando Docker.

bash
# Criar cluster
kind create cluster

# Listar clusters
kind get clusters

# Deletar cluster
kind delete cluster

📚 Helm

O que é Helm

Package manager para Kubernetes que simplifica deploy de aplicações complexas.

Conceitos

  • Chart: Pacote Helm
  • Release: Instância de Chart
  • Repository: Repositório de Charts

Comandos Básicos

bash
# Instalar aplicação
helm install my-app ./chart

# Listar releases
helm list

# Atualizar release
helm upgrade my-app ./chart

# Desinstalar
helm uninstall my-app

🔒 Segurança

RBAC (Role-Based Access Control)

O que é: Controle de acesso baseado em roles.

yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

Network Policies

O que é: Controla comunicação entre Pods.

yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

Security Context

O que é: Define configurações de segurança para Pods/Containers.

yaml
securityContext:
  runAsNonRoot: true
  runAsUser: 1000
  fsGroup: 2000

📊 Monitoramento

Prometheus + Grafana

  • Coleta métricas do cluster
  • Dashboards de visualização
  • Alertas automáticos

ELK Stack

  • Elasticsearch: Armazena logs
  • Logstash: Processa logs
  • Kibana: Visualização

Jaeger

  • Distributed tracing
  • Análise de performance
  • Debug de microservices

🚨 Troubleshooting

Problemas Comuns

Pod não inicia

bash
kubectl describe pod <pod-name>
kubectl logs <pod-name>
kubectl get events --sort-by='.lastTimestamp'

Service não funciona

bash
kubectl get endpoints
kubectl describe service <service-name>
kubectl get pods -l app=<label>

Storage issues

bash
kubectl get pv
kubectl get pvc
kubectl describe pvc <pvc-name>

📖 Melhores Práticas

Design de Aplicações

  • Stateless: Evite estado em Pods
  • Health Checks: Implemente probes
  • Resource Limits: Defina limites claros
  • Security: Use security contexts

Deploy

  • Rolling Updates: Use Deployments
  • Blue-Green: Para zero downtime
  • Canary: Para testes graduais
  • Rollback: Sempre possível

Monitoramento

  • Logs: Centralize logs
  • Métricas: Monitore recursos
  • Alertas: Configure alertas
  • Tracing: Para microservices

🔗 Service Mesh e Istio

O que é Service Mesh

Service Mesh é uma camada de infraestrutura que gerencia comunicação entre serviços em um cluster Kubernetes. Fornece funcionalidades como observabilidade, segurança e controle de tráfego.

Istio - Implementação Principal

yaml
# Istio Virtual Service
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: api-gateway
spec:
  hosts:
  - api.example.com
  gateways:
  - api-gateway
  http:
  - route:
    - destination:
        host: api-service
        subset: v1
      weight: 90
    - destination:
        host: api-service
        subset: v2
      weight: 10

Traffic Management

yaml
# Destination Rule
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: api-service
spec:
  host: api-service
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

Circuit Breaker

yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: circuit-breaker
spec:
  host: api-service
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100
      http:
        http1MaxPendingRequests: 1024
        maxRequestsPerConnection: 10
    outlierDetection:
      consecutive5xxErrors: 5
      interval: 10s
      baseEjectionTime: 30s

Security com mTLS

yaml
# Peer Authentication
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: istio-system
spec:
  mtls:
    mode: STRICT

# Authorization Policy
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: api-policy
  namespace: default
spec:
  selector:
    matchLabels:
      app: api-service
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/default/sa/api-client"]
    to:
    - operation:
        methods: ["GET"]
        paths: ["/api/public/*"]

Observabilidade Avançada

yaml
# Telemetry Configuration
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
  name: mesh-telemetry
  namespace: istio-system
spec:
  tracing:
  - randomSamplingPercentage: 10.0
  metrics:
  - providers:
    - name: prometheus

Canary Deployment

yaml
# Virtual Service para Canary
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: canary-deployment
spec:
  hosts:
  - api.example.com
  http:
  - route:
    - destination:
        host: api-service
        subset: stable
      weight: 95
    - destination:
        host: api-service
        subset: canary
      weight: 5

Fault Injection

yaml
# Fault Injection para Testing
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: fault-injection
spec:
  hosts:
  - api.example.com
  http:
  - fault:
      delay:
        percentage:
          value: 10
        fixedDelay: 5s
      abort:
        percentage:
          value: 5
        httpStatus: 500
    route:
    - destination:
        host: api-service

Rate Limiting

yaml
# EnvoyFilter para Rate Limiting
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: rate-limit
  namespace: istio-system
spec:
  workloadSelector:
    labels:
      app: api-service
  configPatches:
  - applyTo: HTTP_FILTER
    match:
      context: SIDECAR_INBOUND
      listener:
        filterChain:
          filter:
            name: envoy.filters.network.http_connection_manager
    patch:
      operation: INSERT_BEFORE
      value:
        name: envoy.filters.http.ratelimit
        typed_config:
          "@type": type.googleapis.com/udpa.type.v1.TypedStruct
          type_url: type.googleapis.com/envoy.extensions.filters.http.ratelimit.v3.RateLimit

📚 Recursos Adicionais

Documentação Oficial

Cursos e Tutoriais

Ferramentas

  • Lens: IDE para Kubernetes
  • K9s: Terminal UI para Kubernetes
  • Helm: Package manager
  • ArgoCD: GitOps tool
  • Kiali: Service Mesh observability

Livros Recomendados

  • "Kubernetes: Up and Running" - Kelsey Hightower
  • "The Kubernetes Book" - Nigel Poulton
  • "Kubernetes Patterns" - Bilgin Ibryam
  • "Istio in Action" - Christian Posta

🎯 Conclusão

Kubernetes revolucionou o deploy e gerenciamento de aplicações containerizadas. Dominar seus conceitos fundamentais é essencial para desenvolvedores que trabalham com aplicações modernas e distribuídas. A plataforma oferece ferramentas poderosas para orquestração, scaling e observabilidade de aplicações em produção.

Service Mesh com Istio adiciona uma camada de inteligência para gerenciar comunicação entre serviços, fornecendo observabilidade avançada, segurança robusta e controle granular de tráfego.