Configurando um Cluster Kubernetes em Alta Disponibilidade (1/5)
Tags: kubernetes, kubeadm, install
Published: 2020-06-11 20:01:59

# Resumo

Seguir os passos aqui descritos me ajudou a entender melhor como um Cluster Kubernetes funciona e a testar aspectos que só fazem sentido em um ambiente com vários servidores.

Fique à vontade para entrar em contato comigo e esclarecer qualquer dúvida, vamos continuar aprendendo juntos!

No entanto, acho importante enfatizar que o Cluster criado aqui tem como finalidade somente o aprendizado e não deve ser usado em ambientes de produção.

Dito isso, mãos à obra!

---

Seguindo este e os próximos posts você conseguirá:

## Provisionar 8 máquinas virtuais:
*Caso queira mudar o número de máquinas, a quantidade de memória, a faixa de endereços `IP` (`192.168.10.0/26`) assim como o domínio `example.com`, altere os valores no arquivo `Vagrantfile`. Os scripts que criam os servidores `DNS` e o `Load Balancer HAProxy` buscam essas informações de lá.*

| Máquina       | RAM           | IP            |
| ------------- |:-------------:| -------------:|
| dns           | 512 MB        | 192.168.10.2  |
| loadbalancer  | 512 MB        | 192.168.10.10 |
| master-1      | 2 GB          | 192.168.10.11 |
| master-2      | 2 GB          | 192.168.10.12 |
| master-3      | 2 GB          | 192.168.10.13 |
| worker-1      | 2 GB          | 192.168.10.21 |
| worker-2      | 2 GB          | 192.168.10.22 |
| worker-3      | 2 GB          | 192.168.10.23 |

*Sites como [Spiceworks Subnet Calculator](https://community.spiceworks.com/tools/subnet-calc/) ajudam a entender melhor como funciona o dimensionamento de sub nets ([CIDR](https://pt.wikipedia.org/wiki/Classless_Inter-Domain_Routing) - Classless Inter-Domain Routing).

*Dica: digite `192.168.10.0/26` no campo  "First Address or CIDR" e clique em "Generate". No campo "Last Address" você verá o último endereço dessa faixa de `IP`.*

## Configurar as Máquinas com os Pré-requisitos

  - Instalar o Ubuntu 18.04
  - Desativar o `Swap`
  - Configurar parâmetros de `DNS`
  - Configurar IP Fixo (usando `netplan`)
  - Configurar Rota para o Services (`10.96.0.0/8`)
  - Configurar Host Name com `FQDN` (ex: `dns.example.com`)
  - Instalar o `containerd 1.2.13` como `Container Runtime` (`CRI`)

*Vale ressaltar que é possível usar outros `Containers Runtimes` como o `Docker` por exemplo como descrito na documentação [aqui](https://kubernetes.io/docs/setup/production-environment/container-runtimes/).

Porém, o `Docker` já usa o `containerd` e o `Kubernetes` já possui as features de `network` e `storage` que o `Docker` instala também e que não serão utilizadas.

A **[Ana Calin](https://www.linkedin.com/in/ana-maria-calin/?originalSubdomain=ca)** explica muito bem [neste vídeo](https://www.youtube.com/watch?v=uDOu6rK4yOk) (em inglês sem legendas) a experiência de migrar de `Docker` para `containerd` e as motivações.

Assim, usar o `containerd` faz com que a nossa instalação seja mais "leve".

O `containerd` também é usado no projeto `Moby` ([Moby Project](https://mobyproject.org/)) mantido pela `Docker` e o `Moby` é usado na `Azure`, ou seja, em última instância, clusters `Kubernetes` rodando na `Azure` (`AKS`) usam o `containerd` como `Container Runtime`.

## Preparar os Nodes
 
| Item                | Ação           | Masters  | Workers  |
| --------------------|:--------------:|:--------:|:--------:|
| kubeadm             | Instalar       | Sim      | Sim      |
| kubelet             | Instalar       | Sim      | Sim      |
| kubectl             | Instalar       | Sim      | Opcional |
| api-server          | Pull           | Sim      | Não      |
| controller-manager  | Pull           | Sim      | Não      |
| coredns             | Pull           | Sim      | Opcional |
| etcd                | Pull           | Sim      | Não      |
| scheduler           | Pull           | Sim      | Não      |
| kube-proxy          | Pull           | Sim      | Sim      |
| pause               | Pull           | Sim      | Sim      |
| weave-kube          | Pull           | Opcional | Opcional |
| weave-npc           | Pull           | Opcional | Opcional |

***

## Do que você vai precisar

* Host Linux (usei um notebook com Ubuntu 20.04 e 16GB de RAM)
* Virtualbox 6.1
* Vagrant 2.2.9
* Git
* TMUX (Opcional mas muito útil)

***

# Provisionando as Máquinas Virtuais

*Clone e acesse o Repositório*

```shell
git clone git@github.com:smsilva/kubernetes.git

cd kubernetes/install/kubeadm/vagrant
```

## Verifique o Status das Máquinas Virtuais

```shell
vagrant status
```

Resultado esperado:

```shell
Current machine states:

dns                       not created (virtualbox)
loadbalancer              not created (virtualbox)
master-1                  not created (virtualbox)
master-2                  not created (virtualbox)
master-3                  not created (virtualbox)
worker-1                  not created (virtualbox)
worker-2                  not created (virtualbox)
worker-3                  not created (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.
```

## Crie as máquinas virtuais

```shell
./provision.sh
```

O processo de provisionamento deve levar em torno de 10 minutos (dependendo da velocidade da sua conexão) para criar as 8 máquinas virtuais e nesse processo está incluída a configuração dos servidores `DNS` e `HAProxy Load Balancer`.

Caso queira mais detalhes sobre o provisionamento, ele é feito através da execução de scripts que estão disponíveis no diretório `kubernetes/install/kubeadm/vagrant/ubuntu/`.

Cada escript é chamado no momento do provisionamento das máquinas e essas chamadas são coordenadas no arquivo `kubernetes/install/kubeadm/vagrant/Vagrantfile`.

Verifique novamente o status após a conclusão do processo de provisionamento.

```shell
vagrant status
```

Resultado esperado:

```shell
Current machine states:

dns                       running (virtualbox)
loadbalancer              running (virtualbox)
master-1                  running (virtualbox)
master-2                  running (virtualbox)
master-3                  running (virtualbox)
worker-1                  running (virtualbox)
worker-2                  running (virtualbox)
worker-3                  running (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.

```
---
Próximo passo: [Preparando as Máquinas Virtuais](https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-2-46kp)