O mundo das aplicações em execução em servidores evoluiu consideravelmente nos últimos anos, especialmente com o advento do Kubernetes. Este tutorial abrangente destina-se a iniciantes que desejam entender o Kubernetes, sua arquitetura e componentes, bem como aprender a criar Pods, Deployments e Serviços Kubernetes.
Introdução ao K8S
No passado, a execução de aplicações em servidores estava longe de ser eficiente, pois não era possível definir e impor limites para a execução de aplicações e garantir o uso justo dos recursos do servidor. Como resultado, frequentemente, apenas uma aplicação era executada em um servidor, resultando em má utilização de recursos. A solução para esse problema foi a virtualização, que permitiu criar várias instâncias virtuais de recursos físicos em uma única máquina física.
Uma Máquina Virtual (VM) é uma instância virtualizada de um sistema de computador, gerenciada por um software chamado hipervisor. Cada VM opera como uma entidade isolada com seus próprios recursos virtuais. Isso permitiu melhorar a utilização de recursos, mas cada VM tinha seu próprio sistema operacional, o que limitava o número de VMs em um servidor físico.
Máquinas Virtuais e Contêineres
Os contêineres oferecem uma solução mais leve em comparação com as VMs, pois vários contêineres em execução em um sistema físico compartilham o sistema operacional. Embora cada contêiner tenha seus próprios recursos, como CPU, eles compartilham o sistema operacional subjacente com outros contêineres. O Docker é um runtime de contêiner amplamente utilizado para gerenciar contêineres.
Contêineres oferecem vantagens significativas em relação às VMs, mas gerenciá-los em ambientes de produção pode ser desafiador. Aqui entra o Kubernetes, uma plataforma de orquestração de contêineres de código aberto.
Arquitetura e Componentes
Um cluster Kubernetes consiste em dois tipos de recursos: plano de controle e nós de trabalho. Cada cluster tem nós de trabalho que executam aplicações em contêineres chamados de Pods, que podem conter um ou mais contêineres co-localizados. O plano de controle gerencia esses nós de trabalho. Em ambientes de produção, o cluster pode conter vários nós de trabalho e o plano de controle pode ser executado em várias máquinas para alta disponibilidade e tolerância a falhas.
Componentes do Plano de Controle
Os principais componentes do plano de controle incluem:
- etcd: Armazena os dados do cluster Kubernetes, detalhes de descoberta de serviço e objetos da API em um armazenamento de chave-valor.
- kube-scheduler: Agenda novos Pods em nós de trabalho.
- kube-controller-manager: Executa processos de controle, como o controlador de nó para lidar com falhas de nó e o controlador de trabalho. Há um componente de controle separado para integração com a nuvem.
- kube-apiserver: O servidor API do Kubernetes é a principal entidade de gerenciamento para o cluster, recebendo todas as solicitações REST.
Componentes do Nó
Cada nó de trabalho no cluster Kubernetes também executa alguns componentes, incluindo:
- Kubelet: Gerencia os contêineres no Pod e garante que eles estejam em execução e saudáveis.
- Kube-proxy: Permite a comunicação de rede para os Pods na internet ou dentro do cluster.
Conceitos-chave
É importante se familiarizar com alguns conceitos-chave relacionados ao Kubernetes:
- Pods: São os blocos de construção básicos do Kubernetes, a menor unidade implantável, que pode conter um ou mais contêineres.
- ReplicaSets: Garante que um número especificado de réplicas de Pod esteja sempre em execução, geralmente gerenciado por Deployments.
- Deployments: Abstração de alto nível que gerencia ReplicaSets e permite definir o estado desejado da aplicação de forma declarativa.
- Services: Permitem a comunicação entre Pods, expondo serviços para o mundo exterior e fornecendo balanceamento de carga.
- Namespaces: Dividem logicamente os recursos do cluster, garantindo nomes únicos para recursos dentro de um namespace.
Implantação de uma Aplicação de Amostra
Agora, vamos aplicar nosso conhecimento em um exemplo prático usando o Minikube, um cluster Kubernetes local.
Instalando o Minikube
Para instalar o Minikube no Linux, você precisa seguir alguns passos simples. Certifique-se de que você tem privilégios de administrador (ou use o sudo) para executar os comandos. Aqui estão os passos gerais:
- Instale um Hipervisor: O Minikube requer um hipervisor para criar máquinas virtuais para seus clusters Kubernetes. Você pode escolher entre diferentes hipervisores, mas o mais comum é o VirtualBox. Você pode instalá-lo no Ubuntu usando o seguinte comando:
sudo apt-get install virtualbox virtualbox-ext-pack
Certifique-se de que o serviço do VirtualBox esteja em execução.
- Instale o Minikube: Você pode instalar o Minikube usando um gerenciador de pacotes, como o
curl
. Execute o seguinte comando para baixar e instalar o Minikube:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
- Depois de baixar o executável, dê permissão de execução ao arquivo:
sudo chmod +x minikube-linux-amd64
- Mova o executável para um diretório no seu PATH para facilitar o acesso:
sudo mv minikube-linux-amd64 /usr/local/bin/minikube
- Verifique se o Minikube foi instalado corretamente executando o seguinte comando:
minikube version
Você verá a versão atual do Minikube.
- Instale o Kubectl: O Kubectl é a ferramenta de linha de comando do Kubernetes e é necessária para interagir com o cluster criado pelo Minikube. Você pode instalá-lo com o seguinte comando:
sudo apt-get update && sudo apt-get install -y kubectl
- Inicie o Minikube: Agora que você instalou o Minikube e o Kubectl, pode iniciar um cluster Minikube com o seguinte comando:
minikube start
O Minikube criará uma máquina virtual com um cluster Kubernetes local.
- Verifique o Status: Você pode verificar o status do cluster Minikube executando:
minikube status
Isso mostrará informações sobre o estado atual do cluster.
Agora você tem o Minikube instalado e um cluster Kubernetes local em execução. Você pode começar a implantar e gerenciar aplicativos em seu ambiente de desenvolvimento local. Lembre-se de que o Minikube é ótimo para fins de desenvolvimento e teste, mas para ambientes de produção, você deve considerar opções mais escaláveis.
Criar um Pod
Embora normalmente não criemos Pods diretamente, é essencial entender como eles funcionam. Abaixo, temos um exemplo de manifesto YAML para criar um Pod que executa o servidor web Nginx:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.25.1
ports:
- containerPort: 80
Usando o kubectl
, podemos criar este Pod com o comando:
kubectl apply -f nginx-pod.yaml
kubectl get pods
Parabéns! Você criou seu primeiro Pod no Kubernetes.
Criar um Deployment
Na prática, usamos Deployments para criar e gerenciar Pods. Abaixo está o manifesto YAML para criar um Deployment que mantém dois Pods Nginx em execução:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.25.1
ports:
- containerPort: 80
Agora, você pode criar o Deployment com o seguinte comando:
kubectl apply -f nginx-deployment.yaml
kubectl get deployments
Você verá que dois Pods Nginx estão em execução, como especificado no replicas
.
Criar um Serviço
Os Serviços Kubernetes facilitam o acesso aos Pods. Abaixo está o comando para criar um Serviço do tipo LoadBalancer para expor nosso Deployment:
kubectl expose deployment nginx-deployment --type=LoadBalancer --name=nginx-service --port=80
Você pode verificar o Serviço criado usando kubectl get services
e acessar o Nginx via http://127.0.0.1:PORT.
Conclusão
O Kubernetes é uma plataforma poderosa para orquestração de contêineres. Neste tutorial, você aprendeu sobre sua arquitetura, componentes-chave e conceitos importantes, além de ter criado Pods, Deployments e Serviços. Isso é apenas o começo do que você pode fazer com Kubernetes, uma ferramenta essencial para o gerenciamento de aplicações em contêineres em escala. Explore mais e continue sua jornada de aprendizado no mundo do Kubernetes.
Sou um profissional na área de Tecnologia da informação, especializado em monitoramento de ambientes, Sysadmin e na cultura DevOps. Possuo certificações de Segurança, AWS e Zabbix.