Instalando o k3s em hardware baremetal - passo a passo e com uso do Terraform

Instalando o pequeno k3s Kubernetes em um cluster de homelab

Conteúdo da página

Aqui está um passo a passo para a instalação de um cluster K3s com 3 nós em servidores de metal nu (1 mestre + 2 trabalhadores).

Este guia pressupõe que você está começando com uma instalação mínima Linux (exemplo: Ubuntu 22.04 ou Debian) em cada servidor, e deseja hospedar por conta própria seu plano de controle e cargas de trabalho.

cluster Kubernetes de metal nu

K3s é uma versão leve de Kubernetes, que se adapta bem a este pequeno laboratório doméstico.

⚙️ Topologia do Cluster

Nome do Nó Função Hostname/IP
master-1 Servidor (Plano de Controle) 192.168.1.100
worker-1 Agente (Nó de Trabalho) 192.168.1.101
worker-2 Agente (Nó de Trabalho) 192.168.1.102

✅ Pré-requisitos

🧱 Hardware (Mínimo):

  • CPU: 2 núcleos
  • RAM: 2GB+ por nó
  • Disco: 20GB+ por nó

🛠 Requisitos do Sistema Operacional:

  • Linux (Ubuntu 22.04, Debian 12, etc.)
  • curl, ssh e sudo instalados
  • Acesso como root ou com sudo

🧼 Rede Limpa:

  • Certifique-se de que todos os nós possam resolver e pingar uns aos outros por IP ou hostname.

  • Desative o swap:

    sudo swapoff -a
    sudo sed -i '/ swap / s/^/#/' /etc/fstab
    

🚀 Instalação Passo a Passo


📍 Passo 1: Instale o K3s no Plano de Controle (master-1)

curl -sfL https://get.k3s.io | sh -

Após a instalação:

sudo cat /var/lib/rancher/k3s/server/node-token
  • Isso fornece o token de junção necessário para os nós de trabalho.

Confirme que o cluster está em execução:

sudo kubectl get nodes

k3s inclui um kubectl instalado como k3s kubectl ou vinculado como kubectl.


📍 Passo 2: Instale os Agentes do K3s (worker-1 & worker-2)

Repita em cada nó de trabalho:

Substitua <MASTER_IP> e <NODE_TOKEN> pelos valores do passo 1.

curl -sfL https://get.k3s.io | K3S_URL=https://192.168.1.100:6443 K3S_TOKEN=<NODE_TOKEN> sh -

Exemplos:

K3S_URL=https://192.168.1.100:6443 \
K3S_TOKEN=K10abcde123456789::server:abcde123456789 \
sh -c "$(curl -sfL https://get.k3s.io)"

📍 Passo 3: Verifique o Cluster a partir do master-1

kubectl get nodes

Você deve ver:

NAME        STATUS   ROLES    AGE   VERSION
master-1    Ready    control  5m    v1.29.2+k3s1
worker-1    Ready    <none>   2m    v1.29.2+k3s1
worker-2    Ready    <none>   2m    v1.29.2+k3s1

🔐 (Opcional) Ativar Alta Disponibilidade (HA)

Para uma HA semelhante à produção (opcional em laboratórios domésticos):

  • Use um banco de dados externo (ex: MySQL/PostgreSQL/etcd).
  • Execute múltiplos nós de servidor com a bandeira --server e banco de dados compartilhado.
  • Veja: Documentação K3s HA

🧪 Teste uma Implantação

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=LoadBalancer
kubectl get svc

Verifique o acesso via curl http://<worker-ip>:<port> ou configure o MetalLB para IPs de LoadBalancer externos.


🧰 Notas Úteis

  • Kubeconfig: /etc/rancher/k3s/k3s.yaml

    • Copie para sua máquina local e export KUBECONFIG=... para gerenciar remotamente.
  • Serviços do Systemd:

    • sudo systemctl status k3s
    • sudo systemctl status k3s-agent (nos trabalhadores)

💡 Extras (Opcionais)

  • K9s: Interface de terminal para gerenciar Kubernetes: brew install k9s ou sudo snap install k9s

  • Dashboard: Ative com manifestos:

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
    
  • MetalLB: Adicione suporte de balanceamento de carga para metal nu:

    kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
    

📦 Limpeza

Para remover o k3s:

# No mestre:
/usr/local/bin/k3s-uninstall.sh

# No trabalhador:
/usr/local/bin/k3s-agent-uninstall.sh

Instale um cluster K3s de 3 nós de metal nu com Terraform

Aqui está um Terraform modelo que ajuda a provisionar um cluster K3s de 3 nós de metal nu assumindo que você está gerenciando servidores Linux já provisionados (ex: em sua LAN/laboratório doméstico) via SSH e Ansible. O Terraform invocará playbooks do Ansible para instalar o K3s.


🧱 Pressupostos

  • Você já possui:

    • 3 servidores com IPs fixos, acessíveis via SSH.
    • Acesso SSH (baseado em chave).
    • Terraform e Ansible instalados localmente.
  • Sistema operacional alvo: Ubuntu/Debian (pode ser personalizado).

  • Você está usando provisionador Terraform local-exec ou plugin de provisionamento Ansible (usaremos local-exec aqui para portabilidade).


📁 Estrutura de Diretório

k3s-cluster/
├── main.tf
├── inventory.ini
├── ansible/
│   └── install_k3s.yml
└── variables.tf

📄 variables.tf

variable "master_ip" {
  default = "192.168.1.100"
}

variable "worker_ips" {
  default = ["192.168.1.101", "192.168.1.102"]
}

variable "ssh_user" {
  default = "seu_usuario"
}

variable "ssh_private_key" {
  default = "~/.ssh/id_rsa"
}

📄 main.tf

provider "null" {}

resource "null_resource" "install_k3s" {
  provisioner "local-exec" {
    command = "ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -i inventory.ini ansible/install_k3s.yml --private-key ${var.ssh_private_key} -u ${var.ssh_user}"
  }

  triggers = {
    always_run = "${timestamp()}"
  }
}

📄 inventory.ini

[masters]
192.168.1.100

[workers]
192.168.1.101
192.168.1.102

[all:vars]
ansible_python_interpreter=/usr/bin/python3

📄 ansible/install_k3s.yml

---
- hosts: masters
  become: yes
  tasks:
    - name: Instalar k3s master
      shell: |
        curl -sfL https://get.k3s.io | sh -        
    - name: Obter node-token
      shell: cat /var/lib/rancher/k3s/server/node-token
      register: node_token
      delegate_to: localhost

- hosts: workers
  become: yes
  tasks:
    - name: Unir o trabalhador ao cluster
      shell: |
        curl -sfL https://get.k3s.io | K3S_URL=https://{{ hostvars['192.168.1.100']['ansible_host'] }}:6443 K3S_TOKEN={{ hostvars['192.168.1.100']['node_token']['stdout'] }} sh -        

Nota: Você pode precisar ajustar o acesso à variável de IP ou token dependendo das versões do Ansible. Você também pode gerar o token no mestre e salvá-lo em um arquivo antes de executar a instalação do trabalhador.


🚀 Como Executar

A partir do diretório k3s-cluster/:

terraform init
terraform apply

🧰 Melhorias (Opcionais)

  • Use geração dinâmica de inventário (ex: de DHCP/dnsmasq).
  • Adicione implantação do MetalLB via Ansible.
  • Adicione nomes de host e funcionalidades de HA.
  • Substitua por um role do Ansible como xanmanning.k3s para mais flexibilidade.