Qui loue un Mac mini M4 (Singapour, Tokyo, Séoul, Hong Kong, US Ouest) pour du Kubernetes léger K3s ou k0s heurte vite la RTT registre, les rafales containerd, puis ResourceQuota / LimitRange. La promesse « léger » s’effondre dès que plusieurs charts tirent des bases lourdes en parallèle : le goulot est souvent la chaîne téléchargement → extraction → scheduling, pas le GHz affiché. Ici : matrice, paramètres copiables, achat public. Cadrez calcul et nœuds sur la matrice de calcul et de nœuds, la région sur latence et TCO ; voir aussi Kind / minikube et Docker / Podman. Tarifs, Achat, Aide : sans compte.
Trois frictions 2026 :
- Rafales de pulls. Des
replicassur charts froids dupliquent les couches ;kubectl toppeut rester calme. - Quotas. Sans
LimitRange, un namespace monopolise le CPU allouable alors que kubelet doit extraire et GC. - Un seul timeout. Mélanger pull, sandbox et batch masque registre lointain versus trop de flux.
Sélection des nœuds régionaux
Registre et plan de données fixent la RTT : colocalisez la métropole louée avec ces flux avant d’installer quoi que ce soit. 16 Go : plan de contrôle et containerd sobres ; 24 Go : requests et sidecars plus larges. Gardez ~15 % d’APFS libre pour les snapshotters CI. Si vous hésitez entre deux régions, la matrice de calcul et de nœuds aide à aligner mémoire unifiée et charge attendue avant d’engager des pipelines Helm.
Séquence opérable en cinq étapes :
- Choisir palier mémoire et région via la matrice de calcul et de nœuds et les tarifs publics.
- Mesurer TLS et premier octet vers votre registre depuis le nœud candidat.
- Démarrer en mono-nœud ; n’ajouter un second nœud qu’après stabilisation des pulls et quotas.
- Installer
LimitRangeavant la première release Helm. - Lire
kubectl describe podpour les événements ImagePull avant d’incriminer le scheduler.
Comparatif K3s et k0s
Linux + containerd ; même histoire SSD/uplink que clusters imbriqués — validez un nœud avant HA.
| Dimension | K3s | k0s |
|---|---|---|
| Installation | Curl officiel, k3s, /etc/rancher/k3s/config.yaml |
k0sctl, binaire unique, souvent k0s.yaml |
| Données API | etcd embarqué, externe ou SQLite | Assembler selon doc release ; datastore à chaque upgrade |
| kubelet | --kubelet-arg à l’install ou config |
Même logique en extraArgs dans k0s.yaml |
| CNI | Flannel par défaut | Voir release notes ; profil minimal d’abord |
| Choix | Shell, Rancher | k0sctl apply, revues config |
Règle : K3s si le shell domine ; k0s si le déclaratif l’emporte. Toujours valider pulls et quotas en mono-nœud.
Exemples de concurrence d’images et de quotas de ressources
Matrice indicatif ; affinez selon RTT et disque.
| Profil de charge | Focus containerd et kubelet | Concurrence des Pods |
|---|---|---|
| Interactif | Limiter pulls parallèles ; image-pull-progress-deadline ~10 min si liaison instable |
2–3 déploiements froids en 16 Go ; élargir après startupProbe OK |
| CI | Bases lourdes sérialisées ; 4–6 petites couches après miroir chaud | Requêtes CPU namespace < 10 cœurs (16 Go) ; ~2 cœurs pour kubelet |
| Batch | crictl pré-pull ; baisser max_concurrent_downloads si IO sans CPU |
Moins de Pods, grosses requêtes ; activeDeadlineSeconds >> durée mesurée |
K3s : étendre la patience du kubelet à l’installation.
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server \
--kubelet-arg=image-pull-progress-deadline=10m" sh -
containerd : limiter les couches en parallèle sur chemins à RTT élevée (chemin selon l’install ; fusionner avec la doc fournisseur).
# Fragment d’exemple — confirmez pour votre version containerd :
# [plugins."io.containerd.grpc.v1.cri".containerd]
# max_concurrent_downloads = 3
k0s : mêmes args dans kubelet de k0s.yaml. Namespace (adapter au SKU) :
apiVersion: v1
kind: LimitRange
metadata:
name: default-limits
namespace: app
spec:
limits:
- defaultRequest:
cpu: "250m"
memory: "256Mi"
default:
cpu: "1"
memory: "1Gi"
type: Container
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
namespace: app
spec:
hard:
requests.cpu: "8"
requests.memory: 14Gi
limits.cpu: "12"
limits.memory: 18Gi
pods: "24"
Repères : ~15 % disque libre ; première deadline pull kubelet ~10 min si liaison bruyante ; max_concurrent_downloads ~3 tant que les événements montrent encore des allers-retours réseau. Découpler startupProbe et activeDeadlineSeconds : ainsi un job batch long n’écrase pas la lecture des ImagePullBackOff sur un service interactif dans le même namespace.
FAQ
Comparer K3s et k0s sur un seul Mac ? Non en prod sérieuse : CNI/ports collisionnent — VM ou nœuds séparés.
ImagePullBackOff malgré du CPU ? Secrets registre, moins de pulls parallèles ; voir couches et cache.
Inférence ? Mémoire unifiée toujours ; matrice calcul / nœuds, MPS / MLX.