DEV Community

Silvio Silva
Silvio Silva

Posted on

1

Configurando um Cluster Kubernetes em Alta Disponibilidade (3/5)

Continuando o post anterior

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

Configure o auto completion para o kubectl

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

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.

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:

: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

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.

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

Inicializando o Control Plane

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

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

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:

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

Observe o status do master-1:

Alt Text

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.

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

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

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

vagrant ssh master-1

Nova conexão ao master-1 realizada:

Alt Text

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

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

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

Alt Text


Próximo: Adicionando os outros masters ao Cluster

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs