DEV Community

Cover image for Instalando Kubernetes do Zero
Cristiano Lemes
Cristiano Lemes

Posted on • Edited on

Instalando Kubernetes do Zero

Introdução

O Kubernetes emergiu como a principal plataforma de orquestração de containers, permitindo que organizações gerenciem e dimensionem aplicativos de maneira eficiente em ambientes de produção e desenvolvimento. Com sua arquitetura distribuída e recursos de automação robustos, o Kubernetes simplifica a implantação, o gerenciamento e a escalabilidade de aplicativos em containers.

Neste artigo, vamos explorar o processo de instalação do Kubernetes a partir do zero, utilizando o Kubeadm. O Kubeadm é uma ferramenta de linha de comando que facilita a configuração de clusters Kubernetes, oferecendo um método simplificado para inicializar e configurar um ambiente Kubernetes.
Estaremos fazendo toda instalando manualmente para fins didáticos, mas para esse tipo de instalação pode ser usado um gerenciador de configuração como Ansible para automatizar esse processo, que pode ser feito tanto em um servidor baremetal quanto em uma VM.

Arquitetura do kubernetes
Componentes Kubernetes

Componentes do Controlplane:

  • kube-apiserver: É o componente central do Kubernetes que expõe a API do Kubernetes. Todas as operações do cluster, como criação, atualização e exclusão de recursos, são realizadas através desta API.
  • etcd: Um banco de dados chave-valor distribuído usado para armazenar o estado do cluster Kubernetes, incluindo configurações, metadados e informações sobre os nós e os pods.
  • kube-scheduler: Responsável por agendar pods em execução nos nós do cluster. Ele considera requisitos de recursos, afinidades e restrições ao tomar decisões sobre onde os pods devem ser executados.
  • kube-controller-manager: É responsável pela execução dos controladores do Kubernetes. Os controladores monitoram o estado do cluster e fazem ajustes para garantir que o estado desejado seja mantido. Exemplos de controladores incluem o controlador de replicação, o controlador de endpoints e o controlador de serviço.

Componentes do Node:

  • kubelet: Agente que executa nos nós do cluster e é responsável por garantir que os containers estejam em execução em um nó. Ele se comunica com o kube-apiserver para receber instruções sobre quais pods devem ser executados e garante que os containers nos pods estejam saudáveis.
  • kube-proxy: É um proxy de rede que executa no nó e mantém as regras de encaminhamento de rede. Ele gerencia o tráfego de rede para os pods no nó, permitindo que os mesmos se comuniquem entre si e com recursos externos.
  • Container runtime: Um container runtime é uma parte essencial do ecossistema de contêineres. Ele é responsável por executar e gerenciar os containers. Ele provê isolamento de recursos, como cpu, memoria, redes e volumes, e faz a gestão do ciclo de vida do container. Ele é o componente reposnavel pela comunicação entre o container e o kernel.

Tipos implantação do Kubernetes

O método mais comum atualmente é utilizar uma distribuição de Kubernetes gerenciada, oferecida por provedores como Amazon, Google e Microsoft. No entanto, existem três abordagens principais para usar o Kubernetes.

Plataformas Gerenciadas: No Kubernetes gerenciado, você não terá controle sobre o control plane, que é o nó responsável por gerenciar o cluster Kubernetes. Isso simplifica a manutenção do cluster, porém limita algumas personalizações. Por exemplo, você não poderá atualizar a versão do Kubernetes por conta própria; essa tarefa fica a cargo do provedor, e você só terá acesso às versões que eles validaram.

Distribuiçoes Kubernetes: Existem distribuições que vêm empacotadas, que auxiliam desde da instalação da máquina, virtual ou baremetal, algumas tendo inclusive sistema operacional customizado para o kubernetes como é o caso do RKE, os instaladores vão fazer toda parte de instalação do cluster e configurar ferramentas auxiliares como helm e stacks de monitoramento, entregado o cluster pronto para uso no final.

Implantação Manual: Ao criar o cluster a partir do zero e instalar manualmente cada componente, você tem controle total sobre o cluster, podendo personalizá-lo e utilizar qualquer versão do Kubernetes. No entanto, isso implica em mais etapas de manutenção e uma maior responsabilidade sobre o cluster.

