Kubernetes, quais a vantagens em utilizá-lo mesmo depois do docker swarm?

Hoje avanço um pouco nos conceitos de contêineres trazendo o Kubernetes  para automatizar e gerenciar seus aplicativos em contêineres. Ao fim farei um breve comparativo entre o Kubernetes e o docker Swarm.

Kubernetes

O Kubernetes é uma plataforma desenvolvida pela Google para gerenciar aplicativos em contêineres através de múltiplos hosts de um cluster e assim, ampliar a estabilidade e controle do serviço.

Com ele se tornou possível o que por muito tempo não era possível, nativamente, através do Docker: criar balanceamento de cargas e a migração de contêineres sem perda de dados. Além disto é possível automatizar estas ações para ter alta disponibilidade dos seus serviços.

ReplicaSet

O ReplicaSet é a nova geração do já conhecido Replication Controller, este controlador é responsável por manter a disponibilidade dos seus contêineres (no Kubernetes estes contêineres são encapsulados em Pods, individualmente ou, em alguns casos, em grupos). Ele irá gerenciar a replicação dos Pods de forma que:

  • Se você necessita de 10 Pods sempre rodando, quando um destes Pods cair ou travar, outro Pod será iniciado em seu host para manter o serviço funcionando.
  • Você também pode definir regras para que um novo Pod seja criado sempre que o consumo de CPU de seus Pods, em execução, alcancem 70% de uso, por exemplo.

Lembro que o ReplicaSet não é responsável por definir configurações do seu Pod. Para editar qualquer configuração você deve atualizar o Pod através do Deployment.

Services

Um serviço do Kubernetes é responsável por abstrair das definições lógicas dos Pods, além de definir as regras de acesso a estes Pods. Em outras palavras, aqui atrelamos uma faixa de IP para o ReplicaSet, definimos as regras de acesso do mesmo e configuramos o Load Balance para manter o uso de recursos de cada Pod estável.

Gerenciamento de Storage

Como os Pods são vulneráveis a travamentos e restarts, o Kubernetes trouxe o conceito de volumes independentes, ou seja, possuem suas próprias características de tempo de vida etc. Isto permite que um volume permaneça vivo fora de um contêiner e assim, os dados vinculados a um contêiner “morto” não se percam no meio do caminho. Além disto, um Pod pode utilizar diversos tipos de volumes e inúmeros volumes simultaneamente. Isto porque as regras de como o diretório é e seus conteúdos são determinados pelo tipo de volume utilizado.

Ok. Agora que entendemos um pouco melhor sobre o Kubernetes deu pra ver que ele faz um trabalho de automatização bem completo.

Mas, mesmo depois do Docker ter lançado o Swarm mode, porque o Kubernetes ainda é uma opção mais interessante?

Sem dúvida o Docker swarm é uma opção interessante para criarmos clusters de contêineres e gerenciarmos de forma simples, mas o Kubernetes traz uma proposta bem mais automatizada para fazermos isto.

Enquanto através do Docker Swarm você criará manualmente um cluster, o Kubernetes fará isto tudo automaticamente para você. Ele seguirá suas regras predefinidas (de uso de recursos ou de quantidade de Pods) para manter a estabilidade do serviço.

Um segundo ponto é o isolamento dos volumes que garante que os dados de um Pod estejam da forma que estavam quando ele precisou ser reiniciado.

Não mencionei anteriormente neste post, mas, pelo Kubernetes também é possível definir namespaces para criarmos ambientes isolados de produção e testes. Assim, podemos limitar os recursos de cada ambiente, para que um não interfira no outro.

E para finalizar, um ponto que achei interessante é a flexibilidade dele trabalhar com outros modelos de contêiner que não seja o Docker, como o Rockets (Containers no CoreOS).

Configurando o contêiner Docker em um Cloud

Seguindo o assunto de conteinerização hoje trago um artigo prático onde vou configurar o Contêiner Docker dentro de uma instância Cloud. Para isto Utilizarei a nossa plataforma DialCloud.

Para quem quiser seguir desde o começo, deixo aqui o link do primeiro post sobre o assunto VMS vs Containers quais diferenças e usos?

Contêiner Docker

Só para recaptular o Contêiner Docker trabalha em cima do Kernel do Linux para permitir que uma aplicação ganhe em portabilidade, isolamento, segurança contra violação externa, Além de permitir o melhor gerenciamento de recursos.

Cada contêiner Docker irá iniciar uma imagem Docker, o que equivaleria a uma imagem virtual para a virtualização de máquina. Mas, no caso do Docker temos o benefício de eles utilizarem muito menos recursos, já que eles são baseados em um mesmo kernel. Através dele conseguimos uma base confiável de tudo que é necessário para executar as aplicações. Desta forma o Contêiner fica livre dos riscos externos causados pelas dependências.

Dockerfiles

Estes scripts são os responsáveis pelas orientações que devem ser executadas na montagem de uma nova imagem. Estes Scripts substituem o processo manual de configurar uma imagem para cada Contêiner que você for utilizar.

Prontos para começar

Agora que já deixamos claro os conceitos básicos para a conteinerização vamos iniciar a instalação. Primeiramente temos que criar uma instância. No caso peguei uma instância simples com 8GB de RAM e 40GB de disco e Ubuntu 14.04. Chamei ela em meu painel de docker-test, como podem ver abaixo.

Com esta instância montada e com todos os dados SSH em mãos vamos aos comandos de instalação.

Instalando o Docker

Com o acesso root em mãos vou entrar na máquina e buscar por atualizações do droplet. Para isto basta executar os comandos:

apt update
apt upgrade

Só por garantia, confira se seu sistema tem suporte ao  aufs (Ele é um controlador de armazenamento utilizado pelo Docker).

 apt install linux-image-extra-uname -r

Agora temos que adicionar a chave e o repositório do Docker aos arquivos, apt-key e ao sources list

sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"
sh -c "echo deb http://get.docker.io/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"

Faça um novo update no droplet com o primeiro comando que eu passei aqui e então instale o docker 🙂 \o/!

 apt update
apt install lxc-docker

O Ubuntu possui um Firewall padrão que bloqueia o encaminhamento de pacotes. Este encaminhamento de pacotes é necessário para o funcionamento do docker. Assim, teremos que editar o arquivo ufw para liberar o encaminhamento.

Para isto entre no arquivo e então configure a opção DEFAULT_FORWARD_POLICY como “ACCEPT”

vim /etc/default/ufw
DEFAULT_FORWARD_POLICY="ACCEPT"

Salve o arquivo e recarregue o UFW

 ufw reload

Pronto, agora que seu docker está instalado você pode começar a montar seus contêineres utilizando imagens criadas por você, ou o que é mais legal ainda, buscando uma imagem publica oficial ou deixada pela comunidade através da docker Store.

Baixando uma imagem

Para um exemplo prático, vou buscar a imagem oficial hello world do Docker para fazer a instalação. Primeiramente a gente baixa a imagem para a máquina.

docker pull hello-world

Agora que a imagem já está na minha máquina eu posso criar um novo contêiner. Vale lembrar que não é possível criar um contêiner vazio, sem nenhuma execução. Por isso precisamos de uma imagem base. No exemplo abaixo eu vou criar um contêiner definindo o nome dele de my-hello e instalar minha imagem hello-world.

docker run --name=my-hello hello-world

Uma vez instalado você pode executar ele rodando o comando abaixo com o ID do contêiner

docker run eeb0fd308c5d

Agora basta você usufruir do contêiner Docker e a cada atualização que você fizer, não se esqueça de atualizar o dockerfile para não perder a portabilidade dele.