Skip to content

Commit

Permalink
feat: day-2, day-3, day-4, day-5 and day-6
Browse files Browse the repository at this point in the history
  • Loading branch information
nataliagranato committed Apr 30, 2024
1 parent 37cd112 commit db93179
Show file tree
Hide file tree
Showing 15 changed files with 639 additions and 0 deletions.
117 changes: 117 additions & 0 deletions docs/k8s/day-2/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
# Kubernetes e Pods

## O que é um Pod no Kubernetes?

Um Pod é a menor e mais simples unidade no modelo de objeto do Kubernetes. Um Pod representa um processo único em um cluster e pode conter um ou mais contêineres. Os contêineres dentro de um Pod compartilham o mesmo contexto de rede e podem se comunicar entre si usando `localhost`.

## Comandos Básicos do kubectl

### kubectl get pods

Este comando lista todos os Pods que estão atualmente em execução no cluster ou no namespace especificado.

Exemplo de uso:

```bash
kubectl get pods
```

### kubectl describe pod

Este comando mostra detalhes sobre um Pod específico.

Exemplo de uso:

```bash
kubectl describe pods <nome_do_pod>
```

### Utilizando kubectl attach e kubectl exec

**kubectl attach**
Este comando permite que você execute um comando específico dentro de um contêiner em um Pod.

Exemplo de uso:

```bash
kubectl exec <nome_do_pod> -- <comando>
```

**kubectl exec**
Este comando permite que você execute um comando específico dentro de um contêiner em um Pod.

Exemplo de uso:

```bash
kubectl exec <nome_do_pod> -- <comando>
```

## Criando um Pod com Multi-contêineres

Aqui está um exemplo de um manifesto para criar um Pod com vários contêineres:

```yaml
apiVersion: v1
kind: Pod
metadata:
name: meu-pod-multicontainer
spec:
containers:
- name: nginx-container
image: nginx
- name: busybox-container
image: busybox
command: ['sh', '-c', 'echo Hello, world!']
```
Para criar o Pod, salve o manifesto acima em um arquivo chamado meu-pod.yaml e execute o seguinte comando:
```
kubectl apply -f meu-pod.yaml
```

## Limitando Recursos de CPU e memória de um Pod

Aqui está um exemplo de um manifesto para criar um Pod com limites de recursos de CPU e memória:

```yaml
apiVersion: v1
kind: Pod
metadata:
name: meu-pod-multicontainer
spec:
containers:
- name: nginx-container
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: busybox-container
image: busybox
command: ['sh', '-c', 'echo Hello, world! && sleep infinity']

```

# Requests e Limits no Kubernetes

`Requests` e `limits` são conceitos fundamentais no Kubernetes que ajudam a gerenciar o uso de recursos em um cluster.

## Requests

`Requests` são o que o contêiner está garantido para ter como recurso. Quando um contêiner é criado, o Kubernetes reserva a quantidade de recurso especificada na solicitação para o contêiner. Isso é usado pelo agendador do Kubernetes para decidir em qual nó colocar o Pod. Se um nó não tem recursos suficientes disponíveis para atender à solicitação do Pod, o Pod não será agendado para aquele nó.

## Limits

`Limits`, por outro lado, são a quantidade máxima de recurso que um contêiner pode usar. Se um contêiner excede o limite de um recurso, ele pode ser encerrado ou ter sua CPU limitada, dependendo do recurso e das configurações do cluster.

A importância de definir `requests` e `limits` adequados é dupla:

1. **Eficiência de recursos**: Ao definir `requests` e `limits`, você pode garantir que seus Pods estão usando os recursos de maneira eficiente, sem consumir mais do que o necessário.

2. **Isolamento de recursos**: `requests` e `limits` também ajudam a evitar que um Pod monopolize todos os recursos em um nó, o que pode afetar outros Pods no mesmo nó.

Portanto, é uma boa prática definir `requests` e `limits` para seus contêineres para garantir o uso eficiente dos recursos e a coexistência harmoniosa de múltiplos Pods em um único nó.
11 changes: 11 additions & 0 deletions docs/k8s/day-2/files/meu-pod-multicontainer.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
apiVersion: v1
kind: Pod
metadata:
name: meu-pod-multicontainer
spec:
containers:
- name: nginx-container
image: nginx
- name: busybox-container
image: busybox
command: ['sh', '-c', 'echo Hello, world! && sleep infinity']
18 changes: 18 additions & 0 deletions docs/k8s/day-2/files/multicontainer-limitado.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
apiVersion: v1
kind: Pod
metadata:
name: meu-pod-multicontainer
spec:
containers:
- name: nginx-container
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: busybox-container
image: busybox
command: ['sh', '-c', 'echo Hello, world! && sleep infinity']
165 changes: 165 additions & 0 deletions docs/k8s/day-3/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
# Kubernetes Deployments

