Pod é a menor unidade que você pode criar no Kubernetes.
Um Pod pode conter um ou um grupo de containers, compartilhando os recursos de volume, conexão, namespace e etc. Todos os containers em um mesmo Pod nunca são hospedados em servidores diferentes, todos ficando sempre na mesma máquina devido a mesma utilização de namespace e quando existir uma comunicação entre diferentes Pods, a comunicação será feita via IP.
Existem duas formas de se utilizar Pods em um Cluster Kubernetes:
1. Single Container (um único container) – Utilizando apenas um único container por Pod, conhecido como “one-container-per-Pod”, eh o mais comum no Kubernetes, neste caso o Kubernetes gerencia o Pod em vez de gerenciar o container diretamente.
2. Pods com Multi Containers – Um pod pode encapsular uma aplicação composta por múltiplos container, compartilhando o mesmo recurso. A utilização de múltiplos containers no mesmo Pod passa ser um cenário mais avançado e requer análise, arquitetura e configurações para obter um ambiente mais resiliente.
Não é necessário rodar vários containers para prover replicação de resiliência ou capacidade, nestes casos é utilizado réplicas para garantir alta disponibilidade no ambiente.
Criando um Pod
Temos duas formas de se criar um Pod:
1. Comando no Terminal
2. Através de um arquivo .yaml
A forma mais rapida e facil de se trabalhar com o Pod e através da linha de comando, via linha de comando e mais fácil para criarmos, testarmos e analisar o ambiente, porém traz uma série de desvantagem quando estamos falando de ambientes que possuem automação, pipeline e Deploys uma vez que precisamos padronizar e garantir o que está no repositório e o que ativo no ambiente.
Criando um Pod via linha de Comando
SYNTAX
kubectl run <NOME_DO_POD> --image <IMAGEM_DO_CONTAINER> --port=<PORTA>
Para exemplo, irei subir um pod com o Nginx expondo a porta 80:
kubectl run webserver --image nginx --port=80
OUTPUT
pod/webserver created
Podemos ver o pod criado através do comando `kubectl get pods`
kubectl get pods
OUTPUT
NAME READY STATUS RESTARTS AGE
webserver 1/1 Running 0 27s
Para deletar o Pod, execute o comando kubectl delete pod
SYNTAX
kubectl delete pod <NOME_DO_POD>
kubectl delete pod nginx
OUTPUT
pod "nginx" deleted
Criando um Pod utilizando um arquivo de manifesto .yaml
Um arquivo de manifesto .yaml é muito utilizado para manter padronização dos deploys, possibilitando armazenar em um repositório e criar um fluxo de CI/CD para provisionamento de aplicação. O manifesto para criação de um Pod possui a seguinte estrutura básica:
apiVersion: Versão da API que será utilizada no Kubernetes para criar o objeto , atualmente na v1.
kind: O tipo de objeto que pretendemos criar.
metadata: Metadados que ajudam a identificar de forma única o objeto como por exemplo nome, UID, namespace, tags.
Spec: Que estado deseja para o objeto, neste caso estamos criando um container com o nome de nginx utilizando a imagem do nginx.
apiVersion: v1
kind: Pod
metadata:
name: webserver
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
Apos criado o arquivo, você deverá fazer um deploy utilizando o comando kubectl apply.
SYNTAX
kubectl apply -f <ARQUIVO.yaml>
kubectl apply -f pod.yaml
OUTPUT
pod/webserver created
Para destruir o Pod, utilize o comando kubectl delete.
SYNTAX
kubectl delete -f <ARQUIVO.yaml>
kubectl delete -f pod.yaml
OUTPUT
pod "webserver" deleted
Dry-run
Guardar toda a estrutura de um arquivo de manifesto do Kubernetes e extremamente dificil pois variam de acordo com cada servico que voce vai utilizar. Nao estarei entrando em muitos detalhes neste post e em breve estarei fazendo um post dedicado ao tema. Existe uma maneira mais rapida e facil de se criar arquivos utilizando o parametro –dry-run.
SYNTAX
kubectl run <NOME_DO_POD> --image <IMAGEM_DO_CONTAINER> --dry-run=client
OUTPUT
pod/nginx created (dry run)
Perceba que na saída do comando ele retornou que o pod foi criado (dry run), se realizarmos um get nos pods, não iremos ver o pod que criamos em execução.
kubectl get pods
No resources found in default namespace.
Não existe nada de errado, pois o Dry-run simula a criação do Pod e não encaminha para a API realizar a criação do Pod no servidor.
Vamos fazer com que a saida do dry-run passe a ser na formatacao .yaml utilizando o parametro -o yaml
kubectl run nginx --image=nginx --port=80 --dry-run=client -o yaml
OUTPUT
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
Perceba que ele retornou toda a estrutura de manifesto, neste caso pode conter algumas informações que não iremos utilizar, porém já fez todo o trabalho de criação de estrutura do manifesto que precisamos.
Até este momento ainda não temos o nosso pod em execução, vamos fazer com que a saída do comando seja em um arquivo:
kubectl run nginx --image=nginx --port=80 --dry-run=client -o yaml > nginx.yaml
Com o nosso arquivo criado, vamos realizar o deploy.
kubectl apply -f nginx.yaml
OUTPUT
pod/nginx created
A partir deste momento já estamos nosso pod criado:
kubectl get pods
OUTPUT
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 10s
Referências
https://kubernetes.io/docs/concepts/workloads/pods
https://kubernetes.io/pt-br/docs/concepts/overview/working-with-objects/kubernetes-objects/