K3s: Kubernetes Leve para PME em Edge Computing 2026

SCHEMA MARKUP JSON-LD  |  ✎ Duarte Spínola  |  Tags:

O K3s é uma distribuição Kubernetes reduzida (um único binário de ~70 MB) que corre em Raspberry Pi, NUCs, VPS baratas e hardware legacy. Para uma PME portuguesa que precisa de orquestrar containers em filiais sem infraestrutura dedicada, o K3s oferece 90% das funcionalidades do Kubernetes full com 10% do overhead. Este artigo configura um cluster K3s multi-node, expõe serviços com Traefik (incluído), configura persistência com Longhorn e dá estratégias para edge computing em PME (K3s docs).

Neste artigo

  1. Entender o K3s e Edge Computing
  2. Pré-requisitos e Instalação
  3. Passo 1 — Instalar K3s Server (Master Node)
  4. Passo 2 — Adicionar Worker Nodes ao Cluster
  5. Passo 3 — Traefik Ingress e Expor Serviços
  6. Passo 4 — Persistência com Longhorn
  7. Passo 5 — Deploy de Aplicação com Helm
  8. Passo 6 — Backup e Restore do Cluster
  9. K3s vs K8s vs Docker Swarm — Comparação
  10. Erros Comuns
  11. Checklist Rápido de Verificação

1. Entender o K3s e Edge Computing

O Kubernetes full (K8s) é pesado: precisa de etcd, API server, controller manager, scheduler, CNI, CRI — vários componentes que consomem 2+ GB de RAM antes de qualquer container correr. O K3s substitui etcd por SQLite (ou etcd external), substitui componentes legacy por versões leves, e junta tudo num único binário.

Analogia: o K8s é como um comboio — poderoso mas precisa de rails, estações, sinalização. O K3s é como uma carrinha — cabe em qualquer estrada, leva quase a mesma carga, e arranca em segundos.

Característica K3s K8s (kubeadm) Docker Swarm
Tamanho binário ~70 MB ~500 MB+ ~50 MB
RAM mínima 512 MB 2 GB+ 256 MB
Componentes 1 binário 7+ componentes Docker daemon
etcd SQLite por defeito Obrigatório Não usa
Ingress Controller Traefik (incluído) Instalar separadamente Não nativo
Helm Suportado Suportado Não
Certificados Auto-gerados Manual/automatizado Docker TLS
Arquitetura Server + Agent Master + Worker Manager + Worker
Ideal para Edge, IoT, PME, dev Enterprise, cloud Docker-only shops

Edge computing significa correr computação perto da fonte de dados — numa filial, numa fábrica, num retailer — em vez de tudo num data center central. O K3s é ideal porque corre em hardware modesto: um Intel NUC com 8 GB RAM pode ser um cluster K3s de 2 nodes (server + agent) que corre 20+ containers (Rancher K3s).

2. Pré-requisitos e Instalação

Requisito Master (Server) Worker (Agent)
RAM mínima 512 MB (1 GB recomendado) 256 MB
CPU 1 vCPU (2 recomendado) 1 vCPU
Disco 5 GB livres 5 GB livres
OS Linux 64-bit (kernel 4.4+) Igual
Ports 6443 (API), 80/443 (Ingress) Apenas outbound para master
Docker Não necessário (K3s usa containerd) Não necessário

ℹ️ Nota: O K3s usa containerd internamente — não precisa de Docker instalado. Se tiveres Docker instalado, o K3s pode usá-lo como CRI alternativo, mas o defeito é containerd.

3. Passo 1 — Instalar K3s Server (Master Node)

Instalar o K3s server num único comando — o script oficial trata de tudo:

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

O que este comando faz:

  • Descarga o binário K3s (~70 MB)
  • Regista o serviço systemd (k3s.service)
  • Gera certificados de cluster automaticamente
  • Inicia o server com SQLite como datastore
  • Instala Traefik como Ingress Controller (por defeito)
  • Configura kubectl para o utilizador root

Se não tiveres curl, instalar primeiro: apt install curl (Ubuntu/Debian) ou dnf install curl (Fedora/RHEL).

Verificar que o cluster está a funcionar:

sudo k3s kubectl get nodes
sudo k3s kubectl get pods -A

O output deve mostrar:

  • 1 node em estado Ready
  • Pods do Traefik, CoreDNS, Metrics Server a correr

Para usar kubectl sem sudo:

mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
export KUBECONFIG=~/.kube/config

Obter o token para adicionar worker nodes:

sudo cat /var/lib/rancher/k3s/server/node-token

Guardar este token — é necessário no passo seguinte para adicionar agents.

Instalação com opções personalizadas

Para desativar Traefik (se quiseres usar Nginx Ingress) ou mudar a datastore:

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC=”–disable traefik” sh –

Para usar etcd externo em vez de SQLite (alta disponibilidade):

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC=”–datastore-endpoint https://etcd:2379″ sh –

4. Passo 2 — Adicionar Worker Nodes ao Cluster

Em cada máquina worker, instalar o K3s agent e ligá-lo ao master:

curl -sfL https://get.k3s.io | K3S_URL=https://IP_DO_MASTER:6443 K3S_TOKEN=TOKEN_DO_MASTER sh –

O que cada variável faz:

  • K3S_URL — URL do API server do master. O K3s detecta que é agent porque esta variável está definida
  • K3S_TOKEN — token de autenticação obtido no passo anterior (/var/lib/rancher/k3s/server/node-token)

Verificar no master que o worker se juntou:

kubectl get nodes

Deve mostrar 2+ nodes: o master com role control-plane,master e o(s) worker(s) com role <none>.

⚠️ Atenção

A porta 6443 do master tem de estar acessível aos workers. Em firewalls restritivos, abrir a porta 6443 TCP. Se os workers estão em redes diferentes (filiais), garantir VPN ou túnel entre os nodes.

5. Passo 3 — Traefik Ingress e Expor Serviços

O K3s instala Traefik por defeito. Para expor uma aplicação:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
labels:
app: nginx-demo
spec:
replicas: 2
selector:
matchLabels:
app: nginx-demo
template:
metadata:
labels:
app: nginx-demo
spec:
containers:
– name: nginx
image: nginx:alpine
ports:
– containerPort: 80

apiVersion: v1
kind: Service
metadata:
name: nginx-demo
spec:
selector:
app: nginx-demo
ports:
– port: 80
targetPort: 80

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-demo
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure
spec:
rules:
– host: demo.empresa.pt
http:
paths:
– path: /
pathType: Prefix
backend:
service:
name: nginx-demo
port:
number: 80

Aplicar tudo:

kubectl apply -f nginx-demo.yaml

Depois de dig demo.empresa.pt apontar para o IP do master, abrir no browser. O Traefik encaminha automaticamente com HTTPS.

6. Passo 4 — Persistência com Longhorn

O K3s tem local-path-provisioner por defeito (volumes no disco local do node). Para persistência replicada entre nodes, instalar Longhorn:

kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml

Verificar que todos os pods do Longhorn estão a correr:

kubectl get pods -n longhorn-system

Criar uma PVC (PersistentVolumeClaim) com Longhorn:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-data
spec:
storageClassName: longhorn
accessModes:
– ReadWriteOnce
resources:
requests:
storage: 10Gi

O Longhorn replica os dados em 3 nodes por defeito — se um node cai, os dados continuam disponíveis (Longhorn docs).

⚠️ Atenção

O Longhorn requer open-iscsi instalado em todos os nodes. Instalar com apt install open-iscsi (Ubuntu/Debian) antes de aplicar o manifest.

7. Passo 5 — Deploy de Aplicação com Helm

O K3s inclui Helm controller nativo — não precisas de instalar Helm separadamente:

apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
name: grafana
namespace: monitoring
spec:
repo: https://grafana.github.io/helm-charts
chart: grafana
targetNamespace: monitoring
set:
adminPassword: “alterar-esta-password”
service.type: ClusterIP

Aplicar:

kubectl apply -f grafana-helm.yaml

O K3s instala o chart automaticamente sem precisar do CLI Helm — tudo via Kubernetes manifests (K3s Helm controller).

8. Passo 6 — Backup e Restore do Cluster

Backup da configuração do cluster

O K3s tem backup nativo do datastore SQLite:

sudo k3s etcd-snapshot save backup-$(date +%Y%m%d)

Se usas SQLite (defeito), o backup é manual:

sudo cp /var/lib/rancher/k3s/server/db/state.db ~/k3s-backup-$(date +%Y%m%d).db

Backup dos volumes (Longhorn)

O Longhorn suporta backups para S3-compatible storage (MinIO, AWS S3, Backblaze B2):

  1. Configurar backup target no Longhorn UI: Settings > Backup Target > s3://bucket@region/
  2. Criar snapshot de qualquer volume na UI
  3. Snapshot → Backup para enviar para S3

Restore

Para restaurar o cluster a partir de um snapshot:

sudo k3s etcd-snapshot restore backup-20260623
sudo systemctl restart k3s

ℹ️ Nota: O restore substitui o estado actual do cluster. Todos os deployments criados após o snapshot vão ser perdidos. Fazer sempre backup antes de restore.

9. K3s vs K8s vs Docker Swarm — Comparação

Critério K3s K8s (kubeadm) Docker Swarm
Tempo de setup 30 segundos 30+ minutos 5 minutos
RAM overhead ~256 MB ~2 GB ~128 MB
Binário 1 (~70 MB) 7+ (~500 MB) Docker daemon
Ingress Traefik incluído Instalar separado Não nativo
Helm Nativo (HelmChart CRD) CLI separado Não suporta
Persistência local-path + Longhorn CSI plugins Docker volumes
HA etcd external (3+ nodes) etcd 3+ nodes Manager quorum
Multi-arch ARM64 + AMD64 AMD64 principal Multi-arch
Comunidade Crescente (CNCF) Enorme (CNCF) Declínio
Ideal para Edge, PME, dev, IoT Enterprise, cloud Docker-only

Recomendação para PME: K3s para qualquer cenário que não exija features enterprise do K8s full (API aggregation, webhooks avançados, admission controllers custom). Para 95% das PMEs, K3s é suficiente.

10. Erros Comuns

Problema Causa Solução
Worker não se junta ao cluster Token errado ou porta 6443 bloqueada Verificar token (cat /var/lib/rancher/k3s/server/node-token) e firewall
Pods em Pending Sem resources (RAM/CPU) ou sem CSI Verificar kubectl describe pod — procurar events
Traefik 404 Ingress com host errado ou Service sem endpoints Verificar kubectl get endpoints e host no Ingress
Longhorn pods em CrashLoop open-iscsi não instalado apt install open-iscsi em todos os nodes
Node NotReady K3s agent parou systemctl status k3s-agent e journalctl -u k3s-agent
Certificados expirados K3s renova automaticamente, mas pode falhar sudo k3s certificate check e sudo k3s certificate rotate
kubectl permission denied kubeconfig sem permissões Copiar k3s.yaml para ~/.kube/config e ajustar permissões
Pod não obtém IP CNI (flannel) não a funcionar Verificar kubectl get pods -n kube-system — flannel deve estar Running

11. Checklist Rápido de Verificação

  • [ ] K3s server instalado e a correr (sudo systemctl status k3s)
  • [ ] kubectl get nodes mostra todos os nodes em Ready
  • [ ] kubectl get pods -A mostra Traefik, CoreDNS, Metrics Server Running
  • [ ] kubeconfig configurado para utilizador non-root
  • [ ] Worker nodes ligados ao master via token
  • [ ] Firewall permite porta 6443 (master) e 80/443 (Ingress)
  • [ ] Ingress a funcionar (aplicação demo acessível via HTTPS)
  • [ ] Longhorn instalado se precisas de persistência replicada
  • [ ] Backup do datastore configurado (cron ou manual)
  • [ ] Reinício do master — K3s arranca automaticamente (systemd)

Artigos Relacionados

← Voltar ao Índice

Este artigo foi útil?

Duarte Spínola

Deixe um Comentário