Fundamentos de Cloud Computing Para Cientistas de Dados
Hoje em dia, mais e mais empresas estão migrando para o desenvolvimento e implantação de aplicativos em ambientes baseados em nuvem. Uma das principais motivações da computação em nuvem é que ela evita muitas das problemáticas associadas à configuração e gerenciamento do hardware e software. Isso é feito alugando remotamente recursos de computador disponíveis em centros de dados mantidos por um provedor de nuvem.
Desta forma, empresas e indivíduos podem utilizar remotamente as configurações de hardware e software e fluxos de trabalho fornecidos por diferentes provedores de serviços em nuvem sem ter que se preocupar em comprar o equipamento, configurar diferentes ambientes e mantê-los ao longo do tempo. Usar esse tipo de abordagem, portanto, possibilita que os usuários se concentrem apenas no desenvolvimento e implantação de seus serviços (por exemplo, site, banco de dados, aplicativos, análise de dados) sem ter que pensar em qualquer sobrecarga possível. Em última análise, isso pode levar a um desenvolvimento mais rápido / contínuo e a uma maior satisfação do cliente, de acordo com os princípios comuns de DevOps (operações de desenvolvimento).
A ideia principal por trás dos serviços em nuvem se assemelha a qualquer outro tipo de utilitário e sistema baseado em assinatura que foi desenvolvido no passado. Por exemplo, hoje em dia, cada um de nós faz uso de serviços como eletricidade / água / gás sem ter que se preocupar com o funcionamento desses sistemas e como nos são entregues. O que nos preocupa é que nossos fornecedores possam nos fornecer um serviço confiável e que tenhamos que pagar apenas por quanto usamos ou não todos esses serviços.
Alguns dos principais provedores de serviços em nuvem são:
Todos esses provedores têm suas próprias terminologias para os serviços prestados, mas todos compartilham os mesmos princípios descritos neste artigo.
Conceitos Fundamentais
Cada provedor de serviços em nuvem é capaz de oferecer uma ampla variedade de serviços e aplicativos, que podem ser categorizados em quatro tipos principais:
- Computação: máquinas virtuais, contêineres, etc …
- Rede: serviços de segurança para fazer diferentes serviços interagirem entre si.
- Armazenamento: espaço para armazenar qualquer tipo de arquivo ou banco de dados para aplicativos.
- Analytics: ferramentas de processamento e visualização de dados para analisar e criar insights a partir dos dados armazenados.
Para reduzir os custos de aluguel de recursos e fazer o melhor uso do hardware disponível, os serviços em nuvem dependem fortemente de técnicas de virtualização, como máquinas virtuais e contêineres.
Máquinas Virtuais (VMs)
Máquinas virtuais foram criadas para emular o hardware dos computadores. Diferentes instâncias de máquinas virtuais podem ser criadas para serem executadas em um único computador simultaneamente, cada uma delas tendo um sistema operacional preferido, memória e alocação de armazenamento. Depois de criada uma máquina virtual, ela pode ser acessada remotamente usando um cliente de desktop e usada como qualquer outro computador físico (por exemplo, instalar programas, executar aplicativos, etc …). Desta forma, o uso de hardware pode ser maximizado usando um único computador como uma coleção de computadores diferentes.
Outra grande vantagem de usar VMs na nuvem é que nosso sistema pode se tornar facilmente escalonável. Portanto, se forem necessários mais recursos do que o planejado para concluir um projeto, memória extra e capacidade de armazenamento podem ser fornecidos em tempo real pelo provedor de nuvem (reduzindo assim qualquer possível tempo de inatividade na implantação).
Além disso, se quisermos ter certeza de que nosso serviço está sempre em execução, também pode ser possível criar um backup de VMs que será executado automaticamente caso surja algum problema com o original. Isso pode ser particularmente útil ao adicionar novos recursos em serviços como sites ou aplicativos e queremos primeiro disponibilizar a versão mais recente do serviço para apenas um subconjunto do público para que possamos obter algum tipo de feedback sobre se a mudança pode trazer impacto positivo ou não no serviço (Teste A / B).
Contêineres
Um problema com as máquinas virtuais é que cada máquina virtual tem seu próprio sistema operacional. Por exemplo, se tivermos um aplicativo complexo que precisa do Windows para algumas operações e do Linux para outras, precisaremos executar duas máquinas virtuais separadas e fazer com que as duas se comuniquem. Isso, portanto, leva a uma sobrecarga de recursos que poderia ser evitada. Além disso, ao desenvolver em equipe um aplicativo, também pode ser possível que alguns conflitos de dependências de pacotes possam surgir ao mover de ambientes diferentes (por exemplo, “Funcionou na minha máquina”).
Para evitar esse tipo de problema, os contêineres foram idealizados. Os contêineres empacotam aplicativos com suas dependências e os implementam em um host de contêiner (que atua como um serviço para abstrair o sistema operacional). Dessa forma, o custo de memória devido ao fato de ter vários sistemas operacionais pode ser evitado e mais contêineres podem ser executados em uma única máquina do que seria possível em uma única máquina usando máquinas virtuais. Além disso, agora nossos aplicativos podem mover-se facilmente entre diferentes sistemas operacionais, sem ter que se preocupar com o gerenciamento das dependências subjacentes.
As máquinas virtuais virtualizam o hardware, enquanto os contêineres virtualizam o sistema operacional.
Uma das maneiras mais eficientes de criar sistemas complexos é dividi-los em diferentes aplicativos contêineres, cada um com uma função distinta. Por exemplo, se estivermos trabalhando em um site, pode ser uma boa ideia dividir o site em três contêineres principais: front-end, back-end e banco de dados. Sempre que quisermos introduzir novos recursos, podemos atualizar nosso contêiner de interesse sem ter que tocar nos outros. Conforme adicionamos mais componentes ao nosso aplicativo e sua complexidade aumenta, mais e mais contêineres podem ser necessários. Para manter e organizar os contêineres com eficiência, serviços como o Kubernetes foram criados.
O Kubernetes foi desenvolvido para fazer com que os aplicativos baseados em contêineres sejam facilmente escalonados em ambientes baseados em nuvem. Alguns exemplos de serviços que o Kubernetes pode fornecer são:
- Otimizar a carga de trabalho entre contêineres e escalonar o número de recursos necessários com base na demanda.
- Caso haja alguma falha em um contêiner, uma nova instância pode ser criada para substituí-lo.
- Se após o lançamento de um novo recurso, surgir algum problema, pode ser possível voltar para a versão anterior de nosso aplicativo.
Usar o Kubernetes para orquestrar nossos aplicativos pode nos permitir seguir as práticas de DevOps, como Integração Contínua (CI) e Entrega Contínua (CD). O foco principal da Integração Contínua é garantir que as alterações de código se integrem perfeitamente com a infraestrutura do código atual, enquanto a Entrega Contínua se concentra em tornar a base de código sempre pronta para implantação (capaz de passar automaticamente em qualquer mecanismo de construção e teste local).
Tipos de Implantação e Serviços em Nuvem
Depois de criado um aplicativo na nuvem, ele pode ser implantado usando três métodos diferentes de implantação na nuvem:
Nuvem Pública: neste cenário, todos os recursos utilizados são gerenciados e mantidos pelo provedor de nuvem. Atualmente, esse é o tipo de método de implantação em nuvem mais econômico e comum.
Nuvem Privada: é comumente usada ao trabalhar em tarefas que exigem alta segurança e estrito cumprimento legal. Nesse caso, uma infraestrutura de nuvem local pode ser criada pela empresa, dando, portanto, menos controle ao provedor de nuvem (esta opção requer que a empresa compre antecipadamente seu próprio equipamento de hardware).
Nuvem Híbrida: neste exemplo, parte de um aplicativo pode ser gerenciado por nosso provedor de nuvem enquanto outras pela empresa privada (uma mistura dos métodos de implantação de nuvem pública e privada).
Por fim, existem três tipos diferentes de serviços disponíveis na nuvem:
Infraestrutura como serviço (IaaS): nos tipos de serviços IaaS alugamos algum hardware e configuramos nós mesmos para realizar diferentes tarefas.
Plataforma como serviço (PaaS): nos tipos de serviços PaaS alugamos alguns hardwares pré-configurados e os usamos para testar e desenvolver algumas aplicações ou para armazenar dados de negócios.
Software como serviço (SaaS): em SaaS, o provedor de nuvem desenvolve e mantém alguns aplicativos de software que podem ser distribuídos usando um modelo de assinatura. Dois exemplos de programas SaaS são Skype e Office 365.
Com o uso dessa infraestrutura pode então ser possível mover facilmente qualquer tipo de negócio baseado em software, para a nuvem.
Referências: