Configurando um Cluster Kubernetes em Alta Disponibilidade (2/5)
Published: 2020-06-11 20:02:14

Continuando o post [anterior](https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-1-5-3l0).

# Preparando as Máquinas Virtuais

Neste ponto, optei por usar o `TMUX` para executar os comandos um a um nas máquinas pois acho que faz parte do processo de perceber o que está sendo feito nelas.

É perfeitamente possível e recomendável automatizar esse tipo de processo usando ferramentas como Terraform ou Ansible mas lembre-se que o objetivo aqui é ter uma melhor visão do todo.

## Usando o `TMUX` para acessar várias máquinas ao mesmo tempo

Para ajudar na criação de uma janela para cada máquina, sugiro que você baixe e configure [este script](https://github.com/smsilva/linux/blob/master/scripts/bin/kubectl-tx) em um diretório no seu path.

Copie o script [`ktx`](https://github.com/smsilva/linux/blob/master/scripts/bin/ktx) em sua máquina em um diretório que esteja incluído na variável de ambiente `PATH`.

A partir do diretório `kubernetes/install/kubeadm/vagrant/`, execute o script para abrir o `TMUX` e criar várias janelas divididas em painés, um painel para cada máquina virtual.

```shell
ktx
```

O `TMUX` iniciará uma sessão chamada "k8s" e criará 4 janelas:

* 0-bash
* 1-masters
* 2-workers
* 3-all (janela ativa)

Essas janelas estarão sincronizadas, isto é, o que for digitado em uma será repetido nas demais permitindo executar os próximos comandos em paralelo nas seis máquinas (`masters` e `workers`).

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/1t35cg8wx2zbr76k4wck.png)

Pressione `ENTER` para conectar nas 6 máquinas virtuais.

Em alguns segundos a sua tela deve estar parecida com a imagem abaixo.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/r14cptyf661e1ksyxagy.png)

Pressione `CTRL+l` (L minúsculo) para limpar os terminais para que você possa ter uma visualização melhor.

### Teste a Conectividade das máquinas com o `Load Balancer` (`lb`) na porta `6443`

```shell
nc -d lb 6443 && echo "OK" || echo "FAIL"
```

A sua tela deve se parecer com a da imagem abaixo exibindo um "OK" como resultado do comando.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/u2az31373h81j7b589d1.png)

Pressione CTRL+l (L minúsculo).

### Verifique se a rota para `10.96.0.0` foi configurada

```shell
route -n | grep --quiet "10.96.0.0" && echo "OK" || echo "FAIL"
```

A saída do comando deve exibir um "`OK`". Pressione `CTRL+l` novamente.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/rjqtwhtol47gr88nujxp.png)

*Atualize os pacotes do sistema e adicione a chave `GPG` do Google*

```shell
sudo apt-get update | grep --invert-match --extended-regexp "^Hit|^Get" && \

sudo curl --silent "https://packages.cloud.google.com/apt/doc/apt-key.gpg" | sudo apt-key add -
```

A saída do comando deve se parecer com a imagem abaixo com um `"OK"` no final.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/1jut79sqjwz4k8g9y7dp.png)

Pressione `CTRL+l` novamente (sugiro fazer isso após executar cada comando).

*Adicione o Repositório do Kubernetes e atualize a lista de pacotes*

```shell
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF

sudo apt-get update | grep --invert-match --extended-regexp "^Hit|^Get"
```

O resultado deve ser:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/0g9ujwljnocz7hkkh31c.png)

*Defina a versão do Kubernetes que deseja instalar*

Algumas variáveis de ambiente serão atualizadas com formatos diferentes da versão mais recente encontrada no repositório adicionado no passo anterior.

```shell
KUBERNETES_DESIRED_VERSION='1.18' && \
KUBERNETES_VERSION="$(sudo apt-cache madison kubeadm | grep ${KUBERNETES_DESIRED_VERSION} | head -1 | awk '{ print $3 }')" && \
KUBERNETES_BASE_VERSION="${KUBERNETES_VERSION%-*}" && \
echo "" && \
echo "KUBERNETES_DESIRED_VERSION.: ${KUBERNETES_DESIRED_VERSION}" && \
echo "KUBERNETES_VERSION.........: ${KUBERNETES_VERSION}" && \
echo "KUBERNETES_BASE_VERSION....: ${KUBERNETES_BASE_VERSION}" && \
echo ""
```

Os três diferentes formatos devem ser exibidos dessa forma:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/4eqrh9auwea5dxdgdjdv.png)

*Instale em todos o kubeadm e o kubelet e somente o kubectl nos masters*

```shell
SECONDS=0 && \
if grep --quiet "master" <<< $(hostname --short); then
  sudo apt-get install --yes \
    kubeadm="${KUBERNETES_VERSION}" \
    kubelet="${KUBERNETES_VERSION}" \
    kubectl="${KUBERNETES_VERSION}" && \
  sudo apt-mark hold \
    kubelet \
    kubeadm \
    kubectl
else
  sudo apt-get install --yes \
    kubeadm="${KUBERNETES_VERSION}" \
    kubelet="${KUBERNETES_VERSION}" && \
  sudo apt-mark hold \
    kubelet \
    kubeadm
fi && \
printf '%d hour %d minute %d seconds\n' $((${SECONDS}/3600)) $((${SECONDS}%3600/60)) $((${SECONDS}%60))
```
A instalação deve demorar menos de 1 minuto:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/dunp7pkwso5bswc7empe.png)

*Agora que o utilitário crictl também foi instalado no passo anterior, configure o containerd e teste se consegue listar as imagens (neste momento a lista estará vazia)*

```shell
sudo crictl config \
  runtime-endpoint unix:///var/run/containerd/containerd.sock \
  image-endpoint   unix:///var/run/containerd/containerd.sock && \
sudo crictl images
```

A lista de imagens estará vazia mas indica que o `Container Runtime` (`containerd`) está funcionando:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/l6l1rhftn9esce7z9b56.png)

*Faça o preloading das imagens para acelerar o tempo no momento em que formos configurar o `Control Plane` nos masters e adicionar os `workers` no cluster*

```shell
SECONDS=0 && \
if grep --quiet "master" <<< $(hostname --short); then
  sudo kubeadm config images pull
else
  sudo crictl pull "k8s.gcr.io/kube-proxy:v${KUBERNETES_BASE_VERSION}"
fi
sudo crictl pull docker.io/weaveworks/weave-kube:2.6.4
sudo crictl pull docker.io/weaveworks/weave-npc:2.6.4
printf '%d hour %d minute %d seconds\n' $((${SECONDS}/3600)) $((${SECONDS}%3600/60)) $((${SECONDS}%60))
```
O processo deve levar um pouco mais de 1 minuto:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/xw1ftu0rl3t28n7jphwj.png)

*Liste as imagens que foram baixadas*

```shell
sudo cricrtl images
```

Serão exibidas imagens diferentes nos `masters` e nos `workers`:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/8pj502vneuis07hkzrxy.png)

Deste ponto em diante, as máquinas virtuais serão configuradas separadamente.

Você pode fechar a janela `3-all` do `TMUX` pressionando `CTRL+d` duas vezes (a primeira para desconectar das máquinas virtuais e a segunda para sair dos 6 terminais abertos na janela "all" o que, consequentemente, fechará essa janela).

Para mudar para a janela `1-masters`, você deve pressionar `CTRL+b` e em seguida pressionar `1` (o número de identificação da janela).

Essa notação no `TMUX` é representada assim: `C-b 1`

Você também pode digitar `exit` e pressionar `ENTER` e repetir essa ação para fechar os painéis e a janela `3-all`.

Na imagem abaixo são mostrados os painéis após digitar a primeira sequência:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/k8rnq76lcmu7tvbqkiuj.png)

---

Próximo: [Instalando o Control Plane no primeiro Master](https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-3-4p2a)