یک کلاستر Kubernetes کافی نیست وقتی باید:
- در چند Region یا چند cloud زنده بمانید
- edge و on-prem را کنار public cloud مدیریت کنید
- بدون بازنویسی اپ، replica را بین کلاسترها پخش و در failure جابهجا کنید
Karmada (مخفف Kubernetes Armada) برای همین ساخته شد:
Open, Multi-Cloud, Multi-Cluster Kubernetes Orchestration — run cloud-native apps across multiple clusters and clouds, with no changes to your applications.
یعنی یک control plane فدراتیو که به زبان API بومی Kubernetes حرف میزند، scheduling چندبعدی دارد، و برای multi-cloud / hybrid / edge طراحی شده است.
CNCF Incubating (پروژهٔ incubation بنیاد). سایت: karmada.io · Docs: docs · Repo: github.com/karmada-io/karmada · نسخهٔ docs رایج: v1.18
مشکل: چند کلاستر، بدون فدراسیون
بدون لایهٔ multi-cluster:
GitOps × N کلاستر
Helm × N
failover دستی
policy و image registry جدا برای هر cloud
با Karmada:
یک Deployment (native) + PropagationPolicy
↓
پخش / وزن / affinity / failover روی member clusters| معیار | N× GitOps جدا | Vendor multi-cluster | Karmada |
|---|---|---|---|
| API اپ | همان YAML، تکرار N بار | اغلب proprietary | همان YAML یکبار |
| Scheduling بین کلاستر | دستی / اسکریپت | وابسته به vendor | first-class |
| Failover خودکار | محدود | وابسته | سناریوهای آماده |
| Vendor lock-in | کم | بالا | طراحی ضد قفل |
| ابزار موجود K8s | کار میکند ولی تکراری | محدود | kubectl / Helm / Flux روی control plane |
| CNCF | — | — | ✅ Incubating |
Karmada جایگزین ساخت کلاستر نیست (آن کار Cluster API است) و جایگزین GitOps کامل نیست — لایهٔ workload federation و placement است. برای GitOps ببینید: Flux و Argo. برای control plane زیرساختی: Crossplane.
Karmada چیست؟
طبق karmada.io و What is Karmada?:
- سیستم مدیریت Kubernetes برای اجرای اپهای cloud-native روی چند کلاستر و چند cloud
- بدون تغییر در اپلیکیشنها
- هدف: automation آماده برای multi-cluster در multi-cloud و hybrid — مدیریت متمرکز، HA، recovery، و traffic scheduling
- جانشین مفهومی Federation v1 و Kubefed (Federation v2) با اصلاح مدل API
چرا Karmada (از سایت رسمی)
| وعده | معنی عملی |
|---|---|
| Kubernetes Native API Compatible | ارتقا از تککلاستر به چندکلاستر بدون بازنویسی؛ toolchain موجود (kubectl، Helm، …) |
| Out of the Box | سیاستهای آماده: Active-active، Remote DR، Geo Redundant؛ auto-scaling، failover، load-balancing بین کلاسترها |
| Avoid Vendor Lock-in | یکپارچگی با cloudهای رایج؛ تخصیص و مهاجرت خودکار؛ نه وابسته به orchestration proprietary |
| Centralized Management | کلاسترها location-agnostic؛ public / on-prem / edge |
| Fruitful Scheduling | Cluster Affinity؛ splitting/rebalancing؛ HA چندبعدی Region / AZ / Cluster / Provider |
| Open and Neutral | آغاز مشترک صنعت + هدف governance باز در CNCF |
مفاهیم اصلی
| مفهوم | نقش |
|---|---|
| Host / Control plane cluster | جایی که اجزای Karmada (API server، controllers، scheduler) اجرا میشوند — خودش معمولاً workload اپ را اجرا نمیکند |
| Member cluster | کلاستر واقعی که Podها آنجا اجرا میشوند |
| Resource template | همان Deployment/Service/… بومی Kubernetes که به Karmada API میدهید |
| PropagationPolicy / ClusterPropagationPolicy | «کدام resource به کجا برود» — placement و spreading |
| OverridePolicy / ClusterOverridePolicy | تخصص تنظیمات per-cluster (مثلاً image prefix، StorageClass) |
| ResourceBinding / ClusterResourceBinding | نتیجهٔ سیاست: اتصال یک resource به کلاسترهای انتخابشده |
| Work | واحد تحویل به هر member — manifest نهایی برای آن کلاستر |
| Cluster (CR) | ثبت یک member در control plane (آمادگی، mode، نسخه، …) |
جریان منطقی (سهلایه):
1) Policy Controller
PropagationPolicy + Resource template
→ ResourceBinding / ClusterResourceBinding
2) Binding Controller
ResourceBinding
→ Work (یکی به ازای هر member هدف)
3) Execution Controller
Work
→ اعمال resource روی member clusterاین مدل به تیم platform اجازه میدهد سیاست placement بنویسد و تیم سرویس همان Deployment معمولی را نگه دارد — الگوی رایج در بانکها و پلتفرمهای بزرگ (مثلاً گزارشهای CNCF دربارهٔ ICBC).
معماری Control Plane
Control plane شبیه یک کلاستر Kubernetes «مجازی» است:
┌─────────────────────────────────────┐
│ Karmada Control Plane │
kubectl/Helm/ │ karmada-apiserver │
Flux/Argo ────►│ aggregated-apiserver │
│ controller-manager │
│ scheduler │
│ webhook │
│ kube-controller-manager (+ etcd) │
└──────────────┬──────────────────────┘
Push │ │ Pull (agent)
▼ ▼
┌────────────┐ ┌────────────┐ ┌────────────┐
│ Member A │ │ Member B │ │ Member C │
│ (cloud) │ │ (on-prem) │ │ (edge) │
└────────────┘ └────────────┘ └────────────┘اجزای نصبشده (معمولاً در karmada-system)
| کامپوننت | کار |
|---|---|
| karmada-apiserver | API سطح فدراسیون (بر پایهٔ kube-apiserver) |
| karmada-aggregated-apiserver | APIهای تجمیعی Karmada |
| karmada-controller-manager | Cluster / Policy / Binding / Execution و بقیه |
| karmada-scheduler | انتخاب member بر اساس affinity، منابع، وزن، HA |
| karmada-webhook | اعتبارسنجی و mutation |
| kube-controller-manager | کنترلرهای استاندارد لازم روی control plane |
| etcd | ذخیرهسازی control plane |
| karmada-agent | فقط در memberهای Pull |
Scheduler روی fault domain، ظرفیت منابع، نسخهٔ Kubernetes و add-onهای فعال تصمیم میگیرد؛ framework قابل گسترش (plugin) است.
جزئیات بیشتر: Architecture در docs و CNCF: Multi-cluster with an ocean of nodes.
Push در برابر Pull
| حالت | چگونه کار میکند؟ | مناسب برای |
|---|---|---|
| Push | control plane مستقیم به API member وصل میشود (join) | شبکهٔ خصوصی بین hub و members؛ ساده در cloud واحد |
| Pull | karmada-agent داخل member دستور را از hub میکشد (register) | edge، NAT، firewall سخت، کلاسترهایی که inbound API نمیپذیرند |
هر دو میتوانند همزمان در یک Armada باشند (مثلاً عضوهای داخلی Push، لبه Pull).
# Push — از سمت control plane
kubectl karmada join ${MEMBER_CLUSTER_NAME} \
--cluster-kubeconfig=$HOME/.kube/member.config
# Pull — از سمت member
kubectl karmada register <control-plane-endpoint> \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash>لیست اعضا:
kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get clustersPropagationPolicy — قلب placement
PropagationPolicy مشخص میکند کدام منابع و به کجا بروند. نمونهٔ مفهومی:
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
name: nginx-propagation
namespace: default
spec:
resourceSelectors:
- apiVersion: apps/v1
kind: Deployment
name: nginx
placement:
clusterAffinity:
clusterNames:
- member1
- member2
replicaScheduling:
replicaSchedulingType: Divided
replicaDivisionPreference: Weighted
weightPreference:
staticWeightList:
- targetCluster:
clusterNames: ["member1"]
weight: 2
- targetCluster:
clusterNames: ["member2"]
weight: 1نکات مهم:
- resourceSelectors میتوانند label-based باشند تا یک سیاست platform برای همهٔ Deploymentهای HA اعمال شود
- ClusterPropagationPolicy نسخهٔ cluster-scoped است
- سیاست از manifest اپ جداست — تیم سرویس Deployment مینویسد؛ platform placement را مالک است
سناریوهای رایج placement:
| سناریو | ایده |
|---|---|
| Active-active | تقسیم replica بین چند Region/AZ |
| Remote DR | کلاستر standby با سیاست failover |
| Geo redundant | اجبار پخش روی چند geography |
| Cluster Affinity | فقط کلاسترهای با label مشخص (مثلاً provider=aws) |
| Rebalancing | جبران کمبود replica وقتی یک member از دسترس خارج میشود |
OverridePolicy — تخصص per-cluster
وقتی یک template برای همه کافی نیست:
apiVersion: policy.karmada.io/v1alpha1
kind: OverridePolicy
metadata:
name: nginx-image-override
namespace: default
spec:
resourceSelectors:
- apiVersion: apps/v1
kind: Deployment
name: nginx
overrideRules:
- targetCluster:
clusterNames: ["member-cn"]
overriders:
plaintext:
- path: "/spec/template/spec/containers/0/image"
operator: replace
value: "registry.cn-example.com/library/nginx:1.25"مثالهای کلاسیک از README رسمی:
- عوض کردن image prefix بر اساس Region
- عوض کردن StorageClass بر اساس cloud provider
بدون Override مجبورید N نسخهٔ تقریباً یکسان از Deployment نگه دارید.
Resource Interpreter و CRDهای سفارشی
برای CRهای غیر استاندارد، Karmada از سازوکار Resource Interpreter (از جمله webhook) استفاده میکند تا بفهمد چگونه replica، status و فیلدهای حیاتی را برای فدراسیون تفسیر کند. این همان چیزی است که توزیع workloadهای پیچیده و تجمیع status را ممکن میکند — نه فقط Deployment و Service.
نصب و شروع سریع
پیشنیاز CLI: پلاگین kubectl-karmada یا باینری karmadactl (دستورات معادلاند). docs: Installation.
روی کلاستر موجود
# نیاز به privilege برای مسیر پیشفرض /etc/karmada (قابل override با --karmada-data)
kubectl karmada initخروجی موفق معمولاً راهنمای join / register را چاپ میکند. کامپوننتها در karmada-system:
kubectl get deployments -n karmada-system
kubectl get statefulsets -n karmada-system # etcdkubeconfig کنترلپلین پیشفرض: /etc/karmada/karmada-apiserver.config
HA
kubectl karmada init \
--karmada-apiserver-replicas 3 \
--etcd-replicas 3Offline / سفارشیسازی image
kubectl karmada init --crds /$HOME/crds.tar.gz
kubectl karmada init \
--karmada-controller-manager-image=example.registry.com/library/karmada-controller-manager:1.0روشهای دیگر
| روش | کاربرد |
|---|---|
| Helm chart | استقرار declarative در pipeline |
| Karmada Operator | lifecycle مدیریتشده |
| binary / source | محیط خاص |
hack/local-up-karmada.sh | lab با kind + چند member |
برای توسعهٔ محلی:
git clone https://github.com/karmada-io/karmada
cd karmada
hack/local-up-karmada.sh
export KUBECONFIG="$HOME/.kube/karmada.config"
kubectl get clustersخروجی نمونه: member1/member2 در Push و member3 در Pull.
اولین workload
- به context کنترلپلین سوییچ کنید
- یک Deployment معمولی
kubectl applyکنید (هنوز روی member نمیرود — فقط template است) - PropagationPolicy (و در صورت نیاز Override) را apply کنید
- روی members وضعیت Pod را ببینید؛ روی hub وضعیت Binding/Work را دنبال کنید
GitOps: Flux یا Argo را فقط به karmada-apiserver وصل کنید؛ پخش به members کار Karmada است — نه تکرار ApplicationSet برای هر کلاستر (مگر hybrid آگاهانه).
مقایسه با گزینههای multi-cluster
| ابزار | تمرکز اصلی | Scheduling بین کلاستر | Push/Pull | رابطه با Karmada |
|---|---|---|---|---|
| Cluster API | ساخت/ارتقا/حذف کلاستر | خیر | مدیریت کلاستر | مکمل — CAPI میسازد، Karmada پخش میکند |
| Kubefed | فدراسیون قدیمی | محدود | عمدتاً Push | سلف — migrate به Karmada |
| Open Cluster Management | framework ماژولار hub-agent | Placement/ManifestWork | مدل agent | رقیب/همخانواده — OCM برای گسترش پلتفرم؛ Karmada full-stackتر برای federation |
| Rancher Fleet | GitOps در مقیاس edge | ضعیف در failover هوشمند | hub→spoke | مکمل/جایگزین جزئی — تحویل، نه scheduler فدراتیو |
| Argo ApplicationSet | تولید چند Application | الگوی GitOps | — | مکمل — میتواند فقط به hub اشاره کند |
| Crossplane | provision زیرساخت از K8s | — | — | مکمل — infra + Karmada برای app |
جمعبندی انتخاب:
- میخواهید یک Deployment → چند کلاستر با failover → Karmada
- میخواهید کلاستر بسازید → Cluster API
- میخواهید فقط تحویل GitOps در هزاران edge → Fleet / ApplicationSet را جدی بگیرید
- روی استک Red Hat / ACM و agentهای سفارشی → OCM را هم ارزیابی کنید
بیشتر در CNCF: Karmada and OCM.
عملیات روزمره
| کار | دستور / نکته |
|---|---|
| وضعیت members | kubectl get clusters روی control plane |
| دیباگ placement | ResourceBinding، Work، eventهای scheduler |
| عضو جدید | join (Push) یا register (Pull) |
| جدا کردن عضو | unjoin / حذف Cluster CR با احتیاط |
| تفاوت Region | OverridePolicy روی image/StorageClass |
| failure یک AZ | replicaScheduling + rebalancing؛ تست DR از قبل |
| امنیت hub | RBAC روی karmada-apiserver؛ محدود کردن چه کسی Propagation مینویسد |
| مشاهدهپذیری | متریک اجزا + tracing درmembers؛ برای tracing ببینید Jaeger |
برای کلاسترهای سبک edge: K3s. برای mesh بین سرویسها داخل/بین کلاسترها: Istio.
یکپارچگی با استک P30Light
| لایه | مقاله |
|---|---|
| GitOps | Flux · Argo |
| Infra control plane | Crossplane |
| Package | Helm |
| Edge K8s | K3s |
| Mesh / Ingress | Istio · Envoy · Contour |
| Observability | Jaeger · Fluentd |
الگوی رایج پلتفرم:
Cluster API / cloud → member clusters
Git (Flux/Argo) → Karmada control plane (templates + policies)
Karmada → schedule / override / failover روی membersخلاصه
| موضوع | جمعبندی |
|---|---|
| چیست | orchestration چندکلاستری/چندابری با API بومی K8s |
| وضعیت | CNCF Incubating؛ ادامهٔ مسیر Federation/Kubefed |
| جریان | Policy → Binding → Work → member |
| کلید API | PropagationPolicy + OverridePolicy |
| اتصال | Push و Pull |
| نقش | federation workload — نه جایگزین CAPI یا کامل GitOps |
| ارزش | یک manifest، چند کلاستر، HA جغرافیایی، ضد vendor lock-in |
قدم بعدی
- با
hack/local-up-karmada.shیا Kind یک lab سه عضوی بالا بیاورید. - یک Deployment + PropagationPolicy وزندار بین دو member اعمال کنید.
- یک Override برای image registry متفاوت روی یکی از members بنویسید.
- یک member را
cordon/قطع کنید و رفتار rebalancing را ببینید. - Flux/Argo را فقط به karmada-apiserver وصل کنید.
- برای production،
initبا replicaهای HA برای apiserver و etcd، و تفکیک RBAC platform در برابر app teams.
منابع
- Karmada — سایت رسمی
- What is Karmada? (Docs)
- Installation
- Migration from Kubefed
- GitHub — karmada-io/karmada
- CNCF — Ocean of nodes
- CNCF — Karmada and Open Cluster Management
منتشر شده در P30Light — بخش زیرساخت و سرور