Programação Concorrente e Distribuída

Orquestração de Containeres

Aula 14 — Kubernetes: conceitos e passo a passo prático
Prof. Newton S. B. Miyoshi
newton.miyoshi@baraodemaua.br
Centro Universitário Barão de Mauá — Ribeirão Preto
Parte 1

Kubernetes

Por que orquestrar containers, e com o quê.

Revisão

Deployment tradicional (apps direto no SO), virtualizado (apps em VMs sobre um hypervisor) e em containers (apps sobre um container runtime)
Do deployment tradicional às VMs e, por fim, aos containers — cada camada compartilha mais do sistema abaixo dela.
Para discutir
?

Supondo que as aplicações rodam em containers com Docker e Docker Compose, quais problemas podemos ter?

Orquestração de Containers

  • Configuração de réplicas.
  • Load balancing.
  • Rollout e rollback automatizados (CI/CD).
  • Self-healing.
  • Gerenciamento de chaves (secrets) e configurações.

Vantagens

  • Infraestrutura declarativa.
  • Facilidade de implantação e atualização de aplicativos.
  • Isolamento e segurança.
  • Gerenciamento de recursos e otimização de custo.
  • Escalabilidade.
  • Alta disponibilidade.

Desvantagens

  • Complexidade.
  • Curva de aprendizado.
  • Customização complexa.
  • Overhead de rede.
  • Recursos mínimos maiores.

Componentes K8s

Cluster Kubernetes: Control Plane com API server, controller manager, cloud controller manager, etcd e scheduler; Nodes com kubelet e kube-proxy
O Control Plane coordena o cluster; cada Node roda o kubelet e o kube-proxy para executar e expor os workloads.

Cluster

  • Control plane — coordenação.
  • Nodes (nós) — workers que executam as aplicações; podem ser um servidor ou uma VM.
Kubernetes Cluster com Nodes, Control Plane e Node Processes destacados

Pods

  • Pod é uma abstração que representa 1 ou mais containers (apps).
    • Compartilham recursos: storage, volumes e rede.
  • Pods rodam em um Node.
Quatro Pods, cada um com seu próprio IP, contendo um ou mais containers e volumes

Nodes, Pods e Containers

Um Node executando o kubelet e o Docker, com vários Pods dentro dele, cada um com seu IP, volumes e containers
Dentro de um Node: o kubelet gerencia os Pods, e cada Pod isola seus containers.

ReplicaSet

  • Conjunto de réplicas de Pods.
  • Responsável por manter um conjunto definido de Pods idênticos rodando.
  • Deployment: abstração que define as políticas gerais (quantas réplicas, estratégia de atualização…).
Deployment contendo um ReplicaSet, que mantém 3 Pods com o label app=A; um Service seleciona esses Pods pelo mesmo label

Services

  • Service é um conjunto de Pods com uma política de acesso.
  • Expõe Pods para fora do cluster (internet) — Load Balancer, IP externo.
Um Service com IP próprio selecionando, via label app=A, os Pods de um ReplicaSet — ignorando um Pod com label diferente

O Service usa um selector (app=A) para saber quais Pods atender — não importa qual ReplicaSet os criou.

Componentes K8s — auto-cura

Pod do Node 1 falha e o Kubernetes o recria no Node 2, ao lado dos outros pods daquele node
Se um Pod cai, o Kubernetes recria os containers — inclusive em outro Node, se preciso.
Parte 2

Kubernetes na prática

Subindo um cluster local com kind.

Para discutir
?

Qual a vantagem de usar Kubernetes para o Café com Pão? E qual o passo a passo para subir a aplicação nele?

Passo a passo — instalar o kind


# Windows, no PowerShell
curl.exe -Lo kind-windows-amd64.exe `
  https://kind.sigs.k8s.io/dl/v0.17.0/kind-windows-amd64
Move-Item .\kind-windows-amd64.exe c:\some-dir-in-your-PATH\kind.exe
        

Instruções para todos os sistemas: kind.sigs.k8s.io/docs/user/quick-start

Passo a passo — Windows com WSL2

Criar o cluster no WSL2, mapeando uma porta do container para o host:


# cluster-config.yml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 30000
    hostPort: 30000
    protocol: TCP
        

kind.sigs.k8s.io/docs/user/using-wsl2

Passo a passo — Windows com WSL2

Criar um service nginx e acessar:


$ kind create cluster --config cluster-config.yml
$ kubectl create deployment nginx --image=nginx --port=80
deployment.apps/nginx created
$ kubectl create service nodeport nginx --tcp=80:80 --node-port=30000
service/nginx created
$ curl localhost:30000
        

Passo a passo — criar cluster com kind


$ kind create cluster
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.25.3)
 ✓ Preparing nodes
 ✓ Writing configuration
 ✓ Starting control-plane
 ✓ Installing CNI
 ✓ Installing StorageClass
Set kubectl context to "kind-kind"

$ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:36771
        

O nome padrão do cluster é kind.

Um Deployment gerencia vários ReplicaSets, e cada ReplicaSet gerencia vários Pods
Um Deployment gerencia um ou mais ReplicaSets ao longo do tempo (ex.: durante um rollout) — cada ReplicaSet mantém seus Pods.

Passo a passo — hello-node


$ kubectl create deployment hello-node --image=registry.k8s.io/echoserver:1.4
$ kubectl get deployments
$ kubectl get pods
$ kubectl get events
$ kubectl expose deployment hello-node --type=LoadBalancer --port=8080
$ kubectl port-forward deployment/hello-node 8080:8080
$ curl http://localhost:8080
        

Configurar Load Balancer

O kind não provisiona um LoadBalancer real — para isso, usa-se o MetalLB.

kind.sigs.k8s.io/docs/user/loadbalancer

Passo a passo — limpando os recursos


$ kubectl delete service hello-node
$ kubectl delete deployment hello-node
$ kubectl get pods
$ kubectl delete pod pod_name
        

Kubernetes Dashboard

Kubernetes Dashboard mostrando uso de CPU, memória e a lista de Pods do namespace kube-system
Interface web para inspecionar e gerenciar o cluster — Pods, uso de CPU/memória, deployments e mais.

WordPress + MySQL + Secrets


$ curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
$ curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml
        

secretGenerator:
- name: mysql-pass
  literals:
  - password=s&nh@123
resources:
- mysql-deployment.yaml
- wordpress-deployment.yaml
        

Depois de ajustar o nodePort no service do WordPress: kubectl apply -k ./ — e para desfazer, kubectl delete -k ./. Tutorial completo ↗

Referências bibliográficas