Aula 04 - Kubernates - Pods
Recapitulando as Responsabilidades do Kubernates
- Implantação Automática: Implanta aplicativos em contêineres em servidores diferentes de forma automática.
- Distribuição de Carga: Distribui a carga de trabalho entre servidores para equilibrar o desempenho.
- Escalonamento Automático: Aumenta ou diminui o número de contêineres conforme a demanda.
- Monitoramento e Verificação: Monitora e corrige automaticamente problemas nos contêineres e aplicativos.
- Substituição de Contêineres com Falha: Substitui automaticamente contêineres com falha para manter a disponibilidade.
Contêineres Runtimes Suportados
Para instalar o minikube e o kubectl
Assista a esse vídeo avulso aqui do código fluente:
https://www.youtube.com/watch?v=Tr3l-cRIlmI
Verifique a Versão do Minikube
minikube version
Veja o
status do
minikube
minikube status
Inicie o
minikube
minikube start
Ou
minikube start --driver=virtualbox
Pronto, o
kubectl foi configurado para usar o cluster
minikube.
Se rodar o
status agora
minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
Para
listar os
comandos
minikube help
IP do cluster
minikube
minikube ip
Se quiser
parar o
minikube
minikube stop
Pegue o IP e acesse via
ssh, digite
y, em:
ssh docker@192.168.59.100
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
O
Username padrão é:
docker
O
Password padrão é:
tcuser
Pronto, agora você está dentro do nó
kubernates.
Erro
Caso você digite
ssh docker@192.168.59.100 digite o Username e a Password, e dê essa mensagem:
Permission denied, please try again.
Tente só:
minikube ssh
Liste os contêineres criados pelo docker, que estão rodando nesse nó do K8S
docker ps
Lembrando, o
docker é o
contêiner runtime padrão do
K8S.
Se você digitar
kubectl dentro do nó do
K8S, você vai perceber que não vai funcionar.(
kubectl: command not found)
O
kubectl é uma ferramenta externa, para gerenciar o
cluster K8S.
Saia do
nó com:
exit
Shell Kubernates(kubectl) - Ferramenta de Linha de Comando
Teste se o
kubectl está instalado (no
powershell pode ser que precise do
.\, se for no
cmd não precisa.
.\kubectl version --client
Acesse as informações dos nós do cluster
.\kubectl get nodes
Veja que temos um único nó, porque o
minikube cria um cluster de um único nó, ou seja, um
single node cluster.
Esse nó tem os papéis de
master node e
worker node.
No worknode, o
K8S cria
diferentes pods relacionado ao que foi definido no
deployments, que foi feito o deploy no cluster.
Veremos Deployments em aulas mais a frente.
Acesse as informações dos pods
.\kubectl get pods
No resources found in default namespace.
Vamos
listar todos os
namespaces que estão
disponíveis nesse cluster.
.\kubectl get namespaces
NAME STATUS AGE
default Active 81d
kube-node-lease Active 81d
kube-public Active 81d
kube-system Active 81d
Os
namespaces são usados no
K8S para
agrupar diferentes recursos e
objetos de configurações.
Quando rodamos
.\kubectl get pods
Será listado os
pods do
namespace default.
Para
listar os
pods de um
namespace específico(
kube-system), temos que informar ao
K8S o
namespace.
.\kubectl get pods --namespace=kube-system
NAME READY STATUS RESTARTS AGE
coredns-787d4945fb-47hxq 1/1 Running 3 (11h ago) 81d
etcd-minikube 1/1 Running 3 81d
kube-apiserver-minikube 1/1 Running 4 (11h ago) 81d
kube-controller-manager-minikube 1/1 Running 3 81d
kube-proxy-2f7q7 1/1 Running 3 (11h ago) 81d
kube-scheduler-minikube 1/1 Running 3 81d
storage-provisioner 1/1 Running 6 (11h ago) 81d
Todos esses pods são
Pods do sistema e está sendo executado no master node.
Criando Pods manualmente
Nesse comando ele cria o
nginx, pegando a
imagem do
nginx do
docker hub.
.\kubectl run nginx --image=nginx
Obs. o nome do Pod não precisa combinar com o nome da imagem.
.\kubectl get pods
NAME READY STATUS RESTARTS AGE (tá subindo ainda)
nginx 0/1 ContainerCreating 0 9s
.\kubectl get pods
NAME READY STATUS RESTARTS AGE (concluído)
nginx 1/1 Running 0 47s
Describe
.\kubectl describe pod nginx
Name: nginx
Namespace: default
Priority: 0
Service Account: default
Node: minikube/192.168.59.100
Start Time: Wed, 27 Sep 2023 10:47:30 -0300
Labels: run=nginx
Annotations: <none>
Status: Running
IP: 10.244.0.6
IPs:
IP: 10.244.0.6
Containers:
nginx:
Container ID: docker://62206918163a6bd1a27e4791566b2300cff6c6f708189fa22405a35bcfea7cfa
Image: nginx
Image ID: docker-pullable://nginx@sha256:32da30332506740a2f7c34d5dc70467b7f14ec67d912703568daff790ab3f755
Port: <none>
Host Port: <none>
State: Running
Started: Wed, 27 Sep 2023 10:48:07 -0300
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-f7vdf (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-f7vdf:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 3m37s default-scheduler Successfully assigned default/nginx to minikube
Normal Pulling 3m34s kubelet Pulling image "nginx"
Normal Pulled 3m4s kubelet Successfully pulled image "nginx" in 30.092832578s (30.092845004s including waiting)
Normal Created 3m1s kubelet Created container nginx
Normal Started 3m1s kubelet Started container nginx
Veja que ele colocou esse
Pod criado no
namespace default.
Apesar do
Pod ter um endereço
IP (no meu caso:
10.244.0.6), não conseguimos acessar ele por esse
IP.
Para conseguir
conectar pela
porta, precisamos criar um serviço(
service) no
K8S.
Vamos ver como criar um Service em aula mais a frente desse tutorial.
Voltando aos Pods.
Entre novamente no nó com:
ssh docker@192.168.59.100
Username:
docker
Password:
tcuser
No meu caso, para funcionar, eu uso:
minikube ssh, por causa do erro que tá dando no meu sistema de
Permission denied...
Algo relacionado a chave
ssh.
Voltando aos Pods e Containers
Veja os processos do docker relacionados ao nginx
docker ps | grep nginx
Entre no container
docker exec -it id-do-container sh
Agora você está
dentro do
contêiner.
#
Cheque o hostname
#hostname
#hostname -i
Vamos acessar ao servidor web que está sendo executado dentro do contêiner.
#curl ip-do-contêiner
Saia do contêiner:
exit
Saia do nó:
exit
No comando logo abaixo,
-o wide é uma opção que você pode fornecer para personalizar o formato de saída da lista de pods.
O
-o significa "
output" (
saída), e o
wide é um formato que inclui informações adicionais, como o endereço
IP do
pod e os
nós (
nodes) em que os
pods estão sendo executados.
Essas informações extras são úteis para diagnóstico e solução de problemas.
.\kubectl get pods -o wide
Lembrando que o cluster está rodando dentro de uma máquina virtual, portanto, ao tentar conectar do computador, o cluster no minikube ou na cloud, estamos fazendo uma conexão externa.
O IP foi atribuído pelo docker a um contêiner em particular, sendo executado em um nó, é um IP interno, por isso, não é possível acessar diretamente de fora do cluster.
Se você tentar:
curl ip-do-pod
Não vai ser possível acessar, porque o
Pod não pode ser acessado diretamente de fora do cluster.
Delete o pod do nginx
.\kubectl delete pod nginx
Criando um pod de forma declarativa
Criar um recurso no
Kubernates, seja um
Pod,
ReplicaSet,
Deployment, etc. Significa que você descreve o estado desejado do recurso (no caso, um
Pod) no arquivo
YAML, e o
Kubernetes se encarrega de criar e manter esse estado.
pods/simple-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Para aplicar o manifesto, rode o comando:
kubectl apply -f simple-pod.yaml
- Você cria ou modifica um arquivo YAML que descreve o recurso que deseja no Kubernetes. No caso do exemplo anterior, é um arquivo YAML que descreve um Pod.
- Você aplica esse arquivo YAML ao cluster Kubernetes usando o comando
kubectl apply -f nome-do-arquivo.yaml. O Kubernetes verifica o arquivo e, em seguida, cria ou atualiza o recurso de acordo com o estado declarado no arquivo.
- O Kubernetes mantém o estado do recurso alinhado com o estado declarado no arquivo. Se você modificar o arquivo YAML e aplicá-lo novamente, o Kubernetes fará as alterações necessárias para corresponder ao novo estado declarado.
Esse modelo declarativo é uma das características poderosas do
Kubernetes, pois permite que você defina e gerencie recursos de maneira consistente e previsível, garantindo que o estado desejado seja sempre mantido, independentemente de falhas ou outras circunstâncias.
O
ReplicaSet, não é possível ser criado através de linha de comando, como fizemos com o
Pod, um comando do tipo:
kubectl create replicaset nome-do-replicaset, não irá funcionar.
Para criar um
ReplicaSet, necessariamente temos que usar a forma declarativa, através de um arquivo
yaml.
Só uma dica rápida antes de finalizar
Esses dois comandos são para atribuir apelidos ao
kubectl.
No powershell use:
Set-Alias -Name k -Value .\kubectl
No bash linux, ou gitbash... use:
alias k='kubectl'
Ao invés de digitar toda vez
kubectl, agora você pode chamar pelo seu apelido, '
k'.
Meu github:
Novamente deixo meus link de afiliados:
Obrigado, até a próxima e bons estudos. ;)