Docker - Apresentando Kubernetes


 Hoje vou apresentar os conceitos básicos sobre o Kubernetes.

O nome Kubernetes vem da palavra grega que significa timoneiro - isso é, a pessoa que dirige um navio. Este tema é refletido no logotipo do Kubernetes:

Obs: Na DockerCon EU em Copenhague em outubro de 2017, a Docker, Inc.  anunciou suporte nativo para Kubernetes no Docker Enterprise Edition (Docker EE).

O Kubernetes(K8s) é um sistema para orquestração de contêineres de código aberto desenvolvido por engenheiros do Google e lançado em 6 de junho de 2014, desde então, ele conquistou o mundo, pois pode reduzir as complexidades de gerenciar um aplicativo em execução no servidor.


Ele fornece uma API unificada que pode ser usada para gerenciar a implantação e atualizações de aplicativos em contêineres, trabalhos em lote e bancos de dados, fornecendo uma camada de abstração e isolamento para aplicativos do hardware subjacente, implantando-os em contêineres.

Atualmente todo provedor de serviços em nuvem tem o serviço um Kubernetes que os desenvolvedores podem usar para hospedar seu aplicativo:

Provedores de nuvem ainda menores, como DigitalOcean, Vultr e linode, também fornecem serviço k8s para seus clientes.

Dessa forma Kubernetes é uma plataforma de orquestração de contêineres que automatiza muitos dos processos manuais envolvidos na implantação, gerenciamento e dimensionamento de aplicativos em contêineres removendo muitas complexidades e executando o seu aplicativo sem problemas para você.

O K8s desempenhará assim o papel de orquestrador e gerenciará os contêineres docker atuando da seguinte forma:

Isso reduz muito o trabalho de um engenheiro de sistema e reduz a probabilidade de erros.

Kubernetes - Arquitetura

A seguir temos um diagrama que ilustra como os componentes individuais funcionam em conjunto na arquitetura Kubernetes:

O sistema é composto por um nó mestre(Master) e qualquer número de nós de trabalho (worker nodes). Quando o desenvolvedor envia uma lista de aplicativos para o Master, o Kubernetes os implanta no cluster Worker Nodes.  O desenvolvedor pode especificar que determinados aplicativos devem ser executados juntos e que o Kubernetes  implemente-os no mesmo Node; outros estarão espalhados pelo cluster, mas eles podem conversar entre si da mesma maneira, independentemente de onde estejam implantados.

O Kubernetes vai executar seu aplicativo em contêiner em algum lugar do cluster, fornecerá informações aos seus componentes sobre como encontrar uns aos outros e os manterá em execução. Como seu aplicativo não se importa em qual Node está sendo executado, o Kubernetes pode realocar o aplicativo a qualquer momento e, misturando e combinando aplicativos, obter resultados muito melhores na utilização de recursos do que é possível com o agendamento manual.

A arquitetura geral do Kubernetes é composta por três partes:

1- O Cluster :   O Cluster forma o componente de infraestrutura do Kubernetes e é responsável por hospedar a plataforma Kubernetes. 

Um cluster Kubernetes é um conjunto de Nodes para executar aplicativos em contêiner. Se você estiver executando o Kubernetes, estará executando um cluster. Assim ao implantar o Kubernetes, você obtém um cluster.

Portanto, pode haver um ou mais clusters em uma instalação do Kubernetes e cada cluster tem pelo menos um Worker Node ou Node.

O Cluster Kubernetes é dividido em 2 partes:

I. Control Plane (Plano de Controle) - Controla o Cluster e o faz funcionar
II. Worker Nodes (Nós de trabalho (ou simples “Nós”)) -
Executa as aplicações que são implantadas

2- O Master :  O Master é responsável por alocar cargas de trabalho para os Nodes e gerenciar o estado do cluster para que o cluster permaneça sempre no estado desejado.

O Master do Kubernetes compõe o plano de controle do Kubernetes sendo composto por vários componentes, como :

3- O Node :  Os Worker Nodes ou apenas Node,, executam as cargas de trabalho reais em contêineres. A tarefa de executar, monitorar e fornecer serviços para seus aplicativos é feita  pelos  seguintes componentes:

Assim cada Node pode hospedar muitos pods, que é a unidade de implantação no Kubernetes. Além disso, cada Node no cluster executa vários componentes do Kubernetes, como o kubelet e o proxy kube.

Alguns Nodes no cluster executam os componentes Master do Kubernetes, cuja função no cluster é gerenciar os Nodes.  O diagrama a seguir mostra a arquitetura de alto nível do nó do Kubernetes:

Um Node Kubernetes possui três componentes principais:

  1. Um kubelet;
  2. Um mecanismo de contêiner;
  3. Um Proxy;

Pods

O pod é a unidade de implantação no Kubernetes e cada pod contém um ou mais contêineres. (O Kubernetes funciona com qualquer tipo de contêiner sendo o Docker o mais popular.)

Os pods fornecem um ambiente persistente para a execução de contêineres. Portanto, todos os contêineres em um pod  compartilham o mesmo endereço IP, o mesmo armazenamento e o mesmo namespace do kernel, e,  assim os Containers dentro de um pod podem se comunicar entre si usando localhost ou comunicação entre processos.

Na figura abaixo temos uma ilustração do ambiente do pod, que consiste em unidades isoladas de pilhas de rede, cgroups e namespaces. O diagrama também ilustra o mecanismo de rede disponíveis para os contêineres interagirem uns com os outros:

Três conceitos importantes relacionados aos Pods são o ReplicaSet , os Services  e os Deployments :

1- Um ReplicaSet é um processo que executa várias instâncias de um pod e mantém o número especificado de pods constante. Seu objetivo é manter o número especificado de instâncias de Pod em execução em um cluster a qualquer momento para evitar que os usuários percam o acesso ao aplicativo quando um Pod falhar ou estiver inacessível.

O ReplicaSet é usado para garantir alta disponibilidade de serviços, você pode manter várias cópias de pods executando o mesmo serviço. O tráfego em um conjunto de réplicas tem balanceamento de carga automático, e, o Kubernetes tenta manter réplicas entre Nodes para que uma falha de um Node não interrompa o serviço. Um conjunto de réplicas pode ser configurado para adicionar e remover pods automaticamente.

2- Os services são coleções de pods que expõem a funcionalidade a usuários ou outros serviços. Qualquer tráfego enviado para o serviço será encaminhado para um dos pods associados ao serviço. A atribuição de pods a serviços acontece por meio do seletor de rótulos, que é um agrupamento do Kubernetes primitivo para selecionar quaisquer pods cujos rótulos correspondam aos critérios especificados no seletor.

3- Um Deployment do Kubernetes é usada para informar ao Kubernetes como criar ou modificar instâncias dos pods que contêm um aplicativo em contêiner. Os deployments podem dimensionar o número de pods de réplica, habilitar a distribuição de código atualizado de maneira controlada ou reverter para uma versão de implantação anterior, se necessário.

Um Deployment é um conceito de nível superior que gerencia ReplicaSets e fornece atualizações declarativas para Pods, juntamente com muitos outros recursos úteis. Você pode usar deployments para aplicar uma atualização contínua de aplicativos em pods e, da mesma forma, reverter uma atualização que falhou. 

Control Plane ou Plano de controle

O plano de controle é o cérebro do cluster Kubernetes. Ele toma decisões sobre o que o k8s tem que fazer, como agendar, iniciar um novo pod e muitas outras tarefas. O plano de controle tem os seguintes componentes:

Worker Nodes ou Nós de trabalho

O trabalho de um Worker Node é hospedar Pods.  Podemos entender os pods como um programa que contém um ou mais contêineres docker. Lembre-se de que seu aplicativo é executado em um ou mais contêineres.

Os Worker Nodes são comumente chamados de Nodes e possuem os seguintes componentes:

Instalando Kubernetes

A instalação do Kubernetes é simples, pois o Docker Desktop faz a maior parte do trabalho pesado para nós.

Abra o Docker Desktop e vá para suas configurações. Em seguida, vá para a seção Kubernetes fornecida conforme mostra a figura abaixo:

Aqui, marque a opção Enable Kubernetes e clique no botão Apply & Restart. Isso instalará o Kubernetes em seu sistema.

Além disso vamos precisar instalar duas ferramentas para trabalhar com o Kubernetes:

1. kubectl
2. minikube

O kubectl é uma ferramenta de linha de comando e possui comandos que você executará para gerenciar seu cluster Kubernetes. Veja as instruções de instalação para o sistema operacional Linux, macOS e Windows aqui.

Você então pode baixar o aplicativo e instalar neste link : latest release v1.23.0.

No Windows 10,  você também pode executar o comando abaixo na janela do prompt de comando e isso instalará o kubectl no sistema:

curl -LO https://dl.k8s.io/release/v1.20.0/bin/windows/amd64/kubectl.exe

Para verificar se o Kubectl está instalado corretamente em seu sistema, execute o comando abaixo no prompt de comando:

kubectl cluster-info

Você verá as mensagens dizendo que o Kubernetes master e o KubeDNS estão sendo executados com sucesso :

minikube

O minikube é uma ferramenta que executa um cluster Kubernetes de nó único em seu computador pessoal executado em PCs Windows, macOS ou Linux. Ele é usado para podermos testar e estudar o Kubernetes em nossa máquina local. (Não deve ser usado em produção)

No Windows 10 basta baixar o arquivo exe do instalador do minikube e clicar duas vezes nele para instalá-lo em seu sistema. O link para download do minikube pode ser obtido aqui.

Após baixar o aplicativo clique sobre ele para iniciar a instalação :

Após concluir a instalação,  em seu prompt de comando, execute o comando minikube start que iniciará o minikube em seu sistema.

Nota: Você vai precisar ter uma maquina virtual instalada no seu ambiente.

Você receberá uma mensagem que sugere que o minikube está funcionando corretamente e configurado com o kubectl :

Em seguida, execute o comando minikube status que informa que os componentes necessários do Kubernetes estão em execução.



E pronto !!!

Vamos iniciar exibindo os Nodes que temos em nosso Cluster com o comando : Kubectl get nodes

Lembrando que no minikube temos todos os processos rodando em um único local : a  nossa máquina.

Agora vamos fazer nosso primeiro deploy usando o comando : kubectl run  nginx --image nginx

Com isso estamos subindo um deployment do nginx para rodar no Kubernetes e vemos que foi criado um pod.

O roteiro básico para rodar suas aplicações no Kubernetes é o seguinte:   

- Para executar um aplicativo no Kubernetes, primeiro você precisa empacotá-lo em uma ou mais imagens de contêiner, enviar essas imagens para um registro de imagem e, em seguida, publicar uma descrição  do seu aplicativo para a API Server.

- A descrição inclui informações como a imagem do contêiner ou imagens que contém os componentes do aplicativo, como esses componentes estão relacionados, e quais precisam ser executados co-localizados (juntos no mesmo nó). Para cada componente, você também pode especificar quantas cópias (ou réplicas) você quer executar.  Além disso, a descrição também inclui quais desses componentes fornecem um serviço para clientes internos ou externos e devem ser expostos através de um único endereço IP e tornado detectável para os outros componentes.

-  Essa descrição pode ser feita em um arquivo YAML;

- Quando a API Server processar a descrição do seu aplicativo, o Schedule agenda os grupos especificados de contêineres nos Worker Nodes disponíveis com base nos recursos computacionais exigidos por cada grupo e nos recursos não alocados em cada Node naquele momento.

- O Kubelet nesses Nodes instrui o Container Runtime (Docker, por exemplo) para extrair as imagens de contêiner necessárias e executar os contêineres.

Temos assim uma visão geral do Kubernetes, seus componentes e seu funcionamento e agora você está pronto para começar a usar e aprender o Kubernetes usando o seu ambiente.

Nota: Neste link https://kubernetes.io/pt-br/docs/tutorials/hello-minikube/ você pode seguir um tutorial usando o minikube no ambiente do KataCoda que disponibiliza um ambiente Kurbenetes gratuito e acessível via navegador para estudo.

Aguarde mais artigos sobre o assunto em breve.

"A palavra de Cristo habite em vós abundantemente, em toda a sabedoria, ensinando-vos e admoestando-vos uns aos outros, com salmos, hinos e cânticos espirituais, cantando ao Senhor com graça em vosso coração."
Colossenses 3:16

Referências:


José Carlos Macoratti