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:

facebook              

 

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

PIX Nubank

PIX Nubank


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

Contêineres Runtimes Suportados

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 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 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

Pods

Pods

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
  1. 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.
  2. 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.
  3. 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‘.

Até a próxima aula! \o/


Voltar para página principal do blog

Todas as aulas desse curso

Aula 03                                                 Aula 05

Meu github:

https://github.com/toticavalcanti

Novamente deixo meus link de afiliados:

Hostinger

Digital Ocean

One.com

Obrigado, até a próxima e bons estudos. 😉

Category: DevOps, Kubernates
About The Author
-

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>