## O que é um Deployment?

Um Deployment no Kubernetes é um objeto que pode declarar, atualizar e dimensionar aplicativos. Ele usa um Pod Template, que contém especificações para os Pods. O estado desejado é descrito no Deployment e o Controlador de Deployment muda o estado atual para o estado desejado em um ritmo controlado.

## Criando um Deployment

Você pode criar um Deployment através de um manifesto. Aqui está um exemplo de um manifesto de Deployment:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.26-bookworm
ports:
- containerPort: 80
```
Para criar o Deployment, você pode salvar o manifesto acima em um arquivo chamado nginx-deployment.yaml e executar o seguinte comando:
```bash
kubectl apply -f nginx-deployment.yaml
```

### Vendo os detalhes de um Deployment

Você pode ver os detalhes de um Deployment usando o comando `kubectl describe`:

```bash
kubectl describe deployment nginx-deployment
```

### Atualizando um Deployment

Você pode atualizar um Deployment alterando o manifesto e reaplicando-o com kubectl apply, ou pode usar o comando kubectl set image:

```bash
kubectl set image deployment/nginx-deployment nginx=nginx:1.26
```

Você também pode editar o Deployment diretamente:

```bash
kubectl edit deployment nginx-deployment
```

E utilizar o comando `kubectl apply` para aplicar alterações.

```bash
kubectl apply -f nginx-deployment.yaml
```

### Estratégias de atualização de um Deployment

Existem duas estratégias de atualização para um Deployment: Recreate e Rolling Update. Por padrão, o Rolling Update é usado.

- **Recreate**: Todos os Pods existentes são mortos antes que os novos sejam criados. Aqui está um exemplo:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
strategy:
type: Recreate
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.26
ports:
- containerPort: 80
```
- **Rolling Update (padrão)**: O Deployment atualiza os Pods em um ritmo controlado, matando e recriando os Pods um de cada vez. Aqui está um exemplo:
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
strategy:
type: RollingUpdate
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.26
ports:
- containerPort: 80
```
### Fazendo um Rollback de um Deployment
Você pode fazer rollback para uma revisão anterior de um Deployment usando o comando `kubectl rollout undo`:

```bash
kubectl rollout undo deployment/nginx-deployment
```

### Pausando e Resumindo um Deployment

Você pode pausar um Deployment para evitar que ele faça alterações nos Pods. Para pausar um Deployment, use o comando `kubectl rollout pause`:

```bash
kubectl rollout pause deployment/nginx-deployment
```

O comando `kubectl rollout` permite que você gerencie a implantação gradual de atualizações para seus Deployments. Você pode pausar, retomar e verificar o status de um rollout, além de fazer rollback para uma revisão anterior.

### Escalando um Deployment

Você pode escalar um Deployment alterando o número de réplicas no manifesto e reaplicando-o com kubectl apply, ou usando o comando kubectl scale:

```bash
kubectl scale deployment nginx-deployment --replicas=5
```

### Verificando o ReplicaSet que o Deployment está gerenciando

Você pode verificar o ReplicaSet que um Deployment está gerenciando usando o comando `kubectl get`. Aqui está um exemplo:

```bash
kubectl get rs -l app=nginx
```

Este comando lista todos os ReplicaSets que têm a label `app=nginx`, que é a label usada no Deployment do exemplo anterior.

### Excluindo um Deployment

Você pode excluir um Deployment usando o comando kubectl delete:

```bash
kubectl delete deployment nginx-deployment
```
21 changes: 21 additions & 0 deletions docs/k8s/day-3/files/deploy-recreate.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
strategy:
type: Recreate
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.26
ports:
- containerPort: 80
21 changes: 21 additions & 0 deletions docs/k8s/day-3/files/deploy-update.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
strategy:
type: RollingUpdate
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.26
ports:
- containerPort: 80
19 changes: 19 additions & 0 deletions docs/k8s/day-3/files/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.26-bookworm
ports:
- containerPort: 80
Loading

0 comments on commit db93179

Please sign in to comment.