Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Day 2 #209

Merged
merged 2 commits into from
Jan 31, 2024
Merged

Day 2 #209

Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading