DEV Community

Cover image for #K8S01: Criando Cluster Kubernetes para Fins Didáticos
wesleysouza
wesleysouza

Posted on • Edited on

13 2

#K8S01: Criando Cluster Kubernetes para Fins Didáticos

Introdução

O Kubernetes é um sistema de orquestração de contêineres que automatiza a implantação, o dimensionamento e a gestão de aplicações. Por esses e outros motivos, se tornou uma referência no mercado.

Empresas dos mais variados tamanhos estão empregando o Kubernetes para implantar as suas aplicações na nuvem. Além disso, a academia também está utilizando o Kubernetes no desenvolvimento de novas aplicações. Sendo assim, é fundamental conhecer essa ferramenta nos dias de hoje.

No presente tutorial é descrito como instalar e configurar um cluster Kubernetes com três Nodes (um master e dois workers) utilizando o Virtualbox. Cada um desses Nodes será uma máquina virtual criada através do Virtualbox e rodando o sistema operacional Ubuntu Server 22.04.

Obs.: Esse cluster deve ser utilizado apenas para fins didáticos.

Criando e Configurando as Máquinas Virtuais

Em primeiro lugar, para seguir esse tutorial é necessário a criação de 3 máquinas virtuais com as características descritas na tabela abaixo:

host user ip cpus RAM configuração de rede
k8s_01.contro_plane.net k8s 192.168.0.100 2 2 placa em modo bridge
k8s_02.worker_01.net k8s 192.168.0.101 2 2 placa em modo bridge
k8s_03.worker_03.net k8s 192.168.0.102 2 2 placa em modo bridge

Em todas as máquinas é recomendada a instalação do Ubuntu Server 22.04. Quanto aos recursos relacionados ao hardware, a quantidade de cpu e memória RAM definidas seguem as recomendações mínimas. Além disso, foi definido 20 GB de capacidade de armazenamento para cada nó.

Após a instalação do Ubuntu Server 22.04, altere as configurações de rede (tipo de adaptador) de cada uma das máquinas para o modo bridge. A ideia aqui é que você seja capaz de acessar via ssh os nós do seu cluster por qualquer dispositivo conectado na sua rede local.

Dica: Para acelerar a instalação, crie uma máquina virtual e instale o Ubuntu. Após terminar a instalação faça duas cópias dessa máquina (na opção de cópia selecione a opção de gerar um novo endereço MAC) e as utilize como nós worker. Para deixar tudo organizado, mude o nome das máquinas clonadas editando o arquivo \etc\hostname como no exemplo abaixo:

k8s_01.control_plane.net
#Faça isso em todos os nós
Enter fullscreen mode Exit fullscreen mode

Além disso, configure a resolução de nome entre os Nodes do seu cluster adicionando o nome e o ip das máquinas no arquivo /etc/hosts, veja o exemplo abaixo:

127.0.0.1 localhost
127.0.1.1 ubuntu

#Inicio do conteúdo adicionado
192.168.0.100   k8s_01.control_plane.net k8s_01
192.168.0.101   k8s_02.worker_01.net k8s_02
192.168.0.102   k8s_03.worker_02.net k8s_03
#fim do conteúdo adicionado

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Enter fullscreen mode Exit fullscreen mode

Para evitar problemas de mudança de ip dos Nodes do cluster (coisa que pode acontecer caso seja o endereçamento seja configurado via DHCP), na configuração de rede defina ips estáticos. Essa configuração deve ser realizada via netplan. A configuração é simples, por exemplo, considerando a rede local 192.168.0.0, máscara de sub-rede 255.255.255.0 (/24) e gateway 192.168.0.1 o conteúdo do arquivo referente ao netplan deve conter o seguinte conteúdo:

network:
  ethernets:
    enp0s3:
      addresses:
         - 192.168.0.100/24
      nameservers:
        addresses: [1.1.1.1, 8.8.8.8]
      routes:
        - to: default
          via: 192.168.0.1
  version: 2
Enter fullscreen mode Exit fullscreen mode

Os demais Nodes podem ser configurados de forma semelhante, alterando apenas o campo referente ao ip. Caso seja necessário, consulte os exemplos do netplan.

Após realizar a configuração de rede verifique se todos os Nodes:

  • estão respondendo no endereço ip configurado;
  • possuem acesso a rede para baixar todos os pacotes necessários.

Se os seus Nodes passaram nessa verificação chegou o momento de iniciarmos a instalação do Kubernetes.

Instalando o Kubernetes

