kubeadm کلاستر را bootstrap میکند، اما هنوز OS، CNI، HA etcd، گواهی، add-on و تکرارپذیری روی دهها سرور باقی میماند. تیمهایی که bare metal یا VM چندابری دارند، معمولاً به لایهٔ Infrastructure as Code نیاز دارند.
Kubespray پاسخ رسمی جامعهٔ Kubernetes (زیر kubernetes-sigs) است:
Deploy a Production Ready Kubernetes Cluster
یعنی مجموعهٔ playbookهای Ansible برای استقرار کلاستر HA، قابل ترکیب، روی اکثر توزیعهای لینوکس — از AWS تا bare metal.
Docs: kubespray.io · Repo: github.com/kubernetes-sigs/kubespray · Slack: #kubespray · لایسنس: Apache-2.0
Kubespray چیست؟ (و چه چیزی نیست)
| هست | نیست |
|---|---|
| ابزار نصب و lifecycle مبتنی بر Ansible | distribution بستهبندیشده مثل K3s یا RKE2 |
| orchestrator روی kubeadm + پیکربندی OS | جایگزین managed EKS/GKE/AKS |
| انتخاب آزاد CNI، CRI، add-on | تکباینری «یکخطی» برای edge |
| مناسب bare metal / multi-cloud / air-gap | جایگزین کامل platform (Rancher/OpenShift) |
شعارهای README:
- استقرار روی AWS، GCE، Azure، OpenStack، vSphere، Equinix Metal، OCI (experimental)، Baremetal
- کلاستر Highly available
- Composable (مثلاً انتخاب network plugin)
- پشتیبانی از بیشتر توزیعهای محبوب لینوکس
- CI/e2e مستمر (اسپانسرهایی مثل CNCF، Equinix Metal، OVHcloud، ELASTX)
مشکل: از kubeadm تا production
فقط kubeadm:
OS prep دستی × N
etcd HA دستی
CNI جدا
cert rotation / upgrade پراکنده
تکرارپذیری ضعیف
با Kubespray:
inventory + group_vars
│
▼
ansible-playbook cluster.yml
│
├─ kernel / swap / packages
├─ containerd | cri-o | docker
├─ etcd HA
├─ kubeadm control plane + workers
├─ CNI (Calico/…)
└─ CoreDNS، metrics، اختیاری MetalLB/Helm/…Idempotent است: اجرای دوبارهٔ playbook باید به همان وضعیت برسد و استقرار قطعشده قابل ادامه است.
مقایسه: Kubespray در برابر گزینهها
در برابر kubeadm و kops (از docs رسمی)
طبق comparisons.md:
| Kubespray | kubeadm | kops | |
|---|---|---|---|
| نقش | CM + clustering + bootstrap | «cluster operator» دامنهٔ K8s | provisioner ابری خودش |
| بستر | Ansible روی bare metal و بیشتر cloudها | دستورات روی نود | تنگاتنگ با cloudهای پشتیبانیشده |
| انعطاف پلتفرم | بالا | بالا ولی دستی | کمتر اگر فقط یک cloud |
| از v2.3 | داخل از kubeadm استفاده میکند | — | — |
جمعبندی رسمی: Kubespray دانش lifecycle را از kubeadm میگیرد و کارهای عمومی OS را با Ansible جدا میکند — هر دو طرف سود میبرند.
در برابر distributionها
| معیار | Kubespray | K3s | RKE2 |
|---|---|---|---|
| نوع | Playbooks Ansible | Distribution سبک | Distribution سازمانی |
| نصب | cluster.yml | یک اسکریپت/باینری | get.rke2.io |
| Datastore | etcd (کلاسیک) | SQLite یا etcd | etcd |
| CIS/FIPS توکار | از طریق hardening vars | محدود | قوی |
| انتخاب CNI | بسیار باز | Flannel پیشفرض | Canal/… |
| بهترین جا | bare metal سفارشی، IaC Ansible | Edge / lab | Compliance / datacenter |
اگر تیم از قبل Ansible دارد و میخواهد upstream Kubernetes با کنترل کامل → Kubespray. اگر میخواهد باینری امن و opinionated → RKE2. اگر edge سبک → K3s.
معماری منطقی و نقش نودها
Ansible control machine (laptop / CI)
│ SSH + become
▼
┌─────────────────────────────────────────┐
│ inventory │
│ kube_control_plane (فرد برای HA) │
│ etcd (اغلب همجا با CP در lab) │
│ kube_node (workers) │
└─────────────────────────────────────────┘
│
▼ playbooks
OS → CRI → etcd → kubeadm → CNI → addons| گروه Ansible | نقش |
|---|---|
kube_control_plane | API Server، scheduler، controller-manager |
etcd | quorum — در production معمولاً ۳ یا ۵ |
kube_node | workerها |
k8s_cluster | ترکیب رایج |
برای HA API اغلب load balancer (HAProxy/Nginx/kube-vip) جلوی چند control plane مینشیند — docs: HA mode.
Playbookهای اصلی
| Playbook | کار |
|---|---|
cluster.yml | نصب/همگامسازی کامل کلاستر |
scale.yml | افزودن نود |
upgrade-cluster.yml | ارتقای نسخه |
remove-node.yml | حذف نود |
reset.yml | پاکسازی نصب Kubespray روی نودها |
recover-control-plane.yml | بازیابی control plane |
اجزای پشتیبانیشده (نسخهٔ فعلی README)
اعداد با release عوض میشوند؛ نمونه از README فعلی repo:
| دسته | نمونهها |
|---|---|
| Core | Kubernetes ~1.36.x، etcd، containerd، docker، cri-o (experimental روی برخی OS) |
| CNI | Calico (پیشفرض)، Cilium، Flannel، Kube-OVN، kube-router، Multus، macvlan، custom_cni، kube-vip |
| App | CoreDNS، cert-manager، Helm، MetalLB، Argo CD، registry |
| Storage CSI | AWS EBS، Azure Disk، Cinder، GCP PD، local-path، local-volume، NFD |
حداقل Kubernetes پشتیبانیشده در README فعلی: v1.34.0+. CRI-O باید minor با Kubernetes همتراز باشد.
جزئیات CNI: مقایسه CNI · Cilium · Kube-OVN. Runtime: containerd · CRI-O. etcd: etcd.
سیستمعاملهای پشتیبانیشده
طیف گسترده (خلاصه از README):
- Debian / Ubuntu LTS جدید
- RHEL / CentOS Stream / Alma / Rocky / Oracle Linux
- Fedora / Fedora CoreOS / Flatcar
- openSUSE Leap / Tumbleweed
- چند مورد experimental: Amazon Linux 2، Kylin، UOS، openEuler، Rocky 10
پشتیبانی نمیشود: init از نوع Upstart/SysV. برای کرنل < 4.19 docs کرنل را بخوانید.
حداقل حافظهٔ safeguarded: Control plane ۲ GB، Worker ۱ GB — برای production واقعی بالاتر بروید.
پیشنیازها
| مورد | جزئیات |
|---|---|
| Ansible | v2.14+، Jinja 2.11+، python-netaddr روی ماشین کنترل |
| شبکه نود | دسترسی اینترنت برای pull image — وگرنه air-gap |
| Forwarding | IPv4 (و در صورت نیاز IPv6) |
| Firewall | توسط Kubespray مدیریت نمیشود — برای نصب اولیه اغلب باید موقتاً باز/خاموش باشد |
| Privilege | کاربر غیر root → ansible_become / -b |
شروع سریع
با کانتینر رسمی
docker run --rm -it \
--mount type=bind,source="$(pwd)"/inventory/sample,dst=/inventory \
--mount type=bind,source="${HOME}"/.ssh/id_rsa,dst=/root/.ssh/id_rsa \
quay.io/kubespray/kubespray:v2.31.0 bash
# داخل کانتینر:
ansible-playbook -i /inventory/inventory.ini \
--private-key /root/.ssh/id_rsa cluster.ymlنسخهٔ image را با آخرین tag عوض کنید.
مسیر Ansible کلاسیک (مفهومی)
git clone https://github.com/kubernetes-sigs/kubespray.git
cd kubespray
python3 -m venv .venv && source .venv/bin/activate
pip install -U -r requirements.txt
cp -rfp inventory/sample inventory/mycluster
# ویرایش inventory/mycluster/inventory.ini و group_vars/
ansible-playbook -i inventory/mycluster/inventory.ini \
--become --become-user=root cluster.ymlابزار inventory_builder / اسکریپتهای contrib میتوانند از لیست IP، inventory بسازند. برای lab محلی: Vagrant (vagrant up پس از نصب Ansible).
نمونهٔ نقشها در inventory:
[kube_control_plane]
cp1 ansible_host=10.0.0.11
cp2 ansible_host=10.0.0.12
cp3 ansible_host=10.0.0.13
[etcd:children]
kube_control_plane
[kube_node]
worker1 ansible_host=10.0.0.21
worker2 ansible_host=10.0.0.22
[k8s_cluster:children]
kube_control_plane
kube_nodeمتغیر شبکه (مثال):
# inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
kube_network_plugin: calico # یا cilium، flannel، kube-ovn، …
container_manager: containerdپس از موفقیت، kubeconfig معمولاً از اولین control plane قابل کپی است (مسیر دقیق در docs Getting Started).
عملیات روزمره
| کار | روش |
|---|---|
| افزودن worker | نود به inventory + scale.yml |
| ارتقا | upgrade-cluster.yml (docs Upgrades) |
| حذف نود | remove-node.yml |
| شروع از صفر | reset.yml (مخرب — احتیاط) |
| بازیابی CP | recover-control-plane.yml |
| Air-gap | دانلود artifacts / mirror داخلی |
| Hardening | docs Hardening + CIS-oriented vars |
| Large cluster | docs Large deployments |
Terraform در contrib/terraform و پروژههایی مثل Kubean روی Kubespray سوار شدهاند.
برای GitOps بعد از بالا آمدن کلاستر: Flux · Helm · Argo. برای TLS: cert-manager.
چه وقت Kubespray را انتخاب کنیم؟
Managed cloud کافی است؟ ──yes──► EKS/GKE/AKS
│ no
▼
تیم Ansible + bare metal / چند cloud؟ ──yes──► Kubespray
│ no
▼
نیاز FIPS/CIS باینری opinionated؟ ──yes──► RKE2
│ no
▼
Edge / منابع کم؟ ──yes──► K3s
│ no
▼
یادگیری تکنود؟ ──► kubeadm / kindKubespray میدرخشد وقتی مالک زیرساخت هستید و تکرارپذیری + انتخاب CNI/CRI مهم است.
یکپارچگی با استک P30Light
| لایه | مقاله |
|---|---|
| Distribution جایگزین | K3s · RKE2 |
| Runtime | containerd · CRI-O |
| Datastore | etcd |
| شبکه | CNI deep dive · Cilium · Kube-OVN |
| Package / GitOps | Helm · Flux |
| Multi-cluster بعد از نصب | Karmada |
Terraform/IPMI ──► VM/Bare metal
Ansible (Kubespray) ──► Kubernetes upstream + CNI
Flux/Argo ──► workloadsخلاصه
| موضوع | جمعبندی |
|---|---|
| چیست | Ansible playbooks برای کلاستر production Kubernetes |
| کجا | kubernetes-sigs؛ docs در kubespray.io |
| موتور | kubeadm + پیکربندی OS توسط Ansible |
| نقطهٔ قوت | HA، composable CNI، multi-OS، air-gap، idempotent |
| نقطهٔ ضعف نسبی | منحنی یادگیری Ansible؛ سنگینتر از تکباینری |
| رقبا | kubeadm (سطح پایین)، kops (cloud-centric)، K3s/RKE2 (distribution) |
قدم بعدی
- با image
quay.io/kubespray/kubesprayروی ۳ VM lab یکcluster.ymlخشک اجرا کنید. kube_network_pluginرا بین Calico و Cilium در دو inventory جدا مقایسه کنید.- یک worker با
scale.ymlاضافه و باremove-node.ymlحذف کنید. - مسیر air-gap را اگر دیتاسنتر بدون اینترنت دارید از docs Offline بخوانید.
upgrade-cluster.ymlرا روی lab قبل از production تمرین کنید.- پس از پایداری، GitOps و observability را جدا از Kubespray لایه کنید.
منابع
- GitHub — kubernetes-sigs/kubespray
- kubespray.io
- Comparisons (vs kops / kubeadm)
- Getting started
- Offline / Air-gap
- kubernetes.io — Kubespray
منتشر شده در P30Light — بخش زیرساخت و سرور