código

18 nov, 2022

Criando arquivo de configuração para deploy de aplicações no Kubernetes

Publicidade

O objetivo deste artigo é explicar de uma forma sucinta o que são arquivos Yaml e, como podemos configurá-los para fazer deploy de aplicações dentro do ambiente da Oracle, nomeado como: Container Engine For Kubernetes.

Existem outras práticas de como realizar deploy no Kubernetes, mas nesse artigo abordaremos a prática citada acima, pois é a maneira mais praticada em projetos aqui na Oracle.

É possível encontrar outros exemplos de deploy no Kubernetes na internet, mas caso queira tirar alguma dúvida ou apenas conversar sobre o tema, sintam-se à vontade para me mandar mensagem =)

O que é o Yaml?

O Yaml ou “YAML Ain’t Markup Language”, foi Lançado em 2001 e inspirado em linguagens como XML, Python, C, entre outras. Basicamente a linguagem é um formato de serialização de dado legível por humanos e é bastante utilizado para arquivos de configuração, assim como o JSON e o XML.

Usabilidades do Yaml

Existem algumas formas de utilizá-lo, mas as mais comuns são em Arquivos de configuração, compartilhamento de dados entre linguagens, depuração de estratura de dados mais complexas, mensagens entre processos, entre outros.

Linguagens aderentes ao Yaml

O Yaml pode ser facilmente implementado em linguagens como: Python, JavaScript, PHP, Java, Perl, entre outras.

Estruturas

Key value Pair – O tipo básico de entrada em um arquivo YAML é um par de valores-chave. Após a chave e dois pontos, há um espaço e o valor.

Arrays / Lists – As listas são bem semelhantes aos Arrays. Os elementos da lista começam com “-“. Pode haver um número de listas, no entanto, o recuo de vários elementos da matriz é muito importante.

Dictionary / Map – Um tipo mais complexo de arquivo YAML seria um Dicionário e Mapa. Um dicionário (também conhecido como mapa, hashmap ou array associativo) é um conjunto de pares chave/valor. OpenAPI permite definir dicionários onde as chaves são strings.

Acesse aqui os exemplos

Oracle OKE

Agora que já temos uma breve noção do que é o Yaml e qual é a sua finalidade, chegou a hora de falarmos sobre Kubernetes no OKE.

Com o passar do tempo, o número de pessoas que têm acesso à internet aumentou gradativamente e com isso os acessos em aplicações também cresceu. Com toda essa demanda, surgiu a necessidade de escalar essas aplicações para que essas, aguentassem todos os acessos e as demais necessidades. E foi a partir de tais demandas que surgiu o Kubernetes.

Kubernetes (k8s), é uma plataforma open source que automatiza as operações dos containers. O Kubernetes elimina grande parte dos processos manuais necessários para implantar e escalar as aplicações em containers. Traduzindo, se você quer agrupar em clusters os hosts executados nos containers Linux, o Kubernetes vai te ajudar a gerenciar esses clusters com facilidade e eficiência.

Ok, mas e o OKE, o que ele faz?

O Oracle Container Engine para Kubernetes (OKE) é um serviço de orquestração de contêineres gerenciado pela Oracle, que pode reduzir o tempo e o custo para criar aplicativos nativos da nuvem modernos. De forma resumida, ele roda o Kubernetes com a gestão da Oracle, o que facilita toda criação de cluster e gerenciamento de forma gratuita onde você só paga por worker nodes.

Arquivo de Configuração

Abaixo você encontra um modelo yaml que usei para realizar um deploy de uma aplicação React.js no OKE e uma breve explicação de cada um dos campos usados.

apiVersion

Versão da API do Kubernetes que está sendo usado para criar este objeto

kind

Qual o tipo de objeto que você quer criar

metadata

Dados que ajudam a identificar exclusivamente o objeto, incluindo uma namestring, UID e opcional namespace

metadata.name

Propósito do objeto que está sendo criado

spec.selector

Um objeto opcional que informa ao controlador de implantação do Kubernetes para direcionar apenas os pods que correspondem aos rótulos especificados. Ele deve ter o mesmo nome que o .spec.template.metadata.labels

.replicas

Informa ao Kubernetes quantos pods devem ser criados durante uma implantação. Modificar esse campo é uma maneira fácil de dimensionar um aplicativo em contêiner.

.template

Informa ao Kubernetes como você quer que seus containers e réplicas sejam criadas.

.container.name

Nome do seu container

.container.image

Nome da Imagem Docker gerada

.container.imagePullPolicy

Orienta o serviço Kubelet sobre como extrair a imagem especificada durante uma atualização.

-container.imagePullPolicy: Always, o Kubernetes sempre extrairá a imagem do Repositório.

-container.imagePullPolicy: IfNotPresent, o Kubernetes só puxará a imagem quando ela ainda não existir no nó.

-container.imagePullPolicy: Never, o Kubernetes nunca puxará a imagem.

Caso a imagePullPolicy não seja informada, o Kubernetes definirá a política de acordo com a tag da imagem. Se a imagem estiver marcada como latest, o Kubernetes assumirá que imagePullPolicy é Always. Uma imagem sem tag é considerada a latest e, sua política é definida como Always. Caso contrário, o Kubernetes usará o padrão imagePullPolicy para IfNotPresent.

.imagePullSecret

Especifica que o Kubernetes deve obter as credenciais de uma secret com o nome dado a essa secret.

Indica a separação do arquivo e informa que abaixo existirá outro objeto. No caso do exemplo, separamos para criar do nosso service.

.spec.type

Permite especificar que tipo de serviço você deseja.

-ClusterIP, o serviço será exposto em um IP interno do cluster. Escolher esse valor torna o serviço acessível apenas de dentro do cluster. Este é o padrão ServiceType.

-NodePort, o serviço será exposto no IP de cada nó em uma porta estática (o NodePort). Um ClusterIP service, para o qual o NodePort service roteia, é criado automaticamente. Você poderá entrar em contato com o NodePort Service, de fora do cluster, solicitando <NodeIP>:<NodePort>.

LoadBalancer, o serviço será exposto externamente usando o balanceador de carga de um provedor de nuvem. NodePort ClusterIP Services, para os quais o balanceador de carga externo roteia, são criados automaticamente.

ExternalName: Mapeia o Serviço para o conteúdo do externalName campo (ex. beer.bar.example.com), retornando um CNAME registro com seu valor. Nenhum proxy de qualquer tipo é configurado.

.ports.port

Expõe o serviço Kubernetes na porta especificada no cluster. Outros pods dentro do cluster podem se comunicar com este servidor na porta especificada.

.ports.targetPort

É a porta na qual o serviço enviará solicitações para a, qual seu pod estará escutando. Seu aplicativo no contêiner também precisará estar escutando nesta porta.

Link com o arquivo exemplo

Implantando

Depois que tudo isso estiver configurado, basta executar o comando.

Caso tenha alguma dúvida durante a etapa entre em contato comigo ou acesse o vídeo abaixo com o Tutorial.

Deploy de aplicação React no OKE

Agradeço a todos e abraços.