Docker Swarm e Kubernetes

Orquestradores de Containers

Guilherme Moreira - 28/06/22 - CBLab
https://minikube.sigs.k8s.io/docs/start/

Orquestradores de Containers

O que são?

Automatizam o deploy e gerenciamento de aplicações em containers.

Pra quê?

Docker Swarm

vs

Kubernetes

Docker Swarm

Vantagens

  1. Instalação Simples
  2. Menos complexidade
  3. Load Balancing automático
  4. Integrado diretamente com Docker

Desvantagens

  1. Automação não muito potente
  2. Depende do Docker

Kubernetes

Vantagens

  1. Grande ecossistema
  2. Qualquer OS
  3. Grandes arquiteturas e automações complexas
  4. Scaling automático
  5. Monitoramento integrado (GUI Web)

Desvantagens

  1. Complexo, curva de aprendizado íngreme
  2. Load Balancing deve ser configurado manualmente
  3. Ferramentas distintas

kubernetes!

Arquitetura

Objetos

Objetos são entidades pesistentes em um cluster.

Kubertenes usa essas entidades para representar o estado atual do cluster.

  • Quais aplicações estão rodando
  • Quais os recursos alocados
  • Quais os comportamentos dessas aplicações (upgrades, auto-restart)

Objetos

Esses objetos são modificados por meio da API do Kubernetes.

O kubectl faz as chamadas necessárias na API.

É possível usar a API diretamente.

Objetos

Tipicamente, os objetos são descritos usando arquivos yaml, que são passados para o kubectl.

Objetos


            apiVersion: apps/v1
            kind: Deployment
            metadata:
              name: nginx-deployment
            spec:
              selector:
                matchLabels: nginx
              replicas: 2
              template:
                metadata:
                  labels:
                    app:nginx
                spec:
                  containers:
                  - name: nginx
                    image: nginx:latest
                    ports:
                    - containerPort: 80
          
Exemplo de um deployment do Nginx

Objetos

Campos obrigatórios

  • apiVersion: Versão da API do Kubernetes
  • kind: Tipo de objeto que será criado
  • metadata: Dados que identificam o objeto criado, incluindo um nome
  • spec: Qual o estado do objeto

Objetos

Pod

Um Pod é a unidade básica de um cluster. Geralmente contém um ou mais containers.

São efêmeros por design, então podem ser destruídos em qualquer momento.

Containers em um pod compartilham rede, armazenamento e lifecycle, e podem se comunicar diretamente, além de serem iniciados e destruídos ao mesmo tempo.

Objetos

ReplicationController

Usado para criar múltiplas cópias de um mesmo Pod em um cluster.

Garante que um número determinado de Pods estejam rodando em qualquer momento.

Se um Pod morrer, o ReplicationController cria outro para substituí-lo.

Objetos

ReplicaSet

Uma alternativa mais poderosa ao ReplicationController.

Não são feitos para serem criados diretamente, geralmente são criados automaticamente por outros objetos.

Objetos

Deployment

Usados para gerenciar Pods.

A primeira coisa que um Deployment faz é criar um ReplicaSet.

São usados para escalar a aplicação, aumentando e diminuindo a quantidade de Pods rodando.

Objetos

DaemonSet

Outro objeto que gerencia os Pods de um cluster.

Garante que um pod em particular seja executado em todos os nós que compõem um cluster.

Útil para monitoramento ou logging.

Objetos

Namespace

Organiza os objetos em um cluster.

Permite que recursos sejam agrupados e ações sejam executadas nesses recursos.

Útil para separar ambientes de stagine e produção, evitando conflitos de nome.

Objetos

ConfigMap

Separam a configuração dos containers.

Permitem que dados sejam alterados dinâmicamente em containers.

Usados para informações não-sensíveis.

Estudo de caso: Spotify

https://kubernetes.io/case-studies/spotify/

200 milhões de usuários

Muitos microserviços

Usavam uma solução feita por eles, chamada Helios

Helios foi criado em 2014, antes de qualquer solução open-source para orquestramento de containers.

Decidiram mudar para Kubernetes em 2017.

Em 2020, completaram a migração completa para Kubernetes.

Observaram impacto positivo em todas as métricas coletadas, como tempo de deploy e velocidade para servir mídia.

Minikube

“Distribuição” de k8s para uso local.

setup


            $ sudo ln -s $(which minikube) /usr/local/bin/kubectl
            $ minikube start
          

            $ minikube get pods -A
          

Primeiro deployment


            $ kubectl create deployment hello-minikube \
              --image=k8s.gcr.io/echoserver:1.4

            $ kubectl expose deployment hello-minikube \
              --type=NodePort --port=8080

            $ kubectl get services hello-minikube

            $ minikube service hello-minikube

            $ kubectl port-forward service/hello-minikube 7080:8080

            $ firefox localhost:7080
          

Uma aplicação mais complexa

Uma aplicação mais complexa


            $ curl -sSL https://is.gd/Ke39BN > application.yaml

            $ less application.yaml
          

Uma aplicação mais complexa


            $ kubectl apply -f application.yaml
            
            $ minikube dashboard

            $ kubectl port-forward svc/frontend 8080:80

            $ kubectl scale deployment frontend --replicas=5
          

Chaos Mesh

Chaos é uma plataforma que permite rodar “experimentos” em clusters.


            $ curl -sSL https://is.gd/8qju6r | bash
          
Tente começar um experimento de “pod failure”.