Kubernetes e a tecnologia de containers
N
ão somente para quem está imerso no mundo do desenvolvimento de aplicações e softwares, mas para quem atua com programação e virtualização, os Kubernetes não são novidade. Todas as empresas que lidam com o desenvolvimento de aplicações robustas enfrentam o problema de ter que atuar com grandes blocos de programação difíceis de alterar ou programar, e assim que é necessário mexer nestes blocos, é aquela dor de cabeça de sempre para os desenvolvedores. E na tentativa de corrigir estes problemas surgiu uma nova abordagem de redimensionamento: Kubernetes.
O Kubernete, ou “k8s” é um sistema de gerenciamento de contêineres, soluções que virtualizam sistemas operacionais em uma arquitetura de microsserviços. É uma plataforma open source que automatiza as operações dos containers e elimina grande parte dos processos manuais necessários para implantar e escalar as aplicações em containers, onde torna-se a plataforma ideal para hospedar aplicações nativas em nuvem que exigem escalabilidade rápida, como a transmissão de dados em tempo real. Originalmente, o Kubernetes foi criado e desenvolvido por engenheiros do Google. O Google foi um dos pioneiros no desenvolvimento da tecnologia de containers. Além disso, a empresa já revelou publicamente que tudo no Google é executado em containers (inclusive, essa é a tecnologia por trás dos serviços em cloud da empresa). O Google gera mais de 2 bilhões de implantações de contêineres por semana, viabilizadas por uma plataforma interna: Borg. O Borg foi o antecessor do Kubernetes. As lições aprendidas ao longo dos anos de desenvolvimento do Borg foram a principal influência para o desenvolvimento da tecnologia do Kubernetes. Em 2015, o Google doou o projeto Kubernetes à Cloud Native Computing Foundation, recém-formada na época.
No início, as empresas executavam aplicações em servidores físicos. Não havia como definir limites de recursos para aplicações em um mesmo servidor físico, e isso causava problemas de alocação de recursos. Por exemplo, se várias aplicações fossem executadas em um mesmo servidor físico, poderia haver situações em que uma aplicação ocupasse a maior parte dos recursos e, como resultado, o desempenho das outras aplicações seria inferior. Uma solução para isso seria executar cada aplicação em um servidor físico diferente. Mas isso não escalava, pois os recursos eram subutilizados, e se tornava caro manter muitos servidores físicos.
Foi então que a virtualização foi introduzida. A partir daqui, é possível executar várias máquinas virtuais em uma única CPU de um servidor físico. A virtualização permite que as aplicações sejam isoladas entre as máquinas virtuais, e ainda fornece um nível de segurança, pois as informações de uma aplicação não podem ser acessadas livremente por outras aplicações. A virtualização permite melhor utilização de recursos em um servidor físico, e permite melhor escalabilidade porque uma aplicação pode ser adicionada ou atualizada facilmente, reduz os custos de hardware e muito mais. Com a virtualização, você pode apresentar um conjunto de recursos físicos como um cluster de máquinas virtuais descartáveis. Cada máquina virtual é uma máquina completa que executa todos os componentes, incluindo seu próprio sistema operacional, além do hardware virtualizado.
Contudo surge a tecnologia dos contêineres. Eles são semelhantes às máquinas virtuais, mas têm propriedades de isolamento flexibilizadas para compartilhar o sistema operacional entre as aplicações. Portanto, os contêineres são considerados leves. Semelhante a uma máquina virtual, um contêiner tem seu próprio sistema de arquivos, compartilhamento de CPU, memória, espaço de processo e muito mais. Como eles estão separados da infraestrutura subjacente, eles são portáveis entre nuvens e distribuições de sistema operacional. Os contêineres se tornaram populares porque eles fornecem benefícios como:
– Criação e implantação ágil de aplicações: aumento da facilidade e eficiência na criação de imagem de contêiner comparado ao uso de imagem de máquina virtual.
– Desenvolvimento, integração e implantação contínuos: fornece capacidade de criação e de implantação de imagens de contêiner de forma confiável e frequente, com a funcionalidade de efetuar reversões rápidas e eficientes.
– Separação de interesses entre desenvolvimento e operações: cria imagens de contêineres de aplicações no momento de construção/liberação em vez de no momento de implantação, desacoplando as aplicações da infraestrutura.
– A capacidade de observação não apenas apresenta informações e métricas no nível do sistema operacional, mas também a integridade da aplicação e outros sinais.
– Consistência ambiental entre desenvolvimento, teste e produção: funciona da mesma forma em um laptop e na nuvem.
– Portabilidade de distribuição de nuvem e sistema operacional: executa no Ubuntu, RHEL, CoreOS, localmente, nas principais nuvens públicas e em qualquer outro lugar.
– Gerenciamento centrado em aplicações: eleva o nível de abstração da execução em um sistema operacional em hardware virtualizado à execução de uma aplicação em um sistema operacional usando recursos lógicos.
– Microserviços fracamente acoplados, distribuídos, elásticos e livres: as aplicações são divididas em partes menores e independentes e podem ser implantados e gerenciados dinamicamente – não uma pilha monolítica em execução em uma grande máquina de propósito único.
– Isolamento de recursos: desempenho previsível de aplicações.
– Utilização de recursos: alta eficiência e densidade.
Mas então, onde entram os Kubernetes?
Os contêineres já provaram que são uma boa maneira de agrupar e executar suas aplicações. Em um ambiente de produção, é necessário gerenciar os contêineres que executam as aplicações e garantir que não haja tempo de inatividade. Por exemplo, se um contêiner cair, outro contêiner precisa ser iniciado. É aqui que o Kubernetes entra! O Kubernetes oferece uma estrutura para executar sistemas distribuídos de forma resiliente. Ele cuida do escalonamento e da recuperação à falha de sua aplicação, fornece padrões de implantação e muito mais.
O Kubernetes pode trazer várias ferramentas para todo o seu processo de virtualização e aplicação em containers, além de:
– Descoberta de serviço e balanceamento de carga – o Kubernetes pode expor um contêiner usando o nome DNS ou seu próprio endereço IP. Se o tráfego para um contêiner for alto, o Kubernetes pode balancear a carga e distribuir o tráfego de rede para que a implantação seja estável.
– Orquestração de armazenamento – o Kubernetes permite que monte automaticamente um sistema de armazenamento de sua escolha, como armazenamentos locais, provedores de nuvem pública e muito mais.
– Lançamentos e reversões automatizadas – é possível descrever o estado desejado para seus contêineres implantados usando o Kubernetes, e ele pode alterar o estado real para o estado desejado em um ritmo controlado.
– Autocorreção – o Kubernetes reinicia os contêineres que falham, substitui os contêineres, elimina os contêineres que não respondem à verificação de integridade definida pelo usuário e não os anuncia aos clientes até que estejam prontos para servir.
– Gerenciamento de configuração e de segredos – o Kubernetes permite armazenar e gerenciar informações confidenciais, como senhas, tokens e chaves. Você pode implantar e atualizar segredos e configurações de aplicações sem reconstruir suas imagens de contêiner e sem expor segredos em sua pilha de configuração.
Kubernetes não é um mero sistema de orquestração, na verdade, ele elimina a necessidade de orquestração. A definição técnica de orquestração é a execução de um fluxo de trabalho definido: primeiro faça A, depois B e depois C. Em contraste, o Kubernetes compreende um conjunto de processos de controle independentes e combináveis que conduzem continuamente o estado atual em direção ao estado desejado fornecido. Não importa como você vai de A para C. O controle centralizado também não é necessário. Isso resulta em um sistema que é mais fácil de usar e mais poderoso, robusto, resiliente e extensível.
Quer saber mais? Entre em contato conosco.