Como usar o Kubernetes para orquestrar containers em um ambiente DevOps
O Kubernetes é uma plataforma de código aberto que permite automatizar a implantação, o dimensionamento e o gerenciamento de aplicações em containers. Neste artigo, vamos explicar o que são containers, por que eles são úteis para o desenvolvimento de software, como o Kubernetes funciona e como ele pode facilitar a integração e a entrega contínuas (CI/CD) em um ambiente DevOps.
O que são containers e por que usá-los?
Containers são unidades de software que empacotam o código e todas as suas dependências, permitindo que as aplicações sejam executadas de forma isolada e consistente em qualquer ambiente. Eles são diferentes das máquinas virtuais (VMs), que requerem um sistema operacional (SO) completo para cada aplicação. Os containers compartilham o mesmo SO do host, o que reduz o consumo de recursos e aumenta a performance.
Os containers oferecem diversas vantagens para o desenvolvimento de software, tais como:
- Portabilidade: os containers podem ser facilmente movidos entre diferentes plataformas, nuvens ou locais, sem alterar o seu funcionamento.
- Padronização: os containers seguem um formato comum, o que facilita a colaboração entre equipes e a integração com outras ferramentas.
- Modularidade: os containers permitem dividir as aplicações em componentes menores e independentes, que podem ser atualizados, testados e implantados de forma ágil e segura.
- Escalabilidade: os containers podem ser replicados ou removidos rapidamente, de acordo com a demanda, otimizando o uso dos recursos e a disponibilidade das aplicações.
O que é o Kubernetes e como ele funciona?
O Kubernetes é um sistema que orquestra os containers, ou seja, gerencia o seu ciclo de vida, a sua comunicação e a sua distribuição em um cluster de máquinas. Um cluster é um conjunto de nós (nodes), que podem ser físicos ou virtuais, onde os containers são executados. O Kubernetes possui uma arquitetura baseada em mestre/escravo (master/worker), onde há um ou mais nós mestres, responsáveis pelo controle do cluster, e vários nós escravos, responsáveis pela execução dos containers.
O Kubernetes utiliza alguns conceitos-chave para organizar e gerenciar os containers no cluster, tais como:
- Pod: é a menor unidade de implantação do Kubernetes, que consiste em um ou mais containers relacionados, que compartilham o mesmo espaço de rede e armazenamento. Cada pod possui um endereço IP único no cluster e pode se comunicar com outros pods por meio de serviços.
- Serviço: é uma abstração que define um conjunto lógico de pods e uma política de acesso a eles. Um serviço permite que os pods sejam acessados por meio de um nome ou um endereço IP estável, independente da sua localização no cluster.
- Controlador: é um componente que monitora o estado atual do cluster e garante que ele esteja de acordo com o estado desejado, definido pelo usuário. Existem vários tipos de controladores no Kubernetes, como ReplicaSet, Deployment, StatefulSet, DaemonSet, Job e CronJob.
- Namespace: é um mecanismo que permite isolar e agrupar recursos do cluster em diferentes contextos. Cada namespace possui um nome único no cluster e pode conter pods, serviços, controladores e outros objetos. Os namespaces permitem organizar as aplicações por projetos, equipes ou ambientes.
Como usar o Kubernetes em um ambiente DevOps?
DevOps é uma cultura que visa integrar as equipes de desenvolvimento e operações de software, buscando agilizar a entrega de valor para os clientes. Para isso, DevOps utiliza práticas como integração contínua (CI), entrega contínua (CD), infraestrutura como código (IaC), monitoramento e feedback.
O Kubernetes se encaixa perfeitamente nessa cultura, pois oferece recursos que facilitam a implantação e a gestão das aplicações em containers em qualquer ambiente. Além disso, o Kubernetes se integra com diversas ferramentas de DevOps, como Jenkins, GitLab CI/CD, Helm, Terraform, Prometheus e Grafana.
A seguir, vamos mostrar alguns exemplos de como usar o Kubernetes em um ambiente DevOps, utilizando o minikube, uma ferramenta que permite executar um cluster Kubernetes localmente, e o kubectl, uma ferramenta que permite interagir com o cluster por meio de comandos.
Criando um pod com um container
Para criar um pod com um container, podemos usar o comando kubectl run, especificando o nome do pod, a imagem do container e os argumentos opcionais. Por exemplo, para criar um pod chamado hello-pod com um container que executa o comando echo "Hello, Kubernetes!", podemos usar o seguinte comando:
Para verificar se o pod foi criado com sucesso, podemos usar o comando kubectl get pods, que lista todos os pods do namespace atual:
Para ver os logs do container dentro do pod, podemos usar o comando kubectl logs, especificando o nome do pod:
Criando um serviço para expor um pod
Para expor um pod para acesso externo, podemos usar o comando kubectl expose, especificando o nome do pod, o tipo de serviço e a porta. Por exemplo, para criar um serviço chamado hello-service do tipo NodePort, que expõe a porta 8080 do pod hello-pod na porta 30000 do nó, podemos usar o seguinte comando:
kubectl expose pod hello-pod --name=hello-service --type=NodePort --port=8080
Para verificar se o serviço foi criado com sucesso, podemos usar o comando kubectl get services, que lista todos os serviços do namespace atual:
Para acessar o serviço, podemos usar o endereço IP do nó e a porta do serviço. Para obter o endereço IP do nó, podemos usar o comando minikube ip, que retorna o IP do cluster minikube:
Para acessar o serviço, podemos usar o comando curl, especificando o IP do nó e a porta do serviço:
Criando um deployment para gerenciar um conjunto de pods
Para gerenciar um conjunto de pods que executam a mesma aplicação, podemos usar um deployment, que é um controlador que garante que o número de réplicas desejado esteja sempre disponível e atualizado. Para criar um deployment, podemos usar o comando kubectl create deployment, especificando o nome do deployment, a imagem do container e os argumentos opcionais. Por exemplo, para criar um deployment chamado hello-deployment com três réplicas de um container que executa uma aplicação web simples em Python, podemos usar o seguinte comando:
Para verificar se o deployment foi criado com sucesso, podemos usar o comando kubectl get deployments, que lista todos os deployments do namespace atual:
Para ver os pods criados pelo deployment, podemos usar o comando kubectl get pods, que lista todos os pods do namespace atual:
Para expor o deployment para acesso externo, podemos usar o mesmo comando kubectl expose, especificando o nome do deployment, o tipo de serviço e a porta. Por exemplo, para criar um serviço chamado hello-service do tipo LoadBalancer, que expõe a porta 8080 do deployment hello-deployment na porta 80 do balanceador de carga, podemos usar o seguinte comando:
Para verificar se o serviço foi criado com sucesso, podemos usar o comando kubectl get services, que lista todos os serviços do namespace atual:
Para acessar o serviço, podemos usar o comando minikube service, que abre uma janela do navegador com o endereço IP do serviço. Por exemplo, para acessar o serviço hello-service, podemos usar o seguinte comando:
O navegador deve mostrar uma página com a mensagem “Hello, world!” e o nome do pod que atendeu a requisição.
Atualizando um deployment para uma nova versão da aplicação
Para atualizar um deployment para uma nova versão da aplicação, podemos usar o comando kubectl set image, especificando o nome do deployment, o nome do container e a nova imagem do container. Por exemplo, para atualizar o deployment hello-deployment para a versão 2.0 da aplicação web em Python, podemos usar o seguinte comando:
Para verificar se o deployment foi atualizado com sucesso, podemos usar o comando kubectl rollout status, que mostra o progresso da atualização:
Para ver a nova versão da aplicação, podemos acessar novamente o serviço hello-service com o comando minikube service:
O navegador deve mostrar uma página com a mensagem “Hello, Kubernetes!” e o nome do pod que atendeu a requisição.
Manifestos
Um manifesto Kubernetes é um arquivo YAML ou JSON que define um ou mais recursos do Kubernetes, como pods, serviços, deployments, configmaps, secrets, etc. Um manifesto Kubernetes especifica o estado desejado do recurso, como o número de réplicas, a imagem do container, os parâmetros de configuração, etc. O Kubernetes usa o manifesto para criar e gerenciar o recurso no cluster.
Aqui estão alguns exemplos de manifestos Kubernetes:
- Um manifesto que cria um pod com um container que executa o comando echo "Hello, world!":
- Um manifesto que cria um serviço do tipo NodePort que expõe a porta 80 do pod hello-pod na porta 30000 do nó:
- Um manifesto que cria um deployment que gerencia três réplicas de um pod que executa uma aplicação web em Python:
Você pode encontrar mais exemplos de manifestos Kubernetes na documentação oficial (https://www.digitalocean.com/community/cheatsheets/getting-started-with-kubernetes-a-kubectl-cheat-sheet-pt) ou em sites de referência (https://learn.microsoft.com/pt-br/azure/devops/pipelines/tasks/reference/kubernetes-manifest-v0?view=azure-pipelines).
Conclusão
Neste artigo, vimos como usar o Kubernetes para orquestrar containers em um ambiente DevOps. Aprendemos o que são containers e por que eles são úteis para o desenvolvimento de software, como o Kubernetes funciona e como ele pode facilitar a integração e a entrega contínuas (CI/CD) em um ambiente DevOps. Vimos também alguns exemplos de como criar e gerenciar pods, serviços e deployments com o Kubernetes, usando o minikube e o kubectl.
O Kubernetes é uma ferramenta poderosa e flexível que permite automatizar a implantação, o dimensionamento e o gerenciamento de aplicações em containers em qualquer ambiente. Ele se integra com diversas ferramentas de DevOps, como Jenkins, GitLab CI/CD, Helm, Terraform, Prometheus e Grafana. Com o Kubernetes, é possível criar aplicações mais portáteis, padronizadas, modulares e escaláveis.
Referências Bibliográficas:
- Kubernetes Documentation - https://kubernetes.io/docs/home/
- What is Kubernetes? - https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/
- What is a Container? - https://www.docker.com/resources/what-container
- Kubernetes Concepts - https://kubernetes.io/docs/concepts/
- Kubernetes Tutorials - https://kubernetes.io/docs/tutorials/
- Minikube - https://minikube.sigs.k8s.io/docs/start/
- Kubectl Cheat Sheet - https://kubernetes.io/docs/reference/kubectl/cheatsheet/
A Revelo Content Network acolhe todas as raças, etnias, nacionalidades, credos, gêneros, orientações, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclusão e crescimento na carreira dos profissionais de tecnologia.