# 7.1 Introdução

Nos últimos anos, a adoção de nuvens públicas para a disponibilização de aplicações tem se tornado cada vez mais comum. Esse tipo de serviço é oferecido por empresas denominadas servidores de nuvem, e entre os serviços mais populares temos a AWS da Amazon, o GCP da Google e a Azure da Microsoft \[ref].

O nome nuvem vem do termo em inglês [*cloud computing*](https://www.infowester.com/cloudcomputing.php), que é um modelo computacional que se caracteriza por utilizar uma rede de servidores, os quais normalmente estão distribuídos em diferentes localizações geográficas, com o intuito de permitir o armazenamento e processamento de informações, e a execução de aplicações, de modo a oferecer serviços para os usuários.

As vantagens principais desse modelo são:

* **Resiliência das aplicações:** Mais de uma instância da aplicação pode ser executada em paralelo, sendo assim, no caso de uma falha em um dos servidores, a aplicação pode ser servida a partir de outro servidor \[ref].
* **Redução de custos:** Ao optar por contratar um serviço de nuvem, a empresa não necessita investir na criação da sua própria infraestrutura, e na contratação de pessoal especializado para configurar e manter esse tipo de ambiente (<https://technologyadvice.com/blog/information-technology/4-ways-cloud-computing-can-save-money/>). O provedor da nuvem compartilha os recursos entre seus clientes, conseguindo altas taxas de utilização dos mesmos, e com isso consegue oferecer um valor mais atraente.
* **Flexibilidade para gerenciar os recursos computacionais:** É possível aumentar ou diminuir rapidamente a quantidade de recursos computacionais disponíveis para as aplicações, evitando desperdícios, e permitindo o atendimento de altas cargas de processamento \[ref].

Esse modelo possui uma forte sinergia com as práticas de DevOps, pois possibilita que os próprios desenvolvedores codifiquem a infraestrutra necessária para a execução de suas aplicações, desde o número de instâncias dos serviços, até o nível mais básico como o número de máquinas utilizadas, e a sua capacidade. Esse processo é conhecido com o [*Infrastructure as Code*](https://www.redhat.com/pt-br/topics/automation/what-is-infrastructure-as-code-iac) (IaC).

Nesse sentido, o [Kubernetes](https://kubernetes.io/pt-br/), que é uma plataforma para gerenciamento de cargas de trabalho e serviços distribuídos em contêineres, tem emergido como a tecnologia mais utilizada para disponibilização de aplicações em nuvem. Segundo [um relatório da *Cloud Native Computing Foundation* (CNCF)](https://www.cncf.io/wp-content/uploads/2022/02/CNCF-AR_FINAL-edits-15.2.21.pdf) referente ao ano de 2021, 96% dos entrevistados relataram estarem usando, ou ao menos avaliando o uso dele.

Basicamente o Kubernetes permite a criação e gerenciamento de um *cluster* de servidores, denominados nós, capazes de executar contêineres. Ele permite a definição de volumes de dados, utilização de certificados SSL, balanceamento de carga, e diversas outras funcionalidades que facilitam sobremaneira o desenvolvimento e implantação de aplicações na nuvem.

Nesse capítulo, nosso intuito é estruturar o nosso projeto de modo que ele possa ser executado no Kubernetes, tanto localmente na própria máquina do desenvolvedor, quanto disponibilizado em uma nuvem pública. Utilizaremos como exemplo a nuvem da Oracle, a [Oracle Cloud Infrastructure](https://www.oracle.com/cloud/solutions/gartner-report-evaluating-public-cloud-providers/) (OCI) para realizar o *deploy* da aplicação e de suas dependências.
