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

Continuando o post [anterior](https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-2-46kp)

# Instalando o `Control Plane` no primeiro `Master`

Ao mudar para a janela `1-masters` o comando `./conn.sh` deve estar pronto para ser executado. Faça isso pressionando `ENTER`.

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

*Configure o auto completion para o `kubectl`*

```shell
cat <<EOF | tee --append ~/.bashrc

source <(kubectl completion bash)
alias k=kubectl
complete -F __start_kubectl k
EOF
source ~/.bashrc
```

Além de configurar o completion, o comando anterior também criou um alias que permite usar apenas `k` ao invés de `kubectl`.

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

## **Atenção: deste ponto em diante, você deve realizar a configuração apenas no primeiro `master`**

Para isso, você precisa desativar a sincronização de janelas no `TMUX`.

A configuração que usei consiste na combinação `C-b y`. Caso queira usar a mesma combinação de teclas, sugiro criar o arquivo `${HOME}/.tmux.conf` exatamente como criei [aqui](https://github.com/smsilva/linux/blob/master/scripts/utilities/tmux/tmux.conf).

Você também pode pressionar `C-b` (`CTRL+b`) e digitar o comando abaixo (incluindo os dois pontos no início da linha) para desativar a sincronização dos painéis:

```shell
:set-window-option synchronize-panes off
```

Tenha certeza de que os painéis não estão mais sincronizados (digite algo no terminal ou pressione `ENTER` algumas vezes para ter certeza):

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

## Configurando a versão do Kubernetes

Neste exemplo você pode manter a versão `1.18` mas este processo também foi testado com sucesso na `1.17`.

```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%-*}" && \
LOCAL_IP_ADDRESS=$(grep $(hostname --short) /etc/hosts | awk '{ print $1 }') && \
LOAD_BALANCER_PORT='6443' && \
LOAD_BALANCER_NAME='lb' && \
CONTROL_PLANE_ENDPOINT="${LOAD_BALANCER_NAME}:${LOAD_BALANCER_PORT}" && \
echo "" && \
echo "LOCAL_IP_ADDRESS...........: ${LOCAL_IP_ADDRESS}" && \
echo "CONTROL_PLANE_ENDPOINT.....: ${CONTROL_PLANE_ENDPOINT}" && \
echo "KUBERNETES_BASE_VERSION....: ${KUBERNETES_BASE_VERSION}" && \
echo ""
```
Três informações serão exibidas:
* O endereço `IP` da máquina (`192.168.10.11`)
* O `Control Plane Endpoint` (`lb:6443` - endereço que será usado por todos os `nodes` para comunicação com o `Control Plane`)
* A versão mais recente encontrada no repositório

Observe a imagem abaixo:

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

## **Inicializando o `Control Plane`**

```shell
SECONDS=0 && \
KUBEADM_LOG_FILE="${HOME}/kubeadm-init.log" && \
NODE_NAME=$(hostname --short) && \
sudo kubeadm init \
  --v 3 \
  --node-name "${NODE_NAME}" \
  --apiserver-advertise-address "${LOCAL_IP_ADDRESS}" \
  --kubernetes-version "${KUBERNETES_BASE_VERSION}" \
  --control-plane-endpoint "${CONTROL_PLANE_ENDPOINT}" \
  --upload-certs | tee "${KUBEADM_LOG_FILE}" && \
printf '%d hour %d minute %d seconds\n' $((${SECONDS}/3600)) $((${SECONDS}%3600/60)) $((${SECONDS}%60))
```

Esse processo não deve levar mais que 1 minuto pois já havíamos efetuado o preloading das imagens usadas por ele.

Ao término da execução você deve visualizar as seguintes informações no terminal:

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

## Você deve configurar o acesso do `kubectl` ao cluster recém criado

```shell
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
```

## Verificando o Status do Cluster

Neste momento, o Control Plane está ativo porém, o único nó do cluster é o `master-1` e ele está como `NotReady`.

Isso acontece porque ainda não instalamos o plugin de `CNI` (`Container Network Interface`) para habilitar a `POD Network` que é a rede que permite a comunicação entre as `PODs` no `Cluster`.

Para entender melhor, vamos deixar executando um comando que vai exibir os nós e alguns objetos que já foram criados no `namespace` `kube-system` usando o comando abaixo:

```shell
watch -n 3 'kubectl get nodes,pods,services -o wide -n kube-system'
```

Observe o status do `master-1`:

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

Perceba também que as duas `PODs` do `coredns` estão com o status `Pending` e continuarão assim até que seja instalado um plugin `CNI`.

Como esse ambiente destina-se ao aprendizado de `Kubernetes` e temos uma limitação considerável de memória, usaremos o `Plugin Weave`.

Você pode encontrar uma lista de plugins e suas instruções de instalação [aqui](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network).

Antes de executar o comando para instalar o plugin `Weave`, criarei um novo painel no `TMUX` para executar os comandos e manter o monitoramento do passo anterior na tela.

Optei por fazer isso para que você possa perceber quando:

* O `master-1` mudar de `NotReady` para `Ready`
* As novas `PODs` para o agente `Weave` forem criadas, e
* As PODs do `coredns` mudarem para `Running`.

Para criar um novo painel no `TMUX` *(considerando que você está usando a mesma configuração que eu no arquivo ${HOME}/.tmux.conf)*, use o comando `C-b "`.

O painel do `master-1` será então dividido em dois:

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

Você pode ajustar os tamanhos dos painéis usando o mouse.

Para habilitar isso, pode usar o comando `C-b m` (esse comando ativa ou desativa o modo mouse).

Veja como reduzi o tamanho dos painéis inferiores:

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

No novo painel, precisamos conectar ao `master-1` usando `ssh`. Para isso usaremos a função nativa do `Vagrant`:

```shell
vagrant ssh master-1
```
Nova conexão ao `master-1` realizada:

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

Agora execute o comando para instalar o plugin `Weave Net` para a `Pod Network`.

```shell
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
```

Após executar o comando anterior você verá um log de alguns objetos criados e no painel superior poderá acompanhar a atualização das `PODs` e do status do `master-1`.

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

Após alguns segundos, verifique que as atualizações mencionadas anteriormente aconteceram:

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

---

Próximo: [Adicionando os outros masters ao Cluster](https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-4-20cl)