Este repositório documenta a configuração de um cluster Kubernetes usando Raspberry Pi 4, k3s, Flannel e MetalLB. O objetivo é fornecer um guia passo a passo para configurar um cluster funcional e acessível a partir de outros dispositivos na mesma rede.
- Pré-requisitos
- Arquitetura do Cluster
- Configuração do Ambiente
- Instalação do k3s
- Configuração do Flannel
- Configuração do MetalLB
- Deploy de Aplicações
- Monitoramento e Acesso ao Cluster
- Recursos Adicionais
- Contribuições
- Licença
- 3 Raspberry Pi 4 com pelo menos 2GB de RAM.
- Cartões microSD com pelo menos 16GB.
- Sistema operacional: Ubuntu Server.
- Rede interna com DHCP configurado.
- Master Node: 1 Raspberry Pi (com k3s server).
- Worker Nodes: 2 Raspberry Pi (com k3s agent).
- Rede: Flannel como CNI (Container Network Interface).
- LoadBalancer: MetalLB configurado em modo Layer 2.
-
Após instalação do Ubuntu Server no cartão de memória, vocês podem estar configurando o IP fixo do Raspberry Pi no
arquivo "network-config" como exemplo abaixo:
network:
version: 2
ethernets:
eth0:
addresses: [192.168.0.201/24]
gateway4: 192.168.0.1
dhcp4: false
optional: true
nameservers:
addresses: [192.168.0.1, 0.0.0.0]
Para conectar a esse Raspberry Pi pela rede vou utilizar a conexão por ssh.
OBS: Lembrando de conferir se a porta 22 e a conexão por autenticação esteja liberada. Vocês podem está verificando isso em /etc/ssh no arquivo ssh_config
Após essa configuração, podem inserir o cartão de memória no Raspberry Pi e conectar pelo terminal utilizando o comando ssh.
Obs: Esses passos têm que ser realizados em todos os Raspberry Pi que irão fazer parte do seu Cluster.
Iremos realizar os comandos pelo terminal e com o usuário Root.
Digite o seguinte comando para ir como Root e depois a senha do root.
sudo suConfigurando os hostname dos clusters com o seguinte comando:
hostname cluster01Para salvar o nome no arquivo host teremos que executar o comando abaixo:
echo "cluster01" > /etc/hostnameSe você quiser confirmar se foi alterado o nome, execute esse comando:
cat /etc/hostnameAdicionar o IP do Raspberry Pi no arquivo hosts, para isso vamos usar o seguinte comando com o nano como o exemplo abaixo:
nano /etc/hosts127.0.0.1 localhost
192.168.0.201 cluster01
::1 localhost
127.0.1.1 pop-os.localdomain pop-osObs. Se for configurar o Kubernetes em desktops, temos que desabilitar o Swap.
Como no Raspberry Pi não vem ativado. não iremos executar esse comando:
swapoff -aHabilitando a memória que por padrão ela vem desabilitada:
nano /boot/firmware/cmdline.txtNo final da linha você irá adicionar o seguinte:
cgroup_enable=cpuset, cgroup_enable=memory, cgroup_memory=1, swapaccount=1Também temos que instalar o Java e o Docker
Vamos criar um arquivo .json
Para isso, vamos utilizar o seguinte comando:
nano /etc/docker/daemon.jsonEle é um arquivo novo e vamos digitar os seguintes comandos:
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
Não podemos esquecer de habilitar uma opção no arquivo sysctl.conf.
Para isso vamos executar o seguinte comando:
nano /etc/sysctl.conftem que localizar a linha que está escrito #net.ipv4.ip_forward=1 e remover o #
- Instale o k3s no nó master com o Flannel:
curl -sfL https://get.k3s.io | sh -s - --flannel-iface=eth0
- Obtenha o token do master para conectar os nós workers:
cat /var/lib/rancher/k3s/server/node-token
- Conecte os workers ao cluster:
curl -sfL https://get.k3s.io | K3S_URL=https://<master-node-ip>:6443 K3S_TOKEN=<token> sh -
O Flannel é configurado automaticamente pelo k3s. Verifique se a rede está funcional com:
kubectl get pods -A
- Instale o MetalLB:
sudo kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.9/config/manifests/metallb-native.yaml
- Configure o MetalLB com um intervalo de IPs da sua rede local:
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
namespace: metallb-system
name: ip-pool
spc:
address:
- 192.168.1.100-192.168.1.110
- Aplique a configuração:
kubectl apply -f poll-metallb.yaml
- Configurando Advanced L2 Configuration:
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: homelab-l2
namespace: metallb-system
spec:
ipAddressPools:
- ip-pool
- Aplique a configuração Advanced L2 Configuration:
sudo kubectl apply -f L2Advertisement.yaml
Exemplo de deploy de uma aplicação simples:
sudo kubectl create deploy nginx –image nginx:latestExpondo o Nginx para acessar pelo browser:
sudo kubectl expose deploy nginx –port 80 --type LoadBalancerAgora podemos acessar pelo endereço http://192.168.0.101:80 no seu browser
- Acesse suas aplicações pelo IP atribuído pelo MetalLB.
- Use
kubectlpara monitorar o estado do cluster e dos pods.
Contribuições são bem-vindas! Sinta-se à vontade para abrir issues e pull requests.
Este projeto está licenciado sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.