Aula 04 – Kubernates – Pods
Aula 04 – Kubernates – Pods
Voltar para página principal do blog
Todas as aulas desse curso
Aula 03 Aula 05
Redes Sociais:
Site das bibliotecas
Tensorflow
Keras
Cursos Gratuitos
Digital Innovation
Quer aprender python3 de graça e com certificado? Acesse então:
workover
Empresas de Cloud:
Hostinger
Digital Ocean
One.com
Canais do Youtube
Toti
Lofi Music Zone Beats
Backing Track / Play-Along
Código Fluente
Putz!
Vocal Techniques and Exercises
Fiquem a vontade para me adicionar ao linkedin.
PIX para doações
Aula 04 – Kubernates – Pods
Documentação do Minikube: https://minikube.sigs.k8s.io/docs
Documentação do Kubernates: https://kubernetes.io/docs/home/
Github do Kubernates: https://github.com/kubernetes/kubernetes
Playground: https://killercoda.com/kubecon
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.
Falaremos sobre ReplicaSet na próxima aula.
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‘.