نصب یک خوشه «واقعی» Kubernetes معمولاً یعنی چند باینری، etcd جدا، CNI جدا، Ingress جدا، و ساعتها تنظیم. برای Edge، Raspberry Pi، لابراتوار، یا CI این هزینه اغلب بیش از حد است.
K3s پاسخ Rancher (اکنون در اکوسیستم SUSE) به همین درد است:
Lightweight Kubernetes — The certified Kubernetes distribution built for IoT & Edge computing.
شعار نصب رسمی کوتاه است:
curl -sfL https://get.k3s.io | sh -
sudo k3s kubectl get nodeیک باینری کوچک، خوشه آماده در حدود نیم دقیقه. CNCF Sandbox. Certified Kubernetes (conformance) — یعنی API و رفتار با Kubernetes استاندارد سازگار است، نه یک «شبیهساز سبک».
K3s چیست؟ (و چه چیزی نیست)
| هست | نیست |
|---|---|
| توزیع کاملاً conformant از Kubernetes | fork ناسازگار یا subset اجباری API |
| بستهبندی سبک و opinionated | جایگزین managed cloud مثل EKS/GKE/AKS |
| مناسب Edge / IoT / CI / lab / clusterهای کوچک–متوسط | جایگزین خودکار برای هزاران node در دیتاسنتر سازمانی بدون برنامهریزی |
| تکباینری + launcher ساده | «Kubernetes ناقص» |
طبق README رسمی: K3s یک distribution است چون علاوه بر هسته Kubernetes، اجزای لازم برای cluster آماده (runtime، شبکه، ingress، storage محلی، LB) را با انتخابهای مشخص بستهبندی میکند.
نام «K3s» از شوخی «نصف Kubernetes → K8s → K3s» آمده — اما از نظر API همچنان K8s کامل است.
چرا K3s؟
| نیاز | پاسخ K3s |
|---|---|
| Edge / مکان بدون حضور دائم | HA ممکن، footprint کم، بهروزرسانی ساده |
| IoT و دستگاههای ضعیف | باینری کوچک؛ ARM64 و ARMv7 |
| CI و محیط موقت | نصب تکفرمان؛ teardown آسان |
| لابراتوار / آموزش | همان kubectl و YAML که در production یاد میگیرید |
| چند node کوچک بدون تیم etcd | SQLite یا etcd تعبیهشده / DB خارجی |
سه وعده سایت رسمی:
- Perfect for Edge — production در مکانهای remote و resource-constrained
- Simplified & Secure — تکباینری <۷۰MB، وابستگی کمتر، سطح حمله کوچکتر
- Optimized for ARM — از Raspberry Pi تا سرورهای ARM ابری
تفاوت K3s با Kubernetes «استاندارد» (kubeadm / vanilla)
هر دو Certified Kubernetesاند. تفاوت در بستهبندی، پیشفرضها، و حذف چیزهای غیرضروری است — نه در این که «Pod کار نمیکند».
جدول یکنگاه
| موضوع | K3s | Kubernetes (kubeadm / vanilla) |
|---|---|---|
| توزیع | تکباینری + launcher | چند جزء جدا (apiserver، scheduler، controller-manager، etcd، …) |
| اندازه | معمولاً <۷۰–۱۰۰MB باینری | اجزای متعدد + تصاویر |
| Datastore پیشفرض | SQLite (تکserver) | etcd اجباری |
| HA datastore | etcd تعبیهشده یا MySQL/PostgreSQL/etcd خارجی (via Kine) | etcd cluster |
| Container runtime | containerd داخل باینری | جدا نصب (containerd / CRI-O) |
| CNI پیشفرض | Flannel | هیچ — باید نصب کنید |
| Ingress پیشفرض | Traefik | هیچ |
| LoadBalancer سرویس | ServiceLB (Klipper) | وابسته به cloud / MetalLB و … |
| Storage محلی | local-path-provisioner | معمولاً باید CSI جدا بگذارید |
| DNS / metrics | CoreDNS + metrics-server | معمولاً جدا یا add-on |
| Cloud provider in-tree | حذف شده | تاریخاً موجود؛ upstream به out-of-tree CCM میرود |
| Storage drivers in-tree | حذف شده | به CSI مهاجرت کردهاند |
| نصب | یک دستور / چند دقیقه | kubeadm + CNI + Ingress + … |
| حداقل منابع (تقریبی) | control plane سبکتر (مثلاً ~۵۱۲MB RAM شروع) | معمولاً بالاتر برای masters |
| بهترین fit | Edge، IoT، CI، lab، cluster کوچک–متوسط | دیتاسنتر بزرگ، cloud-native enterprise، حداکثر انعطاف |
چه چیزی از باینری حذف شده؟
طبق توضیح پروژه (و تکامل تاریخی):
| حذف / سبکسازی | چرا | جایگزین |
|---|---|---|
| In-tree cloud providers | حجم و وابستگی به vendor | Cloud Controller Manager خارجی (CCM) |
| In-tree storage drivers | حجم؛ مسیر مدرن CSI است | CSI drivers (Longhorn، …) |
| اجزای legacy / alpha غیرضروری (در نسخههای مختلف) | سطح حمله و footprint | فقط APIهای پایدار لازم برای conformance |
نکته مهم: حذف اینها conformance را نمیشکند چون قابلیت هسته Kubernetes نیستند.
چه چیزی اضافه / opinionated است؟
| جزء | نقش |
|---|---|
| containerd | runtime پیشفرض |
| Flannel | CNI (پیشفرض vxlan؛ گزینههای host-gw، wireguard-native، …) |
| Traefik | Ingress controller |
| ServiceLB (Klipper) | پیادهسازی Service type=LoadBalancer روی nodeها |
| local-path-provisioner | StorageClass محلی ساده |
| CoreDNS | DNS خوشه |
| metrics-server | متریک برای HPA و kubectl top |
| Kine | shim که اجازه میدهد بهجای etcd از SQLite/MySQL/Postgres استفاده شود |
اینها را میتوان با --disable خاموش کرد و جایگزین گذاشت (مثلاً Cilium بهجای Flannel، Contour بهجای Traefik).
معماری: Server و Agent
طبق معماری رسمی:
┌─────────────────────────────────────┐
│ k3s server │
│ control-plane + datastore │
│ + kubelet + containerd + CNI │
└──────────────┬──────────────────────┘
│ token / websocket tunnels
┌─────────┴─────────┐
▼ ▼
┌──────────┐ ┌──────────┐
│ k3s agent│ │ k3s agent│
│ kubelet │ │ kubelet │
│ containerd + CNI │ …
└──────────┘ └──────────┘- Server:
k3s server— API، control plane، datastore - Agent:
k3s agent— بدون datastore/control-plane؛ workloadها را اجرا میکند - هر دو میتوانند kubelet و runtime و CNI داشته باشند
ارتباط agent ↔ server از طریق tunnel (معادل مفهومی Konnectivity در توزیعهای دیگر) برقرار میشود — مناسب Edge که پورتهای kubelet را باز نمیخواهید.
حالتهای datastore
| حالت | Datastore | حداقل server | کاربرد |
|---|---|---|---|
| تکserver | SQLite تعبیهشده | ۱ | lab، edge تکnode، CI |
| HA با etcd تعبیهشده | embedded etcd | ۳+ server | production سبک بدون DB خارجی |
| HA با DB خارجی | MySQL / PostgreSQL / etcd خارجی | ۲+ server | وقتی DB تیمی دارید |
Kubeconfig پیشفرض: /etc/rancher/k3s/k3s.yaml
Token پیوستن agent: /var/lib/rancher/k3s/server/node-token
چه چیزی پشتیبانی میشود / چه چیزی پیشفرض نیست
✅ پشتیبانی میشود (و معمولاً کار میکند)
| حوزه | وضعیت در K3s |
|---|---|
| Deployments، Services، Ingress، Jobs، CronJobs، … | API استاندارد Kubernetes |
| Helm، kubectl، GitOps (Argo) | بله |
| CSI storage (Longhorn، …) | بله (جایگزین/مکمل local-path) |
| CNI سفارشی (Cilium، Calico، Canal) | بله با --flannel-backend=none (+ معمولاً --disable-network-policy) |
| Service mesh (Istio، Linkerd) | بله — روی API سازگار |
| cert-manager، Harbor، observability | بله |
| Multi-arch: x86_64، ARM64، ARMv7 | بله |
| Dual-stack / IPv6 | بله (باید از ابتدا پیکربندی شود) |
| Air-gap / offline install | مستند و پشتیبانیشده |
| Cluster با صدها تا حدود ~۱۰۰۰ agent (با معماری مناسب) | ممکن؛ محدودیتها را در docs مقیاس بررسی کنید |
⚠️ پیشفرض نیست یا باید خودتان بیاورید
| جزء | پیشفرض K3s | جایگزین رایج |
|---|---|---|
| CNI پیشرفته eBPF | Flannel | Cilium / Calico |
| Ingress Envoy | Traefik | Contour / Envoy Gateway |
| Block storage توزیعشده | local-path (تکnode) | Longhorn / CubeFS / … |
| Registry خصوصی | — | Harbor |
| Cloud Load Balancer واقعی | ServiceLB ساده روی node IP | CCM ابری / MetalLB / … |
| Guaranteed etcd ops مانند hyperscaler | SQLite یا etcd کوچک | HA etcd یا DB خارجی + مانیتورینگ |
❌ / خارج از محدوده معمول
| موضوع | توضیح |
|---|---|
| Managed control plane ابری بهعنوان «K3s as a Service» | K3s عمدتاً self-managed است (EKS/GKE نوع K3s رسمی عمومی نیست) |
| In-tree cloud/storage قدیمی | عمداً حذف؛ از CCM و CSI استفاده کنید |
| جایگزین ۱:۱ برای clusterهای عظیم با هزاران کنترلپلن سفارشی | vanilla/kubeadm یا توزیع سازمانی (RKE2، OpenShift، …) اغلب مناسبترند |
| تغییر datastore بعد از شروع IPv4-only به dual-stack | dual-stack باید از روز اول باشد |
| همگامسازی خودکار manifestهای AddOn بین چند server | مسئولیت شماست که فایلها sync بمانند |
غیرفعال کردن اجزای بستهشده
طبق Managing Packaged Components:
# مثال: بدون Traefik و بدون ServiceLB
curl -sfL https://get.k3s.io | sh -s - server \
--disable=traefik \
--disable=servicelbاجزای قابل disable رایج: traefik، servicelb، local-storage، metrics-server، coredns (با احتیاط — DNS لازم دارید).
جایگزین CNI:
curl -sfL https://get.k3s.io | sh -s - server \
--flannel-backend=none \
--disable-network-policy
# سپس Cilium / Calico را نصب کنیدManifestهای کاربر در /var/lib/rancher/k3s/server/manifests بهصورت AddOn اعمال میشوند.
نصب عملی
تکnode (سریعترین مسیر)
curl -sfL https://get.k3s.io | sh -
sudo k3s kubectl get node
sudo k3s kubectl get pods -Aیا با kubectl سیستم:
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown "$USER" ~/.kube/config
kubectl get nodeچند node: یک server + چند agent
روی server:
curl -sfL https://get.k3s.io | sh -s - server
sudo cat /var/lib/rancher/k3s/server/node-tokenروی agent:
curl -sfL https://get.k3s.io | K3S_URL=https://myserver:6443 \
K3S_TOKEN="<NODE_TOKEN>" sh -HA با etcd تعبیهشده (۳ server)
# اولین server
curl -sfL https://get.k3s.io | sh -s - server --cluster-init
# serverهای بعدی
curl -sfL https://get.k3s.io | sh -s - server \
--server https://<first-server>:6443 \
--token <TOKEN>سپس agentها را به یک آدرس ثابت (VIP / LB) ثبت کنید.
روی macOS برای آزمایش
برای Linux VM سبک روی مک، مقاله Lima مفید است؛ داخل VM همان دستور get.k3s.io را اجرا کنید.
عملیات روزمره
sudo systemctl status k3s # server
sudo systemctl status k3s-agent # agent
sudo journalctl -u k3s -f
k3s check-config # پیشنیازهای کرنل/سیستم
# بهروزرسانی: معمولاً با نصب مجدد نسخه جدید باینری / اسکریپتUninstall:
/usr/local/bin/k3s-uninstall.sh # server
/usr/local/bin/k3s-agent-uninstall.sh # agentقبل از uninstall اگر Cilium نصب کردهاید، اینترفیسهای cilium_* را طبق docs پاک کنید تا شبکه host قطع نشود.
مقایسه با گزینههای مشابه
| K3s | kubeadm | MicroK8s | kind / k3d | RKE2 | |
|---|---|---|---|---|---|
| هدف | Edge/IoT/prod سبک | استاندارد vanilla | snap Ubuntu | فقط local/CI | hardened enterprise |
| تکباینری | ✅ | ❌ | snap | containerized | بیشتر opinionated |
| Certified | ✅ | ✅ | ✅ | وابسته | ✅ |
| Datastore | SQLite/etcd/DB | etcd | dqlite | ephemeral | etcd |
| Production edge | عالی | سنگین | خوب روی Ubuntu | خیر | دیتاسنتر امن |
- k3d = K3s داخل Docker — عالی برای dev محلی سریع
- RKE2 = خواهر امنیتیتر Rancher برای CIS/FIPS و دیتاسنتر
ارتباط با stack شما
Edge / Lab / CI host
└── K3s (server ± agents)
├── containerd
├── Flannel یا Cilium
├── Traefik یا Contour
├── local-path یا Longhorn
├── CoreDNS
└── Workloads
├── GitOps: Argo
├── Mesh: Istio / Linkerd (اختیاری)
└── Registry: HarborControl-plane state در حالت کلاسیک K8s با etcd است؛ در K3s تکnode اغلب SQLite — برای HA به etcd تعبیهشده یا DB خارجی بروید.
Best practices
- برای هر چیزی غیر از lab تکnode، HA (۳ server + etcd) را جدی بگیرید
- Traefik/ServiceLB را اگر stack دیگری دارید از روز اول
--disableکنید - Token و
k3s.yamlرا مثل secret محافظت کنید - برای storage پایدار روی چند node بهجای local-path از CSI واقعی استفاده کنید
- نسخههای server و agent را همتراز نگه دارید
- در Edge: کانال بهروزرسانی و air-gap را از قبل طراحی کنید
- قبل از production:
k3s check-configو backup datastore - Monitor کنید: metrics-server نقطه شروع است، نه تمام observability
- اگر فقط «یک خوشه آزمایشی روی لپتاپ» میخواهید، k3d/kind را هم مقایسه کنید
- برای compliance سخت دیتاسنتر، RKE2 / OpenShift را هم در جدول تصمیم بگذارید
چه زمانی K3s؟
✅ استفاده کنید
- Edge، فروشگاه، کارخانه، IoT gateway
- Raspberry Pi / ARM و منابع محدود
- CI که باید Kubernetes واقعی بالا بیاورد
- تیم کوچک که kubeadm برایش سنگین است
- میخواهید همان YAML production را در lab داشته باشید
⚠️ شاید جای دیگر بهتر باشد
| نیاز | پیشنهاد |
|---|---|
| Managed cloud بدون ops control plane | EKS / GKE / AKS |
| هزاران node + سفارشیسازی عمیق | kubeadm / توزیع سازمانی |
| فقط تست محلی سریع روی Docker | kind / k3d |
| CIS/FIPS سختگیرانه دیتاسنتر | RKE2 یا توزیعهای hardened |
| فقط چند container بدون API K8s | Docker Compose / Nomad — نه هر مشکلی نیاز به K8s دارد |
جمعبندی
| مفهوم | توضیح |
|---|---|
| K3s | Certified lightweight Kubernetes — Edge، IoT، CI، ARM |
| در برابر K8s | همان API؛ بستهبندی سبکتر و پیشفرضهای opinionated |
| حذفشده | in-tree cloud provider و storage drivers |
| همراه | containerd، Flannel، Traefik، ServiceLB، local-path، CoreDNS، metrics-server |
| Datastore | SQLite → یا etcd / MySQL / Postgres برای HA |
| انتخاب | وقتی سادگی و footprint مهمتر از حداکثر انعطاف vanilla است |
K3s «نصف Kubernetes» نیست — Kubernetes کامل در جعبه کوچک است. تفاوت واقعی با K8s استاندارد در این است که چقدر باید خودتان CNI، Ingress، datastore و runtime را سرهم کنید.
قدم بعدی
- روی یک VM یا Pi:
curl -sfL https://get.k3s.io | sh - - یک Deployment + Service + Ingress Traefik تست کنید
- یک agent دوم با token اضافه کنید
- Traefik را disable و Contour یا Ingress دیگر را امتحان کنید
- برای storage پایدار Longhorn را روی cluster چند node بگذارید
- جدول تصمیم داخلی: K3s در برابر kubeadm در برابر k3d برای هر محیط (lab / edge / prod)
منابع
- K3s — k3s.io
- Architecture
- Packaged components
- Network options
- GitHub — k3s-io/k3s
- CNCF / conformance
- containerd (مقاله P30Light)
- Longhorn (مقاله P30Light)
- etcd (مقاله P30Light)
منتشر شده در P30Light — بخش زیرساخت و سرور.