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:
minikube startcria um cluster Kubernetes local de nó único.- O cluster usa Docker como o driver padrão.
- Kubernetes v1.26.1 é configurado automaticamente.
minikube statusekubectl get nodesconfirmam 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:
- Criamos um Deployment com 3 réplicas de um servidor web NGINX.
- Usamos uma versão específica e estável do NGINX (1.23.3-alpine).
- Expomos a porta do container 80.
- 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:
- Use
kubectl applypara atualizar deployments. - Kubernetes realiza uma atualização contínua (rolling update) por padrão.
- Os pods são substituídos gradualmente para manter a disponibilidade da aplicação.
- 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:
- Todos os pods estão executando a nova versão da imagem.
- O deployment tem 3 réplicas disponíveis.
- A estratégia de rollout garante atualizações sem tempo de inatividade (zero-downtime).
- 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:
- Use
kubectl describepara visualizar eventos de deployment e pod. - Verifique o status do pod para
ImagePullBackOffou outros estados de erro. - Examine os logs do pod para obter informações detalhadas sobre o erro.
- 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:
kubectl rollout undoreverte para a revisão de deployment anterior.- O Kubernetes mantém um histórico das alterações de deployment.
- A reversão é realizada com zero tempo de inatividade (zero downtime).
- 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:
maxUnavailable: Número máximo de pods que podem estar indisponíveis durante a atualização.maxSurge: Número máximo de pods que podem ser criados acima do número desejado.- Ajuda a controlar a velocidade da atualização e a disponibilidade da aplicação.
- 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.


