Day 2
Sumário
- 🎥 Intro Day-2 - 01:15
 - 🎥 O que é um Pod? - 05:09
 - 🎥 Os sensacionais kubectl get pods e o kubectl describe pods - 14:56
 - 🎥 Conhecendo o kubectl attach e o kubectl exec - 25:58
 - 🎥 Criando o nosso primeiro pod multi container utilizando um manifesto - 21:47
 - 🎥 Limitando o consumo de recursos de CPU e Memória - 21:15
 - 🎥 Configurando o nosso primeiro volume EmptyDir - 16:00
 - 🎥 Encerramento do Day-2 - 02:43
 - 🎥 Lição de casa - 01:44
 - 📖 Leitura complementar do Day-2
 - 📖 Download da leitura complementar do Day-2
 - 📝 Exame do Day-2 - 8 questões
 - 📝 Desafio Day-2
 
Legenda
🎥 - Aula gravada
📖 - Material complementar
📝 - Atividade
Dia 2
O dia 2 é o dia com foco em Pods, que são a menor unidade de trabalho no Kubernetes. Neste dia, você aprenderá a criar, gerenciar e monitorar Pods. Além disso, você aprenderá a limitar o consumo de recursos de CPU e memória, configurar volumes e criar Pods multicontainer.
Material complementar: Leitura complementar do Day-2
O que é um Pod?
O pod é a menor unidade de trabalho no Kubernetes. Ele é composto por um ou mais containers que compartilham recursos, como rede e armazenamento. Antigamente era comum ter um container por pod, mas hoje em dia é mais comum ter múltiplos containers por pod, como sidecar containers.
kubectl get pods e kubectl describe pods
O kubectl get pods é um dos comandos mais utilizados no dia a dia de um administrador de Kubernetes. Ele é utilizado para listar os pods em execução no cluster. Já o kubectl describe pods é utilizado para obter informações detalhadas sobre um pod específico.
Você pode listar todos os pods em execução no cluster com o comando:
kubectl get pods
# ou
kubectl get pods -A # para listar todos os pods em todos os namespaces
Para obter informações detalhadas sobre um pod específico, você pode utilizar o comando:
kubectl describe pod <nome-do-pod>
kubectl attach e kubectl exec
O kubectl attach é utilizado para anexar um terminal a um pod em execução. Já o kubectl exec é utilizado para executar um comando em um pod em execução.
Para anexar um terminal a um pod em execução, você pode utilizar o comando:
kubectl attach -it <nome-do-pod>
E para executar um comando em um pod em execução, você pode utilizar o comando:
kubectl exec -it <nome-do-pod> -- <comando>
Criando o nosso primeiro pod multi container utilizando um manifesto
Vamos primeiro criar um arquivo yaml de criação de pod, utilize o comando:
	kubectl run girus --image nginx --dry-run=client -o yaml > pod.yaml
Agora, vamos adicionar um segundo container ao pod, edite o arquivo pod.yaml e adicione o seguinte trecho:
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: girus
  name: girus
spec:
  containers:
    - image: nginx
      name: nginx
      resources: {}
    - image: httpd
      name: apache
      resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
E então, crie o pod com o comando:
kubectl apply -f pod.yaml
Caso queira verificar se o pod foi criado com sucesso, utilize o comando:
kubectl get pods
Se quiser verificar os detalhes do pod, utilize o comando:
kubectl describe pod girus -c nginx
# ou
kubectl describe pod girus -c apache
Limitando o consumo de recursos de CPU e Memória
Para limitar o consumo de recursos de CPU e memória de um pod, você pode adicionar as seguintes configurações ao arquivo yaml do pod:
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: girus
  name: girus
spec:
  containers:
    - image: nginx
      name: nginx
      resources:
        limits:
          cpu: "500m"
          memory: "256Mi"
        requests:
          cpu: "200m"
          memory: "128Mi"
  dnsPolicy: ClusterFirst
  restartPolicy: Always
A tag resources é utilizada para definir os limites e as requisições de recursos de CPU e memória do pod. A tag limits é utilizada para definir os limites máximos de recursos que o pod pode consumir, enquanto a tag requests é utilizada para definir os recursos mínimos que o pod precisa para funcionar corretamente.
Configurando o nosso primeiro volume EmptyDir
Para configurar um volume EmptyDir em um pod, você pode adicionar a seguinte configuração ao arquivo yaml do pod:
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: girus
  name: girus
spec:
  containers:
    - image: nginx
      name: girus
      volumeMounts:
        - mountPath: /giropops
          name: empty-dir-volume-girus
      resources:
        limits:
          cpu: "1"
          memory: "1Gi"
        requests:
          cpu: "0.5"
          memory: "500Mi"
  dnsPolicy: ClusterFirst
  restartPolicy: Always
  volumes:
    - name: empty-dir-volume-girus
      emptyDir:
        sizeLimit: 256Mi
A tag volumes é utilizada para definir os volumes que serão montados no pod. A tag volumeMounts é utilizada para definir os pontos de montagem dos volumes nos containers do pod.
O volume EmptyDir é um volume temporário que é criado quando o pod é iniciado e é excluído quando o pod é excluído. Ele é útil para compartilhar arquivos temporários entre os containers de um pod.
Se o pod for excluído, o volume EmptyDir também será excluído, então tenha cuidado ao utilizar esse tipo de volume. Mas se você só reiniar o pod, o volume EmptyDir não será excluído.
Desafio
Objetivos
- Corrija todos os erros encontrados e realize o deploy do Nginx utilizando o arquivo pod.yaml.
 
Você tem 12 minutos!
Sua missão é realizar o deploy do Nginx utilizando o arquivo pod.yaml.
Ajuste os limites de consumo de recursos para que o pod seja deployado corretamente.
apiVersion: v1beta1
kind: pods
metadata:
  labels:
    run: nginx-giropops
    app: giropops-strigus
  name: nginx_giropops
spec:
  containers:
    - image: nginx
      name: nginx_giropops
      ports:
        - containerPort: 80
      resources:
        limits:
          memory:
          cpu: "0.5"
      requests:
        memory: "4400MB"
        cpu: "0,3"
  dnsPolicy: ClusterSecond
  restartPolicy: Always
Solução
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: nginx-giropops
    app: giropops-strigus
  name: nginx-giropops
spec:
  containers:
    - image: nginx
      name: nginx-giropops
      ports:
        - containerPort: 80
      resources:
        limits:
          cpu: "500m"
          memory: "500Mi"
        requests:
          cpu: "300m"
          memory: "440Mi"
  dnsPolicy: ClusterFirst
  restartPolicy: Always