Day 3
Sumário
- 🎥 Intro Day-3 - 01:17
 - 🎥 O que é um Deployment? - 05:44
 - 🎥 Criando um Deployment através de um manifesto - 14:36
 - 🎥 Criando mais Deployments e vendo os detalhes - 11:22
 - 🎥 Como atualizar um Deployment? - 10:06
 - 🎥 Estratégias de atualizações de nossos Deployments - 16:18
 - 🎥 Fazendo Rollback e conhecendo o comando Rollout - 16:23
 - 🎥 Encerramento Day-3 - 01:04
 - 📖 Leitura complementar do Day-3 - 17:25
 - 📖 Download da leitura complementar do Day-3
 - 📝 Desafio do Day-3
 
Legenda
🎥 - Aula gravada
📖 - Material complementar
📝 - Atividade
Dia 3
No dia 3, você aprenderá sobre Deployments, que são responsáveis por gerenciar a implantação de aplicações no Kubernetes. Você aprenderá a criar, gerenciar e monitorar Deployments, além de aprender a atualizar, fazer rollback e conhecer as estratégias de atualizações de Deployments.
Material complementar: Leitura complementar do Day-3
O que é um Deployment?
O Deployment é um recurso do Kubernetes que é responsável por gerenciar a implantação de aplicações. Ele é responsável por garantir que um conjunto de pods esteja sempre em execução e disponível para os usuários.
O Deployment permite que você defina o número de réplicas de um pod, a estratégia de atualização, o controle de falhas e o controle de versão da aplicação.
Criando um Deployment através de um manifesto
Para criar um Deployment através de um manifesto, você precisa criar um arquivo YAML com a definição do Deployment e aplicar o arquivo YAML no cluster.
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deployment
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-deployment
  strategy: {}
  template:
    metadata:
      labels:
        app: nginx-deployment
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          resources:
            limits:
              memory: "128Mi"
              cpu: "500m"
            requests:
              memory: "64Mi"
              cpu: "250m"
Para aplicar o arquivo YAML no cluster, você pode utilizar o comando:
kubectl apply -f nginx-deployment.yaml
Para listar os Deployments em execução no cluster, você pode utilizar o comando:
kubectl get deployments
# ou
kubectl get pods -l app=nginx-deployment
# ou
kubectl get replicasets -l app=nginx-deployment
Criando mais Deployments e vendo os detalhes
Você consegue criar um deployment sem precisar criar um arquivo yaml, utilizando o comando kubectl create deployment <nome-do-deployment> --image=<nome-da-imagem>.
kubectl create deployment nginx-deployment --image=nginx --replicas=3
Para saber mais detalhes sobre um Deployment específico, você pode utilizar o comando:
kubectl describe deployment <nome-do-deployment>
# exemplo
kubectl describe deployment nginx-deployment
Como atualizar um Deployment?
Para atualizar um Deployment, você pode editar o arquivo YAML do Deployment e aplicar as alterações no cluster.
kubectl apply -f nginx-deployment.yaml
Ou você pode utilizar o comando kubectl set image deployment/<nome-do-deployment> <container>=<nova-imagem>.
kubectl set image deployment/nginx-deployment nginx=nginx:1.19
Estratégias de atualizações de nossos Deployments
O Kubernetes oferece diferentes estratégias de atualizações de Deployments, como a estratégia Recreate e RollingUpdate.
- 
Recreate: Nessa estratégia, o Kubernetes remove todos os pods antigos e cria novos pods com a nova versão da aplicação. Essa estratégia é mais rápida, mas pode causar indisponibilidade da aplicação durante a atualização.
 - 
RollingUpdate: Nessa estratégia, o Kubernetes atualiza os pods gradualmente, um a um, garantindo que a aplicação esteja sempre disponível. O termo Surge é utilizado para definir o número de pods que serão criados antes de remover os pods antigos, e o termo MaxUnavailable é utilizado para definir o número máximo de pods que podem ficar indisponíveis durante a atualização.
 
Você consegue ver como está a atualização do seu deployment utilizando o comando kubectl rollout status deployment/<nome-do-deployment>.
kubectl rollout status deployment/nginx-deployment
Fazendo Rollback
Para fazer um rollback de um Deployment, você pode utilizar o comando kubectl rollout undo deployment/<nome-do-deployment>.
kubectl rollout undo deployment/nginx-deployment
Você pode ver o histórico de atualizações de um Deployment utilizando o comando kubectl rollout history deployment/<nome-do-deployment>.
kubectl rollout history deployment/nginx-deployment
Da mesma forma, você pode fazer um rollback para uma revisão específica utilizando o comando kubectl rollout undo deployment/<nome-do-deployment> --to-revision=<número-da-revisão>.
kubectl rollout undo deployment/nginx-deployment --to-revision=2
E se você não sabe qual revisão deseja fazer o rollback, você pode ver o histórico de revisões e escolher a revisão desejada para verificar as alterações feitas.
kubectl rollout history deployment/nginx-deployment --revision=2
Desafio
Objetivos
O nosso objetivo aqui é fazer a instalação do Nginx!
Atenção! 📢
Corrija todos os erros encontrados e realize o deploy do Nginx utilizando o arquivo deployment.yaml.
Tarefas
- Utilize o arquivo /root/deployment.yaml para realizar o deploy do nosso Deployment;
 - Corrija todos os erros;
 - Configure o limite de utilização de recursos da seguinte maneira:
- Requests:
- 64Mi de Memória;
 - 0.1 de CPU;
 
 - Limits:
- 128 Mi de Memória;
 - 0.3 de CPU;
 
 
 - Requests:
 - Use a estratégia de atualização do Deployment que atualiza todos os pods de uma vez;
 - A versão do Nginx deve ser a 1.16.0.
 
apiVersion: app/v1
kind: Deployment
metadata:
  label:
    app: nginx-girus
    opa: sensacional-juvenal
name: nginx-girus
specs:
  replicas: 5
    selector:
      matchLabels:
      app: nginx-girus
  strategies:
    type: recreate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 2
  strategies: {}
  replicas: 2
  template:
    metadata:
    label:
      app: nginx
    specs:
      containers:
      - image: nginx 1.15.0
        name: nginx
        resource: {}
Solução
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-girus
    opa: sensacional-juvenal
  name: nginx-girus
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-girus
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - image: nginx:1.16.0
          name: nginx
          resources:
            limits:
              memory: "128Mi"
              cpu: "300m"
            requests:
              memory: "64Mi"
              cpu: "100m"