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

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:

https://github.com/toticavalcanti

Novamente deixo meus link de afiliados:

Hostinger

Digital Ocean

One.com

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