Skip to content

Commit

Permalink
Merge pull request #209 from Rapha-Borges/day-2
Browse files Browse the repository at this point in the history
Day 2
  • Loading branch information
badtuxx authored Jan 31, 2024
2 parents eccc4fd + c07b59f commit 129bb83
Showing 1 changed file with 36 additions and 26 deletions.
62 changes: 36 additions & 26 deletions pt/day-2/README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# Descomplicando o Kubernetes
 
## DAY-2
## DAY-2 - Descomplicando o Pod
 

### Indice
### Conteúdo do Day-2

- [Descomplicando o Kubernetes](#descomplicando-o-kubernetes)
- [DAY-2](#day-2)
- [Indice](#indice)
- [Conteúdo do Day-3](#conteúdo-do-day-3)
- [Inicio da aula do Day-2](#inicio-da-aula-do-day-2)
- [O que iremos ver hoje?](#o-que-iremos-ver-hoje)
- [O que é um Pod?](#o-que-é-um-pod)
Expand Down Expand Up @@ -36,7 +36,7 @@ E claro, vamos aprender como ver todos os detalhes de um Pod em execução e bri
### O que é um Pod?


Primeiro coisa, o Pod é a menor unidade dentro de um cluster Kubernetes.
Primeira coisa, o Pod é a menor unidade dentro de um cluster Kubernetes.

Quando estamos falando sobre Pod, precisamos pensar que o Pod é uma caixinha que contém um ou mais containers. E esses containers compartilham os mesmos recursos do Pod, como por exemplo, o IP, o namespace, o volume, etc.

Expand Down Expand Up @@ -107,7 +107,7 @@ Por exemplo:
kubectl get pods giropops -o yaml
```

O comando acima irá mostrar todos os detalhes do Pod em formato YAML, praticamente igual ao que você irá ver no arquivo YAML que criamos para criar o Pod, porém com alguns detalhes a mais, como por exemplo, o UID do Pod, o nome do Node onde o Pod está sendo executado, etc. Afinal, esse Pod já está em execução, então o Kubernetes já tem mais detalhes sobre ele.
O comando acima mostrará todos os detalhes do Pod em formato YAML, praticamente igual ao que você verá no arquivo YAML que utilizaremos a seguir para criar o Pod. Porém terá alguns detalhes a mais, como por exemplo, o UID do Pod, o nome do Node onde o Pod está sendo executado, etc. Afinal, esse Pod já está em execução, então o Kubernetes já tem mais detalhes sobre ele.

Uma outra saída interessante é a saída em formato JSON, que você pode ver usando o comando:

Expand Down Expand Up @@ -135,7 +135,7 @@ Por exemplo:
kubectl get pods giropops -o wide
```

Agora, se você quiser ver os detalhes do Pod em formato YAML, mas sem precisar usar o comando get, você pode usar o comando:
Agora, se você quiser ver os detalhes do Pod, mas sem precisar usar o comando get, você pode usar o comando:

```bash
kubectl describe pods <nome-do-pod>
Expand Down Expand Up @@ -171,8 +171,8 @@ apiVersion: v1 # versão da API do Kubernetes
kind: Pod # tipo do objeto que estamos criando
metadata: # metadados do Pod
name: giropops # nome do Pod que estamos criando
labels: # labels do Pod
run: giropops # label run com o valor giropops
labels: # labels do Pod
run: giropops # label run com o valor giropops
spec: # especificação do Pod
containers: # containers que estão dentro do Pod
- name: giropops # nome do container
Expand All @@ -183,7 +183,7 @@ spec: # especificação do Pod
Agora, vamos criar o Pod usando o arquivo YAML que acabamos de criar.
```
```bash
kubectl apply -f pod.yaml
```

Expand All @@ -197,7 +197,7 @@ kubectl get pods

Já que usamos o comando `apply`, acho que vale a pena explicar o que ele faz.

O comando `apply` é um comando que faz o que o nome diz, ele aplica o arquivo YAML no cluster, ou seja, ele cria o objeto que está descrito no arquivo YAML no cluster. Caso o objeto já exista, ele irá atualizar o objeto com as informações que estão no arquivo YAML.
O comando `apply` é um comando que faz o que o nome diz, ele aplica o arquivo YAML no cluster, ou seja, ele cria o objeto que está descrito no arquivo YAML no cluster. Caso o objeto já exista, ele irá atualizá-lo com as informações que estão no arquivo YAML.

Um outro comando que você pode usar para criar um objeto no cluster é o comando `create`, que também cria o objeto que está descrito no arquivo YAML no cluster, porém, caso o objeto já exista, ele irá retornar um erro. E por esse motivo que o comando `apply` é mais usado, pois ele atualiza o objeto caso ele já exista. :)

Expand All @@ -209,7 +209,7 @@ kubectl describe pods giropops

#### Visualizando os logs do Pod

Outro comando muito util para ver o que está acontecendo com o Pod, mais especificamente ver o que o container está logando, é o comando:
Outro comando muito útil para ver o que está acontecendo com o Pod, mais especificamente ver o que o container está logando, é o comando:

```bash
kubectl logs giropops
Expand Down Expand Up @@ -240,8 +240,8 @@ apiVersion: v1 # versão da API do Kubernetes
kind: Pod # tipo do objeto que estamos criando
metadata: # metadados do Pod
name: giropops # nome do Pod que estamos criando
labels: # labels do Pod
run: giropops # label run com o valor giropops
labels: # labels do Pod
run: giropops # label run com o valor giropops
spec: # especificação do Pod
containers: # containers que estão dentro do Pod
- name: girus # nome do container
Expand Down Expand Up @@ -313,7 +313,6 @@ Nós também podemos utilizar o `exec` para conectar em uma container que está
kubectl exec giropops -c strigus -it -- sh
```


O parametro `-it` é usado para que o comando `exec` crie um processo dentro do container com interatividade e com um terminal, fazendo com que o comando `exec` se comporte como o comando `attach`, porém com a diferença que o comando `exec` cria um processo dentro do container, no caso o processo `sh`. E por esse motivo que o comando `exec` é mais usado, pois ele cria um processo dentro do container, diferente do comando `attach` que não cria nenhum processo dentro do container.

Nesse caso, podemos até mesmo conectar no container do Nginx, pois ele vai conectar no container criando um processo que é o nosso interpretador de comandos `sh`, sendo possível executar qualquer comando dentro do container pois temos um shell para interagir com o container.
Expand All @@ -324,6 +323,12 @@ kubectl exec giropops -c girus -it -- sh

Para sair do container, basta apertar a tecla `Ctrl + D`.

Não esqueça de deletar o Pod que criamos.

```bash
kubectl delete pods giropops
```

&nbsp;

### Criando um container com limites de memória e CPU
Expand All @@ -335,8 +340,8 @@ apiVersion: v1 # versão da API do Kubernetes
kind: Pod # tipo do objeto que estamos criando
metadata: # metadados do Pod
name: giropops # nome do Pod que estamos criando
labels: # labels do Pod
run: giropops # label run com o valor giropops
labels: # labels do Pod
run: giropops # label run com o valor giropops
spec: # especificação do Pod
containers: # containers que estão dentro do Pod
- name: girus # nome do container
Expand All @@ -354,7 +359,7 @@ spec: # especificação do Pod
Veja que estamos conhecendo alguns novos campos, o `resources`, o `limits` e o `requests`.

O campo `resources` é usado para definir os recursos que estão sendo utilizados pelo container, e dentro dele temos os campos `limits` e `requests`.
O campo `resources` é usado para definir os recursos que serão utilizados pelo container, e dentro dele temos os campos `limits` e `requests`.

O campo `limits` é usado para definir os limites máximos de recursos que o container pode utilizar, e o campo `requests` é usado para definir os recursos garantidos ao container.

Expand All @@ -364,6 +369,8 @@ Os valores que passamos para os campos `limits` e `requests` foram:

- `memory`: quantidade de memória que o container pode utilizar, por exemplo, `128Mi` ou `1Gi`. O valor `Mi` significa mebibytes e o valor `Gi` significa gibibytes. O valor `M` significa megabytes e o valor `G` significa gigabytes. O valor `Mi` é usado para definir o limite de memória em mebibytes, pois o Kubernetes utiliza o sistema de unidades binárias, e não o sistema de unidades decimais. O valor `M` é usado para definir o limite de memória em megabytes, pois o Docker utiliza o sistema de unidades decimais, e não o sistema de unidades binárias. Então, se você estiver utilizando o Docker, você pode usar o valor `M` para definir o limite de memória, mas se você estiver utilizando o Kubernetes, você deve usar o valor `Mi` para definir o limite de memória.

- `cpu`: quantidade de CPU que o container pode utilizar, por exemplo, `0.5` ou `1`. O valor `0.5` significa 50% de uma CPU, e o valor `1` significa 100% de uma CPU. O valor `m` significa millicpu, ou seja, milicpu é igual a 1/1000 de uma CPU. Então, se você quiser definir o limite de CPU em 50% de uma CPU, você pode definir o valor `500m`, ou você pode definir o valor `0.5`, que é o mesmo que definir o valor `500m`.

Agora vamos criar o Pod com os limites de memória e CPU.

```bash
Expand Down Expand Up @@ -409,26 +416,22 @@ Containers:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-0b0b0 (ro)
```


Veja que na saída acima, ele mostra o campo CPU com o valor `500m`, isso significa que o container pode utilizar no máximo 50% de uma CPU, afinal um CPU é igual a 1000 milliCPUs, e 50% de 1000 milicpus é 500 milliCPUs.

Então, se você quiser definir o limite de CPU em 50% de uma CPU, você pode definir o valor `500m`, ou você pode definir o valor `0.5`, que é o mesmo que definir o valor `500m`.

Para você testar os limites de memória e CPU, você pode executar o comando `stress` dentro do container, que é um comando que faz o container consumir recursos de CPU e memória. Lembre-se de instalar o comando `stress`, pois ele não vem instalado por padrão.


Para ficar fácil de testar, vamos criar um Pod com o Ubuntu com limitação de memória, e vamos instalar o comando `stress` dentro do container.

Chame o arquivo de `pod-ubuntu-limitado.yaml`.
Crie o arquivo `pod-ubuntu-limitado.yaml`.

```yaml
apiVersion: v1
kind: Pod
metadata:
name: giropops
name: ubuntu
spec:
containers:
- name: girus
- name: ubuntu
image: ubuntu
args:
- sleep
Expand All @@ -450,7 +453,6 @@ Agora vamos criar o Pod.
kubectl create -f pod-ubuntu-limitado.yaml
```


Agora vamos verificar se o Pod foi criado.

```bash
Expand Down Expand Up @@ -554,10 +556,18 @@ Você pode ver a saída do comando `kubectl describe pod giropops` para ver o vo
kubectl describe pod giropops
```

```bash
Volumes:
primeiro-emptydir:
Type: EmptyDir (a temporary directory that shares a pod's lifetime)
Medium:
SizeLimit: 256Mi
```

Agora vamos para dentro do container.

```bash
kubectl exec -it ubuntu -- bash
kubectl exec -it giropops -- bash
```

Agora vamos criar um arquivo dentro do diretório `/giropops`.
Expand Down

0 comments on commit 129bb83

Please sign in to comment.