kind و minikube و k3d يعطيك كل واحد منها Kubernetes API على حاسوب محمول. تختلف في المدة التي يستغرقها البدء الأول، وكيف ينفقون الذاكرة، وكيف يصبح LoadBalancer أو Ingress منفذا يمكنك فتحه. أنشئ عنقودا واحدا باستخدام الأوامر أدناه وحمل صورة محلية بدون دفعها إلى سجل.

الجواب المختصر

استخدم kind عندما يجب أن يتصرف العنقود مثل Kubernetes المتجاه وعندما يجب أن تعمل نفس الأوامر في CI. استخدم minikube عندما تريد minikube addons enable ingress, سائقا ليس Docker، أو نفقا يعطي LoadBalancer Services عنوانا. استخدم k3d عندما تريد k3s وحجما صغيرا ومنفذ مضيف على موازن التحميل المجمع بدون تثبيت وحدات تحكم إضافية.

جميع الثلاثة يتحدثون إلى محرك Docker بشكل افتراضي. docker info يجب أن ينجح. إذا فشل مع خطأ socket، أصلح إذن socket Docker قبل تصحيح أخطاء أداة العنقود. أسماء سياق kubectl والأوامر اليومية موجودة في ورقة غش kubectl.

جنبا إلى جنب

kind minikube k3d
ما ينفذه Kubernetes المتجاه عبر kubeadm، حاوية واحدة لكل عقدة Kubernetes المتجاه في حاوية أو VM k3s في Docker
وقت التشغيل الافتراضي Docker Docker، أو سائق VM Docker
متعدد العقد ملف تكوين، role: worker --nodes --servers و --agents
Ingress تثبيت وحدة التحكم minikube addons enable ingress Traefik، ما لم تعطله
LoadBalancer معلق حتى cloud-provider-kind أو MetalLB minikube tunnel (اترك العملية تعمل) k3s ServiceLB بالإضافة إلى وكيل k3d
ضع صورة محلية على العُقد kind load docker-image minikube image load k3d image import
سياق kubeconfig kind-<name> اسم ملف التعريف (minikube بشكل افتراضي) k3d-<name>
CI الخيار المعتاد؛ لا خطوة إضافة يعمل مع --driver=docker؛ أثقل يعمل؛ موازن مدمج يوفر الخطوات

الإنشاء الأول ينتظر تنزيل صورة العقدة للجميع. بعد ذلك يتم تخزين الصورة مؤقتا، عادة ما تصل kind و k3d إلى Ready أسرع من minikube، وسائق minikube VM أيضا يقلع نظام تشغيل الضيف. تعامل معها كترتيب، وليس قياسا.

k3s يشغل الطائرة الضابطة كعملية واحدة، لذلك k3d عادة ما تكون أخف على الذاكرة. kind تشغل عمليات الطائرة الضابطة العادية في حاوية العقدة. سائق minikube VM يحتفظ بـ --memory الذي حددته. سائق Docker يجلس أقرب إلى kind، بالإضافة إلى أي إضافة تمكنها.

إنشاء عنقود

kind

brew install kind
winget install Kubernetes.kind

brew هو macOS أو Linux. winget هو Windows. Chocolatey تشحن choco install kind.

عقدة واحدة:

kind create cluster --name dev
kubectl cluster-info --context kind-dev
kind delete cluster --name dev

أكثر من عقدة واحدة، ومنافذ مضيف 80 و 443 موجهة نحو حاوية الطائرة الضابطة، تحتاج إلى ملف تكوين. kind ليس لديها علم --nodes.

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
    extraPortMappings:
      - containerPort: 80
        hostPort: 80
      - containerPort: 443
        hostPort: 443
  - role: worker
  - role: worker
kind create cluster --name dev --config kind-config.yaml

حدد صورة العقدة عندما تحتاج إلى Kubernetes minor محددة، على سبيل المثال --image kindest/node:v1.31.0. يجب أن توجد العلامة لهذه الإصدار kind.

minikube

brew install minikube
winget install Kubernetes.minikube
minikube start -p dev --driver=docker --nodes=3 --cpus=2 --memory=4g
minikube status -p dev
minikube delete -p dev

--nodes=3 هو طائرة ضابطة واحدة بالإضافة إلى عاملين. --driver هو docker أو podman عندما يكون لديك محرك حاوية بالفعل، أو kvm2, qemu2, hyperv, virtualbox, أو vfkit للـ VM. --ha يعني عدة عقد طائرة ضابطة، وليس “المزيد من العمال.”

اسم ملف التعريف هو سياق kubectl: -p dev هو kubectl config use-context dev. ملف التعريف الافتراضي هو minikube. حدد إصدارا مع --kubernetes-version=v1.31.0 أو stable.

k3d

k3d يحتاج Docker. macOS و Linux:

brew install k3d

Windows: choco install k3d أو scoop install k3d. المشروع ينشر أيضا مثبتا:

curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash
k3d cluster create dev --agents 2 --port "8080:80@loadbalancer"
kubectl cluster-info --context k3d-dev
k3d cluster delete dev

--agents 2 يضيف عاملين بجانب خادم واحد. السياق هو k3d-dev. بدون اسم، العنقود هو k3s-default والسياق هو k3d-k3s-default.

--port ينشر منفذ مضيف من خلال وكيل k3d. بدونه، k3d تطبع المنافذ العالية التي اختارتها. @server:0 كافية لتعطيل Traefik على الخادم الأول:

k3d cluster create dev --agents 2 --k3s-arg "--disable=traefik@server:0" --port "8080:80@loadbalancer"

ثبت وحدة التحكم ingress الخاصة بك بعد ذلك، وأشر إليها على المنفذ المنشور.

الصور والدخول والتوازن

أنشئ باستخدام Docker CLI, ثم انسخ الصورة إلى العُقد. لا يلزم سجل لجهاز واحد.

docker build -t example/web:1.4.0 ./web
kind load docker-image example/web:1.4.0 --name dev
minikube image load example/web:1.4.0 -p dev
k3d image import example/web:1.4.0 -c dev

kind يقبل عدة علامات في استدعاء واحد. minikube يقبل أيضا tarball (minikube image load web.tar).

تجنب العلامة latest. Kubernetes يتعامل مع latest, وعلامة مفقودة، كـ imagePullPolicy: Always, لذا فإن kubelet لا يزال يتصل بسجل. أي علامة أخرى تفترض IfNotPresent. إذا كانت السحب تعمل والعلامة لم تُنشر، الPod هو ImagePullBackOff.

على Docker الحالي، kind load docker-image قد تفشل عندما يستخدم المصدر ctr containerd (خطأ digest). احفظ نظام أساسي واحد وحمل الأرشيف بدلا من ذلك. يجب أن يطابق النظام الأساسي العقدة. يفشل أرشيف amd64 على عقدة arm64 عند البدء مع خطأ تنسيق التنفيذ.

docker image save --platform linux/amd64 --output web.tar example/web:1.4.0
kind load image-archive web.tar --name dev

استخدم linux/arm64 عندما تكون عقد kind هي Apple Silicon.

Ingress و LoadBalancer أبواب مختلفة:

  • kind لا تثبت وحدة تحكم ingress أو موازن تحميل سحابة. extraPortMappings فقط تنشر منافذ حاوية. ثبت وحدة التحكم التي تستخدمها في الإنتاج واربطها بـ 80 و 443 على تلك العقدة. خدمة LoadBalancer تبقى <pending> حتى يوجد واحد. شغل cloud-provider-kind على المضيف (go install sigs.k8s.io/cloud-provider-kind@latest, ثم الملف الثنائي، المتروك في المقدمة). يحتاج إلى إذن لفتح المنافذ. MetalLB هو الخيار الآخر.
  • minikube تمكّن ingress-nginx مع minikube addons enable ingress -p dev. للـ LoadBalancer، اترك minikube tunnel -p dev تعمل. إيقافها يسقط المسارات. قد يطلب كلمة مرور المسؤول لتغيير مسارات المضيف.
  • k3d تثبت Traefik و k3s ServiceLB. الوصول إليها مع --port ...@loadbalancer. عطّل Traefik قبل تثبيت وحدة تحكم ثانية.

أسماء StorageClass تختلف، لهذا السبب manifest الذي عمل على حاسوب محمول واحد يبقى Pending على آخر. تحقق مع kubectl get storageclass. عنقود kind افتراضي وعنقود minikube افتراضي يسميان الفئة standard. عنقود k3d افتراضي يسميها local-path. مطالبة تعيين storageClassName إلى الاسم الخطأ لا تربط. انظر Pod Pending / FailedScheduling.

متى تختار kind

اختر kind لاختبار kubeadm، أو لتشغيل نفس خطوات الإنشاء والحمل والتطبيق في CI. متعدد العقد هو ملف تكوين. Ingress و LoadBalancer تثبيتات إضافية. وظيفة نموذجية هي kind create cluster, kind load docker-image, kubectl apply, ثم kubectl wait.

kubectl wait --for=condition=available deployment/api --timeout=120s

متى تختار minikube

اختر minikube عندما تريد minikube addons list وأمر واحد لـ ingress، أو Hyper-V أو KVM أو QEMU VM لأن Docker غير متاح. minikube tunnel يحل محل عملية cloud-provider. إنه اختيار CI أضعف: سائق Docker يعمل، لكن نفقا عملية طويلة الأمد وظيفة نادرا ما تريد.

متى تختار k3d

اختر k3d عندما تكون الذاكرة محدودة، الإنتاج بالفعل k3s، أو تريد Traefik وموازن تحميل على الإنشاء الأول. API هو Kubernetes. Traefik و ServiceLB و local-path وطائرة ضابطة أنحف هي افتراضيات k3s، وليست افتراضيات kubeadm.

مسار الهجرة

الانتقال بين هذه الأدوات لا يُصدّر العنقود. manifests في git هي مصدر الحقيقة.

  1. اسرد الصور التي ليست في سجل (docker images). ستحملها مرة أخرى.
  2. حرر منافذ المضيف 80 و 443 إذا كنت قد خريطت لهما.
  3. أنشئ العنقود الجديد. لا تربط منافذ المضيف 80 و 443 على عنقودين في نفس الوقت.
  4. حمّل الصور بأمر تلك الأداة. أرشيف kind ليس k3d image import.
  5. kubectl config use-context إلى kind-dev, dev, أو k3d-dev.
  6. kubectl apply -f أو kubectl apply -k. أصلح storageClassName إذا ظلت PVC Pending، و ingress class إذا لم يصل الحركة أبدا (nginx على إضافة minikube, traefik على k3d الافتراضي).
  7. احذف العنقود القديم: kind delete cluster --name dev, minikube delete -p dev, أو k3d cluster delete dev.

على عنقود مشترك، ادفع العلامات إلى سجل وأسقط خرائط منفذ المضيف. Docker Compose مقابل Kubernetes يغطي جانب التطبيق: Compose على محرك واحد، هذه الأدوات لـ API محلي، عنقود حقيقي عندما يكون لديك أكثر من جهاز واحد.

الأسئلة الشائعة

أي أداة Kubernetes محلية أقرب إلى عنقود الإنتاج؟

kind. كل عقدة هي عنقود kubeadm داخل حاوية، وهو نفس البدء الذي تستخدمه معظم العناقيد المتجاه. k3d هو Kubernetes API حقيقي على k3s، مع Traefik وموازن الخدمة المدمج بالفعل. minikube هو أيضا API حقيقي؛ الإضافات والسائق هما الأجزاء التي لن تتطابق مع عنقودك الإنتاجي.

كيف أستخدم صورة محلية مدمجة بدون سجل؟

حملها إلى عُقد العنقود قبل التطبيق. kind يستخدم kind load docker-image, minikube يستخدم minikube image load, و k3d يستخدم k3d image import. حدد علامة غير latest, أو اضبط imagePullPolicy: IfNotPresent, وإلا فسيحاول kubelet السجل على أي حال.

لماذا تبقى خدمة LoadBalancer معلقة؟

لا شيء على kind ينفذ نوع الخدمة هذا حتى تشغل cloud-provider-kind أو تثبت MetalLB. minikube يحتاج minikube tunnel تركت تعمل في محطة أخرى. k3d تشحن مع k3s ServiceLB وحاوية وكيل، لذلك يظهر العنوان بمجرد أن يكون العنقود جاهزا وتنشر منفذ المضيف.

هل يمكنني تشغيل kind و minikube و k3d في نفس الوقت؟

نعم، إذا كان لدى Docker ذاكرة كافية ومنافذ المضيف 80 و 443 لم يتم المطالبة بهما مرتين. كل أداة تكتب سياقها kubeconfig الخاص: kind-<name>, اسم ملف تعريف minikube, و k3d-<name>. التبديل مع kubectl config use-context.

كيف تم التحقق من هذا الدليل

كُتب يدويًا من الوثائق الرسمية، وأُعيد فحص كل أمر، ثم رُوجع مرة ثانية قبل النشر. آخر مراجعة في .

المصادر الرسمية التي قُرئت لهذا المقال

شاركها.

التعليقات مغلقة.