Kubernetes : Definindo o ambiente e criando Pods
Hoje vamos definir o ambiente de estudo do Kubernetes e iniciar criando Pods. |
Vamos iniciar definindo o nosso ambiente onde vamos estudar alguns recursos do Kubernetes. Neste primeiro contato com o Kubernetes vamos usar um ambiente bem simples que vai exigir os seguintes recursos instalados:
|
- Docker - É o container runtime. Link para download: https://www.docker.com/products/docker-desktop/
- Minikube - É um Utilitário que é uma implementação leve do Kubernetes usado executar o Kubernetes (k8s) em sua máquina local. Link com instruções para instalação : https://minikube.sigs.k8s.io/docs/start/
- Kubectl - É a ferramenta de linha de comando do Kubernetes. O kubectl, permite executar comandos em clusters do Kubernetes. Você pode usar o kubectl para implantar aplicativos, inspecionar e gerenciar recursos de cluster e visualizar logs. Link com instruções para instalação: https://kubernetes.io/docs/tasks/tools/
Naturalmente existem diversas outras ferramentas que podemos usar para estudar o Kubernetes sendo as mais conhecidas :
Usando o Minikube e modos de interação
Vamos usar o
Minikube neste primeiro contato com o Kubernetes.
O minikube é um utilitário que você pode usar para executar o Kubernetes (k8s)
em sua máquina local. Ele cria um cluster de nó único contido em uma máquina
virtual (VM). Esse cluster permite que você demonstre as operações do K8s de
forma leve e fácil.
Assim em nossos estudos iniciais estaremos executando um cluster de nó único
contido em uma VM. Antes de por a mão na massa vamos entender os modos de
interação possíveis com o Kubernetes.
Existem duas
maneiras de interagir com o kubernetes :
1- Imperativa : Usando o
kubectl e os seus diversos parâmetros;
- Diz ao K8s o que fazer.
- É Ideal para aprendizado, fazer experimentos, debugar serviços, etc.
- Exemplo: kubectl run nginx --image nginx
2- Declarativa : Usa arquivos de manifesto
no formato YAML (ou JSON) e os aplica usando o comando
kubectl apply;
- Diz ao K8s o que você quer;
- Ideal para implantar serviços de forma controlada;
- Recomendada para gerenciar aplicações K8s em produção;
- Exemplo: kubectl apply -f pod1.yaml
Embora o método imperativo possa ser mais rápido inicialmente, ele tem
algumas desvantagens. É difícil ver o que mudou quando você gerencia
implantações usando comandos imperativos.
O método declarativo, por outro lado, é auto-documentado. Cada configuração está
em um arquivo e esse arquivo pode ser gerenciado. Muitos desenvolvedores
podem trabalhar nas mesmas implantações e há um histórico claro de quem mudou o
quê.
Arquivos de manifesto YAML
Os arquivos de manifesto ou configuração são onde fazemos as declarações sobre o
que desejamos que o Kubernetes faça. Para isso podemos usar o formato JSON mas o
formato YAML é o mais usado pois sua forma de apresentação e indentação facilita
a leitura e permite adicionar comentários.
Os arquivos YAML para o kubernetes contém as definições dos diversos tipos de
objetos que são usados pelo Kubernetes como: Services,
Deployments, Pods, Namespaces, Configmaps, Secrets, dentre outros.
Para entender como o YAML funciona vamos ver como criar um pod usando um arquivo de manifesto ou configuração YAML chamado pod1.yaml :
apiVersion: v1
kind: Pod metadata: name: pod-nginx spec: containers: - image: cont-nginx name: nginx ports: - containerPort: 80 |
De forma geral um arquivo YAML para o Kubernetes sempre vai ter quatro campos no nível definidos:
apiVersion:
kind:
metadada:
spec:
Onde:
No arquivo pod1.yaml usado como exemplo temos definido em spec os containers usados para criar a aplicação. Aqui ele é um a lista ou Array pois um Pod pode ter mais de um container, e, isso é representado com um traço '-'.
Nota: No VS Code podemos instalar a extensão Kubernetes que nos auxilia a criar os arquivos YAML
Prática - Criando um Pod de forma imperativa e declarativa
Para por a mão na massa neste primeiro contato vamos criar um Pod usando as abordagens imperativa e declarativa.
1- Verificando o ambiente
Primeiro vamos verificar se o nosso ambiente esta preparado. O Docker tem que estar em execução e o Minikube e o Kubectl tem que estar instalados.
Vamos verificar o status do minikube : minikube status
Vamos iniciar o minikube : minikube start
E agora podemos verificar que o minikube esta em execução: minikube status
Temos assim o Cluster contendo o Control Plane, com a API Server, o Kubelet todos em execução.
Agora vamos verificar o cluster Kubernetes : kubectl cluster-info
Vamos agora cariar um Pod de forma imperativa usando o comando: kubectl run nginx --image nginx
A seguir vamos emitir o comando : kubectl get all para exibir as informações:
Temos o pod criado com o status ContainerCreating e a informação do cluster Kubernetes.
Repetindo o comando : kubectl get all
Temos agora o Pod no status Running.
Vamos deletar este
Pod e a seguir consultar o status usando os comandos :
kubectl delete pod nginx
kubectl get all
Vamos agora criar um Pod usando a forma declarativa.
Para isso vamos criar o arquivo pod1.yaml contendo as seguintes instruções :
apiVersion: v1
Kind: Pod
metadata:
name: pod-nginx
spec:
containers:
- image: nginx
name: cont-nginx
ports:
- containterPort: 80
A seguir vamos aplicar este arquivo de manifesto e consultar o ambiente usando
os comandos:
kubectl apply -f pod1.yam
kubectl get all
Obtemos o mesmo resultado que a forma imperativa.
Podemos usar os
comandos abaixo para consultar o ambiente:
kubectl describe pods
kubectl describe nodes
kubectl get all
kubectl get pods
kubectl get nodes
kubectl get pods -o wide
Vamos agora verificar se o container esta em execução usando o comando: kubectl exec -ti pod-nginx -- sh
A seguir vamos emitir um comando ls -l e sair o container:
Com isso vemos que o container esta em execução no Pod.
Vamos deletar este Pod usando o comando : kubectl delete pod pod-nginx
Assim tanto na abordagem imperativa como na declarativa obtemos os mesmos resultados.
No entanto usar
esta abordagem não faz muito sentido, pois se o pod morrer sua aplicação pára, e
além disso, não temos escalabilidade e nenhuma inteligência na aplicação.
Assim, executar a aplicação através do Pod não é a abordagem ideal, pois
precisamos de um objeto que cuide dos Pods, que mantenha os seus estados, e que
escale a quantidade de Pods quando necessário.
É aqui que entra o ReplicaSet.
No próximo artigo iremos apresentar e usar o objeto ReplicaSet.
"Vigiai, estai firmes na fé; portai-vos varonilmente, e
fortalecei-vos.
Todas as vossas coisas sejam feitas com amor."
1 Coríntios 16:13,14
Referências:
ASP.NET Core Web API - Apresentando API Analyzers
ASP.NET Core - Usando o token JWT com o Swagger
Gerando a documentação da Web API com Swagger
Motivos para usar Docker com .NET Core
Docker - Uma introdução básica
Docker - Trabalhando com contêineres
Docker - Criando uma imagem com Dockerfile