O que é Cloud Native? E o que não é… | Arquitetura em Nuvem
Simplesmente criar uma máquina-virtual para hospedagem de aplicações na nuvem ou, mesmo, fazer uso de uma oferta cloud específica de um fornecedor (e normalmente proprietária) não tornam um projeto automaticamente cloud native. Assim como acontece com DevOps, a noção de Cloud Native vai muito além da adoção de tecnologias rotuladas com este termo. Há toda uma mudança de pensamento, uma transformação cultural. E tudo isso acontecerá priorizando questões como agilidade, escalabilidade e resiliência.
No que se refere à agilidade, devemos considerar as pressões das áreas de negócio por uma rápida entrega de soluções. Somam-se a isso a velocidade com que mudanças no segmento em que a organização se encontra podem ocorrer, exigindo por isso uma rápida evolução das aplicações e da infraestrutura que estas requerem. E a escolha da tecnologia poderá variar de projeto a projeto, numa eterna busca pelas soluções que melhor se encaixam a cada novo contexto encontrado.
A noção de escalabilidade diz respeito à necessidade de aplicações e infraestrutura serem capazes de suportar uma demanda crescente de usuários, garantindo uma boa performance e evitando falhas decorrentes de um nível de utilização mais intensivo. Tudo isso exigirá obviamente uma infraestrutura robusta, assim como projetos de software adaptados para tirar o máximo proveito da capacidade computacional oferecida.
A resiliência se refere à implementação de aplicações e infraestruturas tolerantes a falhas, exigindo com isto uma série de cuidados de projeto e implantação. As organizações atuais possuem grande dependência de softwares e infraestrutura dotados de mecanismos de autorecuperação, levando em consideração a inevitabilidade da ocorrência de problemas tecnológicos que afetarão suas estruturas de negócio. Dentro da disciplina de Chaos Engineering (Engenharia do Caos) existem princípios, recomendações e estão disponíveis até mesmo ferramentas open source para simular cenários de falhas, de forma a viabilizar uma adequada preparação das aplicações e infraestrutura envolvidas.
Além da preocupação com aspectos como agilidade, escalabililidade, automação e resiliência, há ainda alguns fatores que são considerados pilares dentro de um projeto Cloud Native e que exigirão escolhas técnicas:
- Automação
- Infraestrutura
- Design moderno de aplicações
- Utilização de serviços de apoio
Nas próximas seções estão algumas considerações sobre tais fatores.
Automação
O fator automação, por si só, é indissociável de DevOps. Aqui serão consideradas estratégias de deployment de aplicações com vistas a uma alta disponibilidade, bem como meios para automatizar a alocação de infraestrutura em nuvem com rapidez e sem grandes complicações.
Seja na área de infraestrutura ou aplicações, a escolha por uma alternativa de automação deverá considerar o quão agnóstica é uma solução do ponto de vista tecnológico. É mais do que comum que no dia a dia de uma organização coexistam diversas stacks para desenvolvimento de software, bem como estejam presentes os mais variados tipos de recursos de infraestrutura.
A automação empregando técnicas de Infrastructure as code (IaC - Infraestrutura como código) é hoje uma constante em cenários de nuvem. Destacam-se aqui o uso de opções como Terraform e Ansible, facilmente integráveis com tecnologias cloud native e as principais ofertas de nuvem no mercado.
Uma grande ênfase também deverá ser dada ao build e deployment automatizados de aplicações, incluindo mecanismos e estratégias que possibilitem evitar períodos de indisponibilidade (downtime) em tais sistemas. Neste quesito se destacam alternativas como Azure DevOps, GitHub Actions, AWS CodePipeline, GitLab e Jenkins, com funcionalidades compatíveis com as principais tecnologias de desenvolvimento e facilmente aderentes a ambiente cloud native.
Infraestrutura
Dentro da área de DevOps há uma famosa analogia sobre infraestrutura conhecida como Pets (animais de estimação) x Cattle (gado), a qual ilustra bem como recursos computacionais deverão ser considerados em um contexto cloud native.
Em um cenário tradicional servidores físicos serão tratados como Pets, como animais de estimação que irão requerer cuidados individuais. A necessidade de escalar a infraestrutura envolverá uma intervenção direta em tais máquinas, com a adição de mais hardware e resultando ainda numa série de ajustes de configuração. A ocorrência de problemas implicará também em ações sobre este hardware, uma vez que questões como custo e espaço físico utilizado simplesmente inviabilizam o descarte do mesmo.
A adoção de um modelo em conformidade com a ideia de Cattle (gado) estará amparada no uso de máquinas-virtuais (VMs) e containers, de forma a simplificar as inúmeras questões relacionadas à escalabilidade de uma infraestrutura. A adoção de estruturas baseadas em virtualização (VMs, containers) agilizará consideravelmente a alocação de novos recursos, seja adicionando novas instâncias (via rápida criação de máquinas-virtuais ou containers a partir de imagens pré-configuradas) ou até substituindo elementos já existentes (destruindo uma estrutura que possa apresentar falha, ou ainda trocando a mesma por um item que provisione mais recursos para processamento).
Soluções cloud native costumam utilizar containers extensivamente. Esta prática se deve aos inúmeros benefícios oferecidos por este tipo de elemento, como um espaço isolado para execução de aplicações (viabilizando seu uso com as mais variadas tecnologias), uma baixíssima dependência do ambiente em que tais containers estarão hospedados e a rapidez com que os mesmos podem ser criados por meio de imagens geradas previamente. E em cenários que exijam alta disponibilidade e resiliência empregando containers teremos certamente a adoção do Kubernetes, uma solução que praticamente se tornou um padrão na orquestração e gerenciamento dessas estruturas em contextos cloud native.
Os principais cloud providers do mercado contam com inúmeras ofertas gerenciadas para uso de containers na nuvem:
- Microsoft: Azure Container Instances, Azure App Service (Web Apps), Azure Azure Container Apps (serverless para Web Apps e Back-Ends)
- Amazon: Lightsail Containers, AWS Fargate (serverless)
- Google Cloud: Cloud Run
E para a implementação de clusters Kubernetes se valendo de recursos gerenciados por essas nuvens:
- Azure Kubernetes Service (AKS)
- Amazon Elastic Kubernetes Service (EKS)
- Google Kubernetes Engine (GKE)
O Kubernetes e outros projetos cloud native vêm sendo temas frequentes de uma série de lives no Canal.NET. Acesse a playlist a seguir no YouTube e tenha acesso às dezenas de horas de gravação desses conteúdos gratuitos:
Design moderno de aplicações
Implementar aplicações seguindo práticas consagradas no desenvolvimento de software trará não apenas benefícios em termos de código. Decisões priorizando um design moderno em tais soluções resultarão em arquiteturas capazes de evoluir, tirando proveito sempre que possível de novas tecnologias de ampla difusão no mercado e estando em conformidade com os diferentes aspectos esperados para projetos cloud native.
E como podemos então modernizar nossas aplicações, buscando uma modelagem a nível de software com a qual as mesmas possam ser consideradas cloud native?
A metodologia conhecida como The Twelve-Factor App constitui uma ótima resposta a esta questão. Com recomendações agnósticas, não se prendendo a tecnologias específicas, encontraremos dentro desta abordagem princípios extremamente úteis para a construção de aplicações robustas e voltadas à nuvem. Dentre as diretrizes estão justamente um design que facilite a utilização de serviços de apoio e a evolução das aplicações, um melhor gerenciamento de configurações e códigos-fonte, monitoramento e rastreabilidade em softwares e automação no build + deployment de projetos.
Aplicações baseadas em microsserviços representam uma das principais escolhas arquiteturais em cenários cloud native. Partindo de uma modelagem em que um microsserviço representa uma capacidade específica e bem delimitada do negócio, chagaremos assim a implementações capazes de evoluir individualmente até mesmo do ponto de vista tecnológico. E as recomendações da metodologia The Twelve-Factor App serão aqui de fundamental importância, viabilizando a construção de aplicações escaláveis, resilientes e que possam ser facilmente adaptadas diante da necessidade de inevitáveis mudanças.
Utilização de serviços de apoio
Mecanismos para logging, controle de acesso, caching, bancos de dados e monitoramento representam clássicos exemplos de funcionalidades conhecidas como cross-cutting concerns, com diversas ofertas no mercado atendendo a demandas deste tipo. Do ponto de vista do desenvolvimento de aplicações as tecnologias que disponibilizam tais recursos são classificadas como serviços de apoio (backing services), com diversas alternativas correspondendo a projetos apoiados ou até mesmo mantidos pela Cloud Native Computing Foundation (CNCF). A escolha por opções que contem com este endosso da CNCF acaba por representar uma excelente decisão, direcionando nossos projetos para que estejam em conformidade com boas práticas dentro da cultura cloud native.
A adoção de serviços de apoio em aplicações também incentivará um melhor design de código, sobretudo levando em conta os princípios clássicos da Orientação a Objetos (Reponsabilidade Única, Inversão de Controle) e da metodologia The Twelve-Factor App. O objetivo com toda essa preparação é que a integração com tais serviços aconteça de maneira descomplicada, partindo para isto de uma abordagem plugável e que facilite no futuro a troca de uma tecnologia por outra. Essa estratégia também possibilitará uma maior ênfase no negócio, com maior produtividade, economia financeira e menores riscos na entrega de soluções.
Conclusão
Soluções cloud native se caracterizam por preocupações com fatores como escalabilidade, resiliência e são comumente adotadas em cenários que exijam uma maior agilidade no cumprimento de demandas de negócio. Além disso há uma maior ênfase em projetos deste tipo com questões como automação, uma infraestrutura robusta, um designo moderno para aplicações e o uso de inúmeros serviços de apoio.