k0s: Kubernetes Binário Único para PME

O k0s é uma distribuição Kubernetes certificada CNCF empacotada num único binário sem dependências. Foi desenhada para reduzir a complexidade de instalação, tornando-se ideal para PME que precisam de orquestrar contentores sem equipa dedicada de plataforma.

ℹ O k0s é um único binário sem dependências externas

Não precisa de etcd, containerd ou kubeadm separados — tudo está incluído no binário. Isto simplifica a instalação, reduz a superfície de ataque e facilita actualizações.

1. Introdução ao k0s

O k0s é desenvolvido pela Mirantis sob licença Apache 2.0. Todo o conjunto Kubernetes — API server, scheduler, kubelet, containerd, etcd — fica compilado num único executável de ~150 MB. Não é preciso configurar repositórios, instalar dependências ou gerir versões incompatíveis.

Principais características:

  • Certificada CNCF — compatibilidade total com a API padrão
  • ARM64 e x86-64 — funciona em Raspberry Pi, servidores ARM e x86
  • Air-gapped — instalação sem Internet, ideal para ambientes isolados
  • Control plane HA — múltiplos controllers com balanceador de carga externo
  • Configuração declarativa — YAML único em /etc/k0s/k0s.yaml

O k0s é adequado para computação de borda, centros de dados air-gapped e produção de pequena escala. A documentação oficial cobre instalação, configuração e operação.

2. Instalação Binário Único

A instalação resume-se a transferir o binário e iniciar o controller. Pré-requisitos: Linux com kernel 4.x+ e privilégios de administrador.

# Instalar k0s
curl -sSLf https://get.k0s.sh | sudo sh
# Inicializar controller
sudo k0s install controller
sudo k0s start
# Verificar estado
sudo k0s status
# kubectl integrado
sudo k0s kubectl get nodes

O k0s install controller regista o k0s como serviço systemd, garantindo arranque automático. A configuração fica em /etc/k0s/k0s.yaml e os certificados em /var/lib/k0s/pki.

⚠ O k0s requer pelo menos 2GB de RAM por nó do control plane em produção

Em teste pode funcionar com 1GB, mas em produção o etcd e o API server consomem recursos significativos. Recomendado: 2 vCPU, 2GB RAM mínimo por controller.

3. Configurar Cluster

A configuração é declarativa via YAML em /etc/k0s/k0s.yaml. Controla rede de pods, serviços, DNS, CNI e armazenamento.

# Gerar configuração por predefinição
sudo k0s config create > /etc/k0s/k0s.yaml
# Secções principais em /etc/k0s/k0s.yaml
# api:
#   address: 10.0.0.10
#   sans:
#     - 10.0.0.10
#     - k8s.pme.local
# network:
#   podCIDR: 10.244.0.0/16
#   serviceCIDR: 10.96.0.0/12
#   provider: calico
# storage:
#   type: etcd
# Aplicar alterações
sudo k0s restart

O k0s suporta Kube-router (predefinido), Calico e CNI personalizado. O campo api.sans é crucial para HA — lista os IPs e nomes DNS do certificado do API server. Para air-gapped, pré-carregar imagens em /var/lib/k0s/images.

4. Adicionar Workers

Adicionar workers exige um token gerado no controller. O token contém o endereço do API server e credenciais seguras.

# No controller: gerar token para workers
sudo k0s token create --role=worker --expiry=24h > token.txt
# No worker: instalar e juntar ao cluster
curl -sSLf https://get.k0s.sh | sudo sh
sudo k0s install worker --token-file token.txt
sudo k0s start
# Verificar no controller
sudo k0s kubectl get nodes

O token tem validade limitada — usar --expiry para definir o período. Para produção, 1-2 horas. Os workers são stateless: podem ser removidos e re-adicionados sem impacto, facilitando escalonamento horizontal.

5. Control Plane HA

Para produção, o control plane deve ter alta disponibilidade. O k0s suporta múltiplos controllers com etcd em cluster e balanceador de carga externo.

# No controller 1: token para controller adicional
sudo k0s token create --role=controller --expiry=2h > ctrl-token.txt
# No controller 2: juntar como controller
sudo k0s install controller --token-file ctrl-token.txt
sudo k0s start
# HA: múltiplos controladores com balanceador de carga externo
# LB externo (HAProxy/Keepalived)
#   -> Controller 1 (10.0.0.10)
#   -> Controller 2 (10.0.0.11)
#   -> Controller 3 (10.0.0.12)
# Workers apontam para o IP virtual do LB

O etcd forma automaticamente cluster entre controllers. Recomenda-se um número ímpar (3 ou 5) para quorum. O LB deve fazer verificações de estado a /healthz na porta 6443. Para PME sem LB dedicado, Keepalived com VIP ou HAProxy em modo máquina são suficientes.

6. k0s vs k3s vs kubeadm

Três abordagens com compromissos diferentes. A escolha depende da complexidade aceitável e requisitos de certificação.

Característica k0s k3s kubeadm
Certificação CNCF Sim Sim (com extensões) Sim
Binário ~150MB ~70MB Múltiplos
Base de dados etcd incorporado SQLite/etcd etcd externo
Air-gapped Nativo Manual Complexo
HA control plane Sim (LB externo) Sim (etcd incorporado) Sim (manual)
Complexidade Baixa Baixa Média-Alta
Ideal para PME, edge, air-gapped Edge, IoT, dev Enterprise

O k3s é mais leve com SQLite para nó único, mas o k0s oferece certificação CNCF sem extras e etcd nativo, preferível para produção. Para mais opções auto-alojadas, ver Kubernetes Self-Hosted: Hetzner vs AKS vs k3s. Para fundamentos, o Dia 29: Kubernetes Básico do Curso de Linux.

7. Erros Comuns e Lista de Verificação

Erro Causa Solução
Worker não aparece em get nodes Token expirado ou firewall Gerar token novo; abrir portas 6443 e 10250
CNI pods em Pending Imagens não descarregadas Pré-carregar em /var/lib/k0s/images
etcd sem quorum Controllers sem conectividade Verificar portas 2380/2379 entre controllers
API server inacessível Certificado sem SAN do LB Adicionar IPs em api.sans do k0s.yaml
k0s start falha Portas 6443/10250 em uso Parar serviços conflitantes (docker, k3s)

Lista de verificação para produção:

  • ✓ 2GB RAM e 2 vCPU mínimo por controller
  • ✓ 3 controllers em HA com balanceador de carga externo
  • ✓ Portas 6443, 10250, 2379, 2380 abertas entre controllers
  • api.sans com IP do LB e nomes DNS
  • ✓ Token de workers com expiração curta (1-2h)
  • ✓ Imagens pré-carregadas em air-gapped
  • ✓ Cópias de segurança regulares de /var/lib/k0s (etcd + certificados)
  • ✓ Monitorização de recursos em todos os nós

Para gestão de segredos em clusters k0s, ver OpenBao. Para orquestração sem Kubernetes, o Nomad é uma alternativa simples. Para rede e segurança, o Cilium com eBPF integra-se com k0s.