A instalação é relativamente simples, atualize o seu sistema com os comandos abaixo e siga cada um dos passos descritos a seguir:

sudo apt update
sudo apt upgrade -y
Enter fullscreen mode Exit fullscreen mode

Passo 1: Desative o swap e adicione as configurações de kernel necessárias:

⚠️ Esse passo deve ser realizado em todos os Nodes.

#Desativando o swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
Enter fullscreen mode Exit fullscreen mode

Agora vamos carregar os módulos do kernel necessários em todos nos Nodes:

sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
Enter fullscreen mode Exit fullscreen mode

Após carregar os módulos, vamos configurar parâmetros do Kernel para o Kubernetes:

sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF 
Enter fullscreen mode Exit fullscreen mode

Para finalizar, execute o comando abaixo para que as modificações tenham efeito:

sudo sysctl --system
Enter fullscreen mode Exit fullscreen mode

Passo 2: Instalando e configurando o containerd runtime

⚠️ Esse passo deve ser realizado em todos os Nodes.

Execute o comando abaixo para instalar as dependências:

sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
Enter fullscreen mode Exit fullscreen mode

Ative o repositório do Docker:

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Enter fullscreen mode Exit fullscreen mode

Agora podemos instalar o containerd:

sudo apt update
sudo apt install -y containerd.io
Enter fullscreen mode Exit fullscreen mode

Após a instalação, vamos configurar o containerd para que ele inicie usando o systemd como cgroup:

containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
Enter fullscreen mode Exit fullscreen mode

Para finalizar esse passo, reinicie e ative o serviço do continerd:

sudo systemctl restart containerd
sudo systemctl enable containerd
Enter fullscreen mode Exit fullscreen mode

Passo 3: Adicionando o repositório apt do Kubernetes e instalando os componentes Kubectl, kubeadm e kubelet:

⚠️ Esse passo deve ser realizado em todos os Nodes.

Faça Download da chave pública do Google:

sudo curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
Enter fullscreen mode Exit fullscreen mode

Adicione o repositório apt do Kubernetes:

echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
Enter fullscreen mode Exit fullscreen mode

Download a Google Cloud public signing key:

curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ 
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
Enter fullscreen mode Exit fullscreen mode

Atualize o apt:

sudo apt-get update
Enter fullscreen mode Exit fullscreen mode

Agora podemos finalizar esse passo instalando os componentes:

sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
Enter fullscreen mode Exit fullscreen mode

Passo 4: Configurando o control plane e obtendo informações importantes

⚠️ Esse passo deve ser realizado apenas no nó que será responsável pelo control plane.

Para iniciar, entre no Node que será responsável pelo control plane (o principal Node) e execute o comando abaixo:

sudo kubeadm init
Enter fullscreen mode Exit fullscreen mode

Exemplo de saída do comando se estiver tudo certo:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.0.100:6443 --token jfri31.ofryjs5y52dqkqc3 \
        --discovery-token-ca-cert-hash sha256:c7a20a2be5c2adb091f9657166a416aaff60f7b89b9bfc68016c165c129112a1
Enter fullscreen mode Exit fullscreen mode

Essa saída é muito importante, ela contém as informações para realizar a configuração que vai possibilitar o acesso, adição de nós e etc. Na Figura abaixo, foi destacado o que devemos observar com mais cuidado:

Image description

Logo, observando a figura será necessário executar o comando abaixo como usuário "normal" ou sem privilégios para gerenciar o seu novo cluster:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Enter fullscreen mode Exit fullscreen mode

Após essa configuração, vamos adicionar os nós.

Passo 5: Adicionando os nós workers

⚠️ Esse passo deve ser realizado nos Nodes que vão ser adicionados ao cluster.

Na última figura foi apresentada a saída do comando kubeadm init onde foi indicado onde está o comando para adicionar um novo nó. Esse comando deve ser executado nos Nodes que vão ser adicionados ao cluster e é semelhante ao apresentado abaixo:

kubeadm join 192.168.0.100:6443 --token jfri31.ofryjs5y52dqkqc3 \
        --discovery-token-ca-cert-hash sha256:c7a20a2be5c2adb091f9657166a416aaff60f7b89b9bfc68016c165c129112a1
Enter fullscreen mode Exit fullscreen mode

Obs.: Será necessário executar o comando com permissão de administrador (sudo) no Node worker para adiciona-lo ao cluster!

Se tudo correu bem você verá uma mensagem de sucesso semelhante a apresentada abaixo:

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
Enter fullscreen mode Exit fullscreen mode

Pronto, agora podemos verificar o STATUS dos Nodes adicionados com o comando abaixo:

kubectl get nodes
Enter fullscreen mode Exit fullscreen mode

A saída esperada para 3 Nodes vai ser semelhante a apresentada abaixo:

NAME                     STATUS     ROLES           AGE     VERSION
k8s01.controlplane.net   NotReady   control-plane   10m     v1.26.0
k8s02.worker01.net       NotReady   <none>          4m14s   v1.26.0
k8s03.worker02.net       NotReady   <none>          2m56s   v1.26.0
Enter fullscreen mode Exit fullscreen mode

Analisando a saída, você provavelmente viu que tem algo errado, os Nodes do nosso cluster estão com o STATUS NotReady. Para que esses Nodes fiquem "prontos" ainda precisamos instalar e configurar um componente, a "rede" do Kubernetes.

Passo 6: Calico Pod Network Add-on:

⚠️ Esse passo deve ser realizado apenas no nó que será responsável pelo control plane.

Existem várias opções de pod network, mas nesse tutorial vamos instalar o Calico Pod Network.

Para instalar o Calico execute os comandos abaixo no seu principal Node:

curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml -O
kubectl apply -f calico.yaml
Enter fullscreen mode Exit fullscreen mode

Após a instalação, verifique o status dos pods no namespace kube-system com o comando kubectl get pods -n kube-system. Observe se os pods do Calico estão com o STATUS Running como na figura abaixo:

Image description

Após checar os pods, aguarde uns segundos e verifique se os Nodes do seu cluster estão com o status Ready como apresentado abaixo:

NAME                     STATUS   ROLES           AGE     VERSION
k8s01.controlplane.net   Ready    control-plane   3h11m   v1.26.0
k8s02.worker01.net       Ready    <none>          3h5m    v1.26.0
k8s03.worker02.net       Ready    <none>          3h3m    v1.26.0
Enter fullscreen mode Exit fullscreen mode

Se sua saída for semelhante a apresentada acima, está tudo certo, já pode começar a quebradeira!

Extra

Aqui no extra vou descrever de maneira breve como você pode criar o seu primeiro pod e trabalhar com mais de uma interface de rede (não recomendo).

Criando nosso primeiro pod

É possível criar um pod de diversas maneiras, a minha preferida é escrevendo o arquivo de manifesto. Sendo assim, crie um arquivo com o nome pod.yaml contendo o conteúdo abaixo:

apiVersion: v1
kind: Pod
metadata:
  name: meu-pod
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
Enter fullscreen mode Exit fullscreen mode

Após salvar o arquivo execute o comando kubectl apply -f pod.yaml para criar o pod.

Verifique se o pod está sendo executado com o comando kubectl get po. Caso esse pod estaja com o STATUS Running você acaba de criar o seu primeiro pod.

Trabalhando com mais de uma interface de rede

Caso você tenha configurado mais de uma interface de rede, você pode verificar se o ip interno do nó do seu cluster corresponde ao ip da interface esperada com o seguinte comando:

kubectl describe node k8s_01 | grep InternalIP
Enter fullscreen mode Exit fullscreen mode

Caso o endereço ip não corresponda ao da interface de rede escolhida, você pode ir até o arquivo localizado em /etc/systemd/system/kubelet.service.d/10-kubeadm.conf com o editor da sua preferência, procurar por KUBELET_CONFIG_ARGS e adicionar no final a instrução –node-ip=. O trecho alterado será semelhante abaixo:

Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml --node-ip=192.168.0.101"
Enter fullscreen mode Exit fullscreen mode

Salve o arquivo e execute os comandos abaixo para reiniciar a configuração e consequentemente o kubelet.

sudo systemctl daemon-reload
sudo systemctl restart kubelet
Enter fullscreen mode Exit fullscreen mode

É isso, espero que esse conteúdo tenha sido útil para você, abraço :)

Referências

Livro Descomplicando o Kubernetes

Curso Descomplicando o Kubernetes

O que é Kubernetes

Orquestração de contêineres prontos para produção

How to Install Kubernetes Cluster on Ubuntu 22.04

Install Calico networking and network policy for on-premises deployments

AWS GenAI LIVE image

How is generative AI increasing efficiency?

Join AWS GenAI LIVE! to find out how gen AI is reshaping productivity, streamlining processes, and driving innovation.

Learn more

Top comments (0)

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay