Atualizar e Reverter Aplicações

KubernetesBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como atualizar e reverter aplicações implantadas em um cluster Kubernetes. Começará configurando um cluster Kubernetes local usando Minikube, e em seguida implantará uma aplicação NGINX de exemplo. Em seguida, você atualizará a imagem da aplicação e verificará a atualização bem-sucedida. Para simular falhas de atualização, você diagnosticará problemas e, em seguida, reverterá para uma versão estável. Finalmente, você ajustará a estratégia de atualização contínua (rolling update) no arquivo YAML do Deployment.

Iniciar o Cluster Kubernetes

Nesta etapa, você aprenderá como iniciar e verificar um cluster Kubernetes local usando Minikube. Este é um primeiro passo crucial para configurar seu ambiente de desenvolvimento Kubernetes.

Primeiro, certifique-se de estar no diretório do projeto:

cd ~/project

Inicie o cluster Minikube:

minikube start

Exemplo de saída:

😄  minikube v1.29.0 on Ubuntu 22.04
✨  Automatically selected the docker driver
📌  Using Docker driver with root permissions
🔥  Creating kubernetes in kubernetes cluster
🔄  Restarting existing kubernetes cluster
🐳  Preparing Kubernetes v1.26.1 on Docker 20.10.23 ...
🚀  Launching Kubernetes ...
🌟  Enabling addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace

Verifique o status do cluster:

minikube status

Exemplo de saída:

minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

Verifique os nós do cluster:

kubectl get nodes

Exemplo de saída:

NAME       STATUS   ROLES           AGE   VERSION
minikube   Ready    control-plane   1m    v1.26.1

Pontos-chave sobre esta etapa:

  1. minikube start cria um cluster Kubernetes local de nó único.
  2. O cluster usa Docker como o driver padrão.
  3. Kubernetes v1.26.1 é configurado automaticamente.
  4. minikube status e kubectl get nodes confirmam a prontidão do cluster.

Implantar uma Aplicação de Exemplo

Nesta etapa, você aprenderá como criar e implantar uma aplicação web simples usando um Deployment Kubernetes. Usaremos uma imagem NGINX como nossa aplicação de exemplo para demonstrar o processo de implantação.

Primeiro, navegue até o diretório do projeto:

cd ~/project
mkdir -p k8s-manifests
cd k8s-manifests

Crie um novo manifesto de deployment para uma aplicação web:

nano nginx-deployment.yaml

Adicione o seguinte conteúdo ao arquivo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  labels:
    app: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: nginx
          image: nginx:1.23.3-alpine
          ports:
            - containerPort: 80

Salve o arquivo e saia do editor nano.

Implante a aplicação usando kubectl:

kubectl apply -f nginx-deployment.yaml

Exemplo de saída:

deployment.apps/web-app created

Verifique a implantação:

kubectl get deployments

Exemplo de saída:

NAME      READY   UP-TO-DATE   AVAILABLE   AGE
web-app   3/3     3            3           30s

Verifique os pods criados:

kubectl get pods -l app=web

Exemplo de saída:

NAME                      READY   STATUS    RESTARTS   AGE
web-app-xxx-yyy           1/1     Running   0          45s
web-app-xxx-zzz           1/1     Running   0          45s
web-app-xxx-www           1/1     Running   0          45s

Pontos-chave sobre esta implantação:

  1. Criamos um Deployment com 3 réplicas de um servidor web NGINX.
  2. Usamos uma versão específica e estável do NGINX (1.23.3-alpine).
  3. Expomos a porta do container 80.
  4. Usamos rótulos (labels) para identificar e gerenciar os pods.

Atualizar a Imagem da Aplicação no YAML do Deployment

Nesta etapa, você aprenderá como atualizar a imagem do container em um Deployment Kubernetes, simulando um cenário de atualização de aplicação do mundo real.

Primeiro, certifique-se de estar no diretório correto:

cd ~/project/k8s-manifests

Abra o manifesto de deployment existente:

nano nginx-deployment.yaml

Atualize a imagem de nginx:1.23.3-alpine para uma versão mais recente:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  labels:
    app: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: nginx
          image: nginx:1.24.0-alpine
          ports:
            - containerPort: 80

Aplique o deployment atualizado:

kubectl apply -f nginx-deployment.yaml

Exemplo de saída:

deployment.apps/web-app configured

Observe o processo de atualização do deployment:

kubectl rollout status deployment web-app

Exemplo de saída:

Waiting for deployment "web-app" to roll out...
Waiting for deployment spec update to be applied...
Waiting for available replicas to reach desired number...
deployment "web-app" successfully rolled out

Verifique a nova versão da imagem:

kubectl get pods -l app=web -o jsonpath='{.items[*].spec.containers[0].image}'

Exemplo de saída:

nginx:1.24.0-alpine nginx:1.24.0-alpine nginx:1.24.0-alpine

Pontos-chave sobre atualizações de imagem:

  1. Use kubectl apply para atualizar deployments.
  2. Kubernetes realiza uma atualização contínua (rolling update) por padrão.
  3. Os pods são substituídos gradualmente para manter a disponibilidade da aplicação.
  4. O processo de atualização garante uma implantação sem tempo de inatividade (zero-downtime).

Verificar a Atualização Bem-Sucedida

Nesta etapa, você aprenderá como verificar a atualização bem-sucedida do seu deployment Kubernetes, examinando as versões dos pods, o status e detalhes adicionais do deployment.

Primeiro, liste os pods com informações detalhadas:

kubectl get pods -l app=web -o wide

Exemplo de saída:

NAME                      READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
web-app-xxx-yyy           1/1     Running   0          3m    10.244.0.5   minikube   <none>           <none>
web-app-xxx-zzz           1/1     Running   0          3m    10.244.0.6   minikube   <none>           <none>
web-app-xxx-www           1/1     Running   0          3m    10.244.0.7   minikube   <none>           <none>

Verifique as versões específicas das imagens dos pods:

kubectl get pods -l app=web -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}'

Exemplo de saída:

web-app-xxx-yyy    nginx:1.24.0-alpine
web-app-xxx-zzz    nginx:1.24.0-alpine
web-app-xxx-www    nginx:1.24.0-alpine

Descreva o deployment para obter informações mais detalhadas:

kubectl describe deployment web-app

Exemplo de saída:

Name:                   web-app
Namespace:              default
CreationTimestamp:      [current timestamp]
Labels:                 app=web
Annotations:            deployment.kubernetes.io/revision: 2
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=web
  Containers:
   nginx:
    Image:        nginx:1.24.0-alpine
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable

Verifique o histórico de rollout:

kubectl rollout history deployment web-app

Exemplo de saída:

REVISION  CHANGE-CAUSE
1         <none>
2         <none>

Pontos-chave sobre a verificação:

  1. Todos os pods estão executando a nova versão da imagem.
  2. O deployment tem 3 réplicas disponíveis.
  3. A estratégia de rollout garante atualizações sem tempo de inatividade (zero-downtime).
  4. A revisão do deployment foi incrementada.

Simular e Diagnosticar Falhas de Atualização

Nesta etapa, você aprenderá como diagnosticar potenciais falhas de atualização de deployment, simulando uma atualização de imagem problemática e usando ferramentas de diagnóstico Kubernetes.

Primeiro, navegue até o diretório do projeto:

cd ~/project/k8s-manifests

Crie um manifesto de deployment com uma imagem inválida:

nano problematic-deployment.yaml

Adicione o seguinte conteúdo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: troubleshoot-app
  labels:
    app: troubleshoot
spec:
  replicas: 3
  selector:
    matchLabels:
      app: troubleshoot
  template:
    metadata:
      labels:
        app: troubleshoot
    spec:
      containers:
        - name: nginx
          image: nginx:non-existent-tag
          ports:
            - containerPort: 80

Aplique o deployment problemático:

kubectl apply -f problematic-deployment.yaml

Exemplo de saída:

deployment.apps/troubleshoot-app created

Verifique o status do deployment:

kubectl rollout status deployment troubleshoot-app

Exemplo de saída:

Waiting for deployment "troubleshoot-app" to roll out...

Pressione Ctrl+C para sair do status de rollout.

Verifique os eventos e o status do pod:

kubectl get pods -l app=troubleshoot

Exemplo de saída:

NAME                              READY   STATUS             RESTARTS   AGE
troubleshoot-app-6b8986c555-gcjj9   0/1     ImagePullBackOff   0          2m56s
troubleshoot-app-6b8986c555-p29dp   0/1     ImagePullBackOff   0          2m56s
troubleshoot-app-6b8986c555-vpv5q   0/1     ImagePullBackOff   0          2m56s

Examine os detalhes e logs do pod:

## Replace 'xxx-yyy' with your actual pod name
POD_NAME=$(kubectl get pods -l app=troubleshoot -o jsonpath='{.items[0].metadata.name}')
kubectl describe pod $POD_NAME
kubectl logs $POD_NAME

Você verá o status do pod e os logs indicando a falha na busca da imagem.

Failed to pull image "nginx:non-existent-tag"

Solucione o problema corrigindo a imagem:

nano problematic-deployment.yaml

Atualize a imagem para uma tag válida:

image: nginx:1.24.0-alpine

Reaplique o deployment corrigido:

kubectl apply -f problematic-deployment.yaml

Verifique o status do pod novamente:

kubectl get pods -l app=troubleshoot

Exemplo de saída:

NAME                                READY   STATUS    RESTARTS   AGE
troubleshoot-app-5dc9b58d57-bvqbr   1/1     Running   0          5s
troubleshoot-app-5dc9b58d57-tdksb   1/1     Running   0          8s
troubleshoot-app-5dc9b58d57-xdq5n   1/1     Running   0          6s

Pontos-chave sobre o diagnóstico de falhas:

  1. Use kubectl describe para visualizar eventos de deployment e pod.
  2. Verifique o status do pod para ImagePullBackOff ou outros estados de erro.
  3. Examine os logs do pod para obter informações detalhadas sobre o erro.
  4. Verifique a disponibilidade da imagem e a correção da tag.

Reverter para uma Versão Estável

Nesta etapa, você aprenderá como reverter um deployment Kubernetes para uma versão estável anterior usando o comando kubectl rollout undo.

Primeiro, navegue até o diretório do projeto:

cd ~/project/k8s-manifests

Verifique o histórico de rollout da aplicação web:

kubectl rollout history deployment web-app

Exemplo de saída:

REVISION  CHANGE-CAUSE
1         <none>
2         <none>

Verifique os detalhes do deployment atual:

kubectl describe deployment web-app | grep Image

Exemplo de saída:

    Image:        nginx:1.24.0-alpine

Realize a reversão para a revisão anterior:

kubectl rollout undo deployment web-app

Exemplo de saída:

deployment.apps/web-app rolled back

Verifique a reversão:

kubectl rollout status deployment web-app

Exemplo de saída:

Waiting for deployment "web-app" to roll out...
deployment "web-app" successfully rolled out

Verifique a versão da imagem atualizada:

kubectl get pods -l app=web -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}'

Exemplo de saída:

web-app-xxx-yyy    nginx:1.23.3-alpine
web-app-xxx-zzz    nginx:1.23.3-alpine
web-app-xxx-www    nginx:1.23.3-alpine

Confirme o histórico de rollout:

kubectl rollout history deployment web-app

Exemplo de saída:

REVISION  CHANGE-CAUSE
2         <none>
3         <none>

Pontos-chave sobre a reversão:

  1. kubectl rollout undo reverte para a revisão de deployment anterior.
  2. O Kubernetes mantém um histórico das alterações de deployment.
  3. A reversão é realizada com zero tempo de inatividade (zero downtime).
  4. A reversão cria uma nova revisão no histórico.

Ajustar a Estratégia de Rolling Update no YAML do Deployment

Nesta etapa, você aprenderá como personalizar a estratégia de rolling update em um Deployment Kubernetes para controlar como as aplicações são atualizadas e escaladas.

Primeiro, navegue até o diretório do projeto:

cd ~/project/k8s-manifests

Crie um novo manifesto de deployment com uma estratégia de rolling update personalizada:

nano custom-rollout-deployment.yaml

Adicione o seguinte conteúdo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app-custom-rollout
  labels:
    app: web
spec:
  replicas: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 2
      maxSurge: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: nginx
          image: nginx:1.24.0-alpine
          ports:
            - containerPort: 80

Aplique o deployment:

kubectl apply -f custom-rollout-deployment.yaml

Exemplo de saída:

deployment.apps/web-app-custom-rollout created

Verifique o status do deployment:

kubectl rollout status deployment web-app-custom-rollout

Exemplo de saída:

Waiting for deployment "web-app-custom-rollout" to roll out...
deployment "web-app-custom-rollout" successfully rolled out

Descreva o deployment para confirmar a estratégia:

kubectl describe deployment web-app-custom-rollout

O exemplo de saída incluirá:

StrategyType:           RollingUpdate
RollingUpdateStrategy:  2 max unavailable, 3 max surge

Atualize a imagem para acionar um rolling update:

kubectl set image deployment/web-app-custom-rollout nginx=nginx:1.25.0-alpine

Monitore o processo de atualização:

kubectl rollout status deployment web-app-custom-rollout

Pontos-chave sobre a estratégia de rolling update:

  1. maxUnavailable: Número máximo de pods que podem estar indisponíveis durante a atualização.
  2. maxSurge: Número máximo de pods que podem ser criados acima do número desejado.
  3. Ajuda a controlar a velocidade da atualização e a disponibilidade da aplicação.
  4. Permite o ajuste fino do comportamento do deployment.

Resumo

Neste laboratório, você aprendeu como iniciar e verificar um cluster Kubernetes local usando o Minikube, que é um primeiro passo crucial na configuração do seu ambiente de desenvolvimento Kubernetes. Você também aprendeu como criar e implantar uma aplicação web simples usando um Deployment Kubernetes, utilizando uma imagem NGINX como a aplicação de exemplo. O processo de implantação envolveu a criação de um arquivo de manifesto de deployment e sua aplicação ao cluster.

Após implantar a versão inicial da aplicação, você aprenderá como atualizar a imagem da aplicação no YAML do deployment, verificar a atualização bem-sucedida, simular e diagnosticar falhas de atualização, reverter para uma versão estável e ajustar a estratégia de rolling update no YAML do deployment.