Fase 3 — K3s¶
Objetivo¶
Management cluster K3s (distribución ligera de Kubernetes) en 3 nodos (CP en deborah, workers en invincible y oliver), con controller Argo CD listo para GitOps.
Qué aprendes¶
K3s como Kubernetes ligero bare-metal: server/agent, CNI (Container Network Interface) configurable (Flannel por defecto), deshabilitar Traefik/ServiceLB para controlar el Gateway y LoadBalancer vía GitOps después.
Stack de esta fase¶
flowchart TB
subgraph cp [Control_plane]
DEB[deborah_server]
VIP[kube_vip_opcional]
end
subgraph workers [Workers]
INV[invincible_agent]
NOL[oliver_agent]
end
DEB --> API[API_6443]
VIP -.-> API
INV --> API
NOL --> API
DEB --> ArgoCD[ArgoCD_controller]
- K3s — Management cluster; Fase 3.
- CNI — Flannel (default), Canal, Calico, Cilium; Fase 3.
- kube-vip — VIP (IP virtual) opcional
:6443; fork Fase 3. - Argo CD — Controller bootstrap; Fase 3 → GitOps Fase 4.
- Ansible —
playbook-k3s.yml.
Profundización: Opciones del playbook · Catálogo roles Ansible · K3s manual (legacy)
Antes de empezar¶
Ejecutar¶
Las opciones del playbook se activan en
group_vars/incus_cluster/k3s_install.yml,
no por línea de comandos. Hoy vienen activadas ArgoCD
(gitops_argocd), las etiquetas de nodos (node_labels) y el kubeconfig
local (fetch_kubeconfig), con CNI (Container Network Interface) Calico.
Revisa el archivo y corre:
No uses -e k3s_install.<opción>=…
Ansible lo ignora: k3s_install es un diccionario y una clave con
puntos en -e no lo modifica. Y pasar -e con JSON es peor:
reemplaza el diccionario entero y se pierden core.version,
cluster_cidr, etc. Para cambiar una opción, edita el archivo.
Pasos curl en K3s — instalación manual. Usar solo si Ansible no está disponible; el camino soportado es el playbook.
Opciones¶
| Si necesitas… | En k3s_install.yml |
Hoy | Doc |
|---|---|---|---|
| VIP estable del API | kube_vip.enabled: true |
desactivado | playbook-options |
| Etiquetas Longhorn/arch | node_labels.enabled: true |
activado | playbook-options |
| Kubeconfig local | fetch_kubeconfig.enabled: true |
activado | playbook-options |
| OS hardening | os_hardening.enabled: true |
desactivado | playbook-options |
| Decisión | Opción A (default) | Opción B |
|---|---|---|
| API K3s | IP fija deborah 192.168.20.5 |
kube-vip 192.168.20.4 |
| CNI | Calico (configurado en este repo) | Flannel vxlan (default de K3s), Canal o Cilium (k3s_install.core.cni) |
CNI¶
| CNI | Variable | Notas |
|---|---|---|
| Flannel (default de K3s) | cni: flannel |
Embebido en K3s; flannel_backend: vxlan o host-gw |
| Canal | cni: canal |
Flannel overlay + políticas Calico; rol k3s_cni |
| Calico | cni: calico |
NetworkPolicy, BGP opcional; --flannel-backend=none |
| Cilium | cni: cilium |
eBPF, Hubble; validar en ARM64 (deborah) |
El CNI se elige en k3s_install.core.cni (hoy: calico), antes de
instalar K3s: cambiarlo en un clúster ya instalado obliga a reinstalarlo.
# group_vars/incus_cluster/k3s_install.yml
k3s_install:
core:
cni: calico # flannel | canal | calico | cilium
Detalle: playbook-options — CNI.
playbook-k3s.yml)group_vars; rol k3s_cni--disable traefik192.168.20.5192.168.20.4node_labels / fetch_kubeconfigVerificar¶
# En deborah o con kubeconfig
sudo k3s kubectl get nodes
# 3 nodos Ready
sudo k3s kubectl get pods -n argocd
# argocd-server Running (si gitops_argocd.enabled=true)
Espera pods argocd-server en Running antes de la Fase 4.
Si falla¶
| Síntoma | Revisar |
|---|---|
| Agent no une | Token, K3S_URL, firewall :6443 |
| Traefik residual | --tags traefik o rol k3s_cleanup_traefik |
| CP caído tras reboot | systemctl enable --now k3s en deborah |