نسخه آنلاین در حال بارگذاری زمان... تهران: ۲۶°C
۲۸ کاربر آنلاین

PNo.30Light

نشریه تخصصی هوش مصنوعی، سیستم‌های سرور و مهندسی داده

تازه ترین‌ها
زیرساخت و سرور
زمان مطالعه: ۲۷ دقیقه ۰ بازدید

Karmada: Orchestration چندکلاستری Kubernetes — از Kubefed تا Multi-Cloud

نویسنده: تحریریه فنی P30Light
Karmada: Orchestration چندکلاستری Kubernetes — از Kubefed تا Multi-Cloud
✦ خلاصه نکات کلیدی مقاله
  • Karmada = Kubernetes Armada — مدیریت multi-cloud / multi-cluster با API بومی Kubernetes و بدون تغییر اپ.
  • جریان: Resource template + PropagationPolicy → ResourceBinding → Work → member clusters؛ Override برای تخصص هر کلاستر.
  • CNCF Incubating؛ جانشین طبیعی Federation/Kubefed با Push و Pull و سناریوهای Active-active / DR / Geo.

یک کلاستر 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-clusterKarmada
API اپهمان YAML، تکرار N باراغلب proprietaryهمان YAML یک‌بار
Scheduling بین کلاستردستی / اسکریپتوابسته به vendorfirst-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 SchedulingCluster 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-apiserverAPI سطح فدراسیون (بر پایهٔ kube-apiserver)
karmada-aggregated-apiserverAPIهای تجمیعی Karmada
karmada-controller-managerCluster / 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

حالتچگونه کار می‌کند؟مناسب برای
Pushcontrol plane مستقیم به API member وصل می‌شود (join)شبکهٔ خصوصی بین hub و members؛ ساده در cloud واحد
Pullkarmada-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 clusters

PropagationPolicy — قلب 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   # etcd

kubeconfig کنترل‌پلین پیش‌فرض: /etc/karmada/karmada-apiserver.config

HA

kubectl karmada init \
  --karmada-apiserver-replicas 3 \
  --etcd-replicas 3

Offline / سفارشی‌سازی 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 Operatorlifecycle مدیریت‌شده
binary / sourceمحیط خاص
hack/local-up-karmada.shlab با 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

  1. به context کنترل‌پلین سوییچ کنید
  2. یک Deployment معمولی kubectl apply کنید (هنوز روی member نمی‌رود — فقط template است)
  3. PropagationPolicy (و در صورت نیاز Override) را apply کنید
  4. روی 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 Managementframework ماژولار hub-agentPlacement/ManifestWorkمدل agentرقیب/هم‌خانواده — OCM برای گسترش پلتفرم؛ Karmada full-stackتر برای federation
Rancher FleetGitOps در مقیاس edgeضعیف در failover هوشمندhub→spokeمکمل/جایگزین جزئی — تحویل، نه scheduler فدراتیو
Argo ApplicationSetتولید چند Applicationالگوی GitOpsمکمل — می‌تواند فقط به hub اشاره کند
Crossplaneprovision زیرساخت از K8sمکمل — infra + Karmada برای app

جمع‌بندی انتخاب:

  • می‌خواهید یک Deployment → چند کلاستر با failoverKarmada
  • می‌خواهید کلاستر بسازید → Cluster API
  • می‌خواهید فقط تحویل GitOps در هزاران edge → Fleet / ApplicationSet را جدی بگیرید
  • روی استک Red Hat / ACM و agentهای سفارشی → OCM را هم ارزیابی کنید

بیشتر در CNCF: Karmada and OCM.


عملیات روزمره

کاردستور / نکته
وضعیت memberskubectl get clusters روی control plane
دیباگ placementResourceBinding، Work، eventهای scheduler
عضو جدیدjoin (Push) یا register (Pull)
جدا کردن عضوunjoin / حذف Cluster CR با احتیاط
تفاوت RegionOverridePolicy روی image/StorageClass
failure یک AZreplicaScheduling + rebalancing؛ تست DR از قبل
امنیت hubRBAC روی karmada-apiserver؛ محدود کردن چه کسی Propagation می‌نویسد
مشاهده‌پذیریمتریک اجزا + tracing درmembers؛ برای tracing ببینید Jaeger

برای کلاسترهای سبک edge: K3s. برای mesh بین سرویس‌ها داخل/بین کلاسترها: Istio.


یکپارچگی با استک P30Light

لایهمقاله
GitOpsFlux · Argo
Infra control planeCrossplane
PackageHelm
Edge K8sK3s
Mesh / IngressIstio · Envoy · Contour
ObservabilityJaeger · 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
کلید APIPropagationPolicy + OverridePolicy
اتصالPush و Pull
نقشfederation workload — نه جایگزین CAPI یا کامل GitOps
ارزشیک manifest، چند کلاستر، HA جغرافیایی، ضد vendor lock-in

قدم بعدی

  1. با hack/local-up-karmada.sh یا Kind یک lab سه عضوی بالا بیاورید.
  2. یک Deployment + PropagationPolicy وزن‌دار بین دو member اعمال کنید.
  3. یک Override برای image registry متفاوت روی یکی از members بنویسید.
  4. یک member را cordon/قطع کنید و رفتار rebalancing را ببینید.
  5. Flux/Argo را فقط به karmada-apiserver وصل کنید.
  6. برای production، init با replicaهای HA برای apiserver و etcd، و تفکیک RBAC platform در برابر app teams.

منابع

منتشر شده در P30Light — بخش زیرساخت و سرور

لینک گزارش با موفقیت کپی گردید!