Kubernetes Gerenciado:

  • EKS Amazon Elastic Kubernetes Service
  • AKS Azure Kubernetes Service
  • GKE Google Kuberneste Engine
  • DOKS DigitalOcean Kubernetes

Distribuições Kubernetes:

  • RKE Rancher Kubernetes Engine (OpenSource)
  • RedHat OpenShift (Comercial, mas tem a versão aberta chamada OKD)
  • VMware Tanzu (Comercial)

Implantação Manual:

  • kubeadm: O que usarei neste artigo
  • kops: Ferramenta para criar o cluster de forma automatizada
  • kubepray: Ferramenta que usa o ansioble para provisionar o cluster

Configurações mínimas para o cluster:

  • SO Linux
  • CPU: 2
  • Memória: 2GB
  • Conexão de rede entre todas as máquinas no cluster
  • Swap desabilitado.
  • Acesso ssh aos servidores

Portas necessárias:

Libere essas portas no firewall para comunicação entre os nós.

Protocolo Direção Intervalo de Portas Propósito Utilizado por
TCP Entrada 6443 Servidor da API do Kubernetes Todos
TCP Entrada 2379-2380 API servidor-cliente do etcd kube-apiserver, etcd
TCP Entrada 10250 API do kubelet kubeadm, Camada de gerenciamento
TCP Entrada 10259 kube-scheduler kubeadm
TCP Entrada 10257 kube-controller-manager kubeadm
TCP Entrada 10250 API do Kubelet kubelet, Camada de gerenciamento
TCP Entrada 30000-32767 Serviços NodePort Todos
TCP Entrada 6783 Weave Pod Network Todos
UDP Entrada 6783-6784 Weave Pod Network Todos

Requisitos de máquinas para o cluster.

Para seguir este tutorial pode ser usado VM locais, ou máquinas de um provedor de cloud, estaremos usando três máquinas, mas dá para testar em apenas uma, lembrando que o controlplane por padrão não roda container de aplicações, apenas de serviços do control-plane, mas configuração que pode ser alterada facilmente usando taints.

Configurando os nós do Cluster.

Acessando cada nó do cluster, vamos iniciar instalando e configurando os pré-requisitos para rodar o kubernetes, estarei utilizando o Sistema Operacional Ubuntu 22.04.

1- Deslique o SWAP, Kubelet não funciona com SWAP Ativa, e remova sua entrada do arquivo /etc/fstab/.

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

2- Habilite os modulos do kernel necessários para o funcinamento do cluster, para isso vamos criar o arquivo k8s.conf em /etc/modules-load.d/, depois use o modprobe para carregar os modulos sem ser necessario dar um reboot.

sudo modprobe overlay
sudo modprobe br_netfilter

Enter fullscreen mode Exit fullscreen mode

3- Configurando parametros de rede, vamos criar o arquivo k8s.conf agora na pasta do systcl etc/sysctl.d/ para que o linux possa visualizar o tráfego de redes, depois use o sysctl para aplicar as mudanças sem ser necessário dar um reboot.

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sudo sysctl --system
Enter fullscreen mode Exit fullscreen mode

Intalando binarios do kubernetes

1- Atualize o repositorio apt e instale os pacotes basicos para baixar do repositorio oficial do kubernetes:

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
Enter fullscreen mode Exit fullscreen mode

2- Faça download da chave pública do Google cloud:

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

Enter fullscreen mode Exit fullscreen mode

3- Adicione o repositório apt do Kubernetes:

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
Enter fullscreen mode Exit fullscreen mode

4- Atualize o apt e instale o kubelet, o kubeadm e o kubectl. Use o hold para fixar as versões para evitar problemas em atualizações automaticas.

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

Instalando um container runtime, iremos utilizar o containerd.

1- Instale o containerd

sudo apt-get install containerd.io
Enter fullscreen mode Exit fullscreen mode

2- Gere arquivo de configuraça padrão do Containerd.

sudo containerd config default | sudo tee /etc/containerd/config.toml

Enter fullscreen mode Exit fullscreen mode

3- Configure o systemd como cgroup driver, use o comando sed para alterar o arquivo gerado no passo anterior.

sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

Enter fullscreen mode Exit fullscreen mode

4- Confirme que o serviço containerd está habilitado e reinicie-o para aplicar a alteração do arquivo.

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

Criando o Cluster

Essas etapas devem ser feitas no nó que funcionará como controlplane.

  1. Inicie o controlplane usando o kubeadm.
sudo kubeadm init --pod-network-cidr=10.10.0.0/16 --apiserver-advertise-address=<ip-da-maquina>
Enter fullscreen mode Exit fullscreen mode

Há parametros opcionais que podem ser usados com o kubeadm, como --apiserver-advertise-address onde você espifica qual ip do nó vai ser usado pela api do controlplane, util se tiver mais de uma interface de rede configurado na maquina. Você consegue obter facilmente usando o comando ip a, tendo um ip publico e outro privado escolha o privado.

Output do kubeadm init

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

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

You can now join any number of machines by running the following on each node
as root:

  kubeadm join <control-plane-host>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
Enter fullscreen mode Exit fullscreen mode

Ele vai imprimir na tela o comando para adicionar os nós do cluster, se você perder o token, você pode executar no servidor control-plane.

kubeadm token list
Enter fullscreen mode Exit fullscreen mode
  1. Crie o arquivo de configuração do kubernetes para gerenciar o cluster, apos executar o init o kubeadm gera as credenciais para o cluster em /etc/kubernetes/admin.conf, é necessarios por o conteudo deste arquivo
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

Agora já pode verificar o status do cluster

kubectl get nodes

NAME                         STATUS     ROLES           AGE     VERSION
k8s-lab   NotReady   control-plane   5m30s   v1.30.7
Enter fullscreen mode Exit fullscreen mode
  1. Adicionando outros nós no cluster. Agora que o cluster está up, execute o comando kubeadm join com as especificaçãos obtidas no output da criação do cluster
  kubeadm join <control-plane-host>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
Enter fullscreen mode Exit fullscreen mode

Verificando novamente os nós, agora temos todos listados, mas ainda está com status NotReady, o kubernetes não possui nativamente gerencimanto de rede, por isso devemos instalar um plugin para suprir essa necessidade.

kubectl get nodes

NAME                         STATUS     ROLES           AGE     VERSION
ubuntu-s-2vcpu-2gb-sfo3-01   NotReady   <none>          8s      v1.30.7
ubuntu-s-2vcpu-2gb-sfo3-02   NotReady   control-plane   5m30s   v1.30.7
ubuntu-s-2vcpu-2gb-sfo3-03   NotReady   <none>          7s      v1.30.7
Enter fullscreen mode Exit fullscreen mode
  1. Adicionando Plugin de Redes.

O kubernetes possui uma interface padronizada para que os plugins possam se integrar facilmente a ele, chamado CNI container network interface, com ele podemos escolher entre varias opções de plugins que se adequem a nossa necessidade.
Alguns dos principais plugins CNI usados em ambientes de containers, especialmente em clusters Kubernetes, incluem:

  • Calico: Um plugin de rede de código aberto que oferece funcionalidades avançadas de rede, incluindo políticas de rede baseadas em identidade e suporte a BGP (Border Gateway Protocol) para escalabilidade e interoperabilidade.
  • Flannel: Um plugin de rede simples e leve que cria uma rede sobreposta (overlay network) para conectar os containers em um cluster. Ele é popular por sua simplicidade e escalabilidade.
  • Weave: Outro plugin de rede de sobreposição que cria uma rede virtual privada (VPN) entre os nós do cluster. Weave oferece suporte a funcionalidades como criptografia de ponta a ponta e descoberta automática de serviços.
  • Cilium: Um plugin de rede e segurança que combina roteamento baseado em BPF (Berkeley Packet Filter) com política de segurança de camada 7. Ele fornece recursos avançados de segurança e observabilidade para containers e microsserviços.
  • Kube-router: Um plugin de rede que integra o roteamento baseado em BGP diretamente no Kubernetes, permitindo o balanceamento de carga de entrada e saída do cluster.

Para esse tutorial estarei utilizando o flannel.

Instale o plugin usando o yaml.

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

---
namespace/kube-flannel created
serviceaccount/flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

Enter fullscreen mode Exit fullscreen mode

Verificando o cluster e efetuando testes.

  1. Após a instalação do cluster os Status muda para Ready
kubectl get nodes
NAME                         STATUS   ROLES           AGE   VERSION
ubuntu-s-2vcpu-2gb-sfo3-01   Ready    <none>          33m   v1.30.7
ubuntu-s-2vcpu-2gb-sfo3-02   Ready    control-plane   43m   v1.30.7
ubuntu-s-2vcpu-2gb-sfo3-01   Ready    <none>          34m   v1.30.7
Enter fullscreen mode Exit fullscreen mode
  1. Checando os pods de sistema.
kubectl get pods -n kube-system
NAME                                                 READY   STATUS    RESTARTS        AGE
coredns-76f75df574-bsn9k                             1/1     Running   0               47m
coredns-76f75df574-mfpt2                             1/1     Running   0               47m
etcd-ubuntu-s-2vcpu-2gb-sfo3-02                      1/1     Running   0               48m
kube-apiserver-ubuntu-s-2vcpu-2gb-sfo3-02            1/1     Running   0               47m
kube-controller-manager-ubuntu-s-2vcpu-2gb-sfo3-02   1/1     Running   0               48m
kube-proxy-4vfvf                                     1/1     Running   0               47m
kube-proxy-4vfvf                                     1/1     Running   0               47m
kube-proxy-t67tm                                     1/1     Running   0               38m
kube-scheduler-ubuntu-s-2vcpu-2gb-sfo3-02            1/1     Running   0               47m
weave-net-g9m6f                                      2/2     Running   1 (5m20s ago)   5m28s
weave-net-rvt2v                                      2/2     Running   1 (5m21s ago)   5m28s
weave-net-g9m6f                                      2/2     Running   1 (5m22s ago)   5m28s
Enter fullscreen mode Exit fullscreen mode
  1. Criando um container para testar o cluster.
kubectl create deployment nginx-web --image nginx --replicas 3
Enter fullscreen mode Exit fullscreen mode

4- Checando a criação dos container todos devem estar Running

kubectl get pods

NAME                         READY   STATUS    RESTARTS   AGE
nginx-web-5b757f798d-d9g2s   1/1     Running   0          24s
nginx-web-5b757f798d-pj57v   1/1     Running   0          24s
nginx-web-5b757f798d-z5bfx   1/1     Running   0          24s
Enter fullscreen mode Exit fullscreen mode

Conclusão
Neste artigo, exploramos o processo de instalação do Kubernetes a partir do zero, utilizando o Kubeadm como ferramenta principal. O Kubernetes emergiu como a principal plataforma de orquestração de containers, oferecendo uma arquitetura distribuída e recursos de automação robustos para gerenciar e escalar aplicativos em ambientes de produção e desenvolvimento.

Ao longo do artigo, cobrimos os seguintes pontos:

  • Componentes do Controlplane e dos Nodes do Kubernetes, destacando suas funções e importância dentro do ecossistema do Kubernetes.
  • Exploramos os diferentes tipos de implantação do Kubernetes, desde plataformas gerenciadas até implantações manuais, destacando as vantagens e considerações de cada abordagem.
  • Especificamos as configurações mínimas e as portas necessárias para configurar um cluster Kubernetes.
  • Detalhamos o processo de configuração dos nós do cluster, incluindo a desativação do SWAP, a instalação de binários do Kubernetes e a configuração do Container Runtime.
  • Demonstrações passo a passo para criar um cluster Kubernetes usando Kubeadm, desde a inicialização do controlplane até a adição de nós adicionais.
  • Finalmente, instalamos e configuramos um plugin de rede, essencial para que os pods possam se comunicar entre si e com recursos externos.

Em resumo, o Kubernetes oferece uma base sólida para implantar, gerenciar e escalar aplicativos em containers de maneira eficiente e escalável. Com o conhecimento adquirido neste artigo, os administradores de sistemas e desenvolvedores estão equipados para iniciar e gerenciar clusters Kubernetes, seja para ambientes de desenvolvimento, teste ou produção.

Referências:

Top comments (0)