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 هي مصدر الحقيقة.
- اسرد الصور التي ليست في سجل (
docker images). ستحملها مرة أخرى. - حرر منافذ المضيف 80 و 443 إذا كنت قد خريطت لهما.
- أنشئ العنقود الجديد. لا تربط منافذ المضيف 80 و 443 على عنقودين في نفس الوقت.
- حمّل الصور بأمر تلك الأداة. أرشيف kind ليس
k3d image import. kubectl config use-contextإلىkind-dev,dev, أوk3d-dev.kubectl apply -fأوkubectl apply -k. أصلحstorageClassNameإذا ظلت PVC Pending، و ingress class إذا لم يصل الحركة أبدا (nginxعلى إضافة minikube,traefikعلى k3d الافتراضي).- احذف العنقود القديم:
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.
كيف تم التحقق من هذا الدليل
كُتب يدويًا من الوثائق الرسمية، وأُعيد فحص كل أمر، ثم رُوجع مرة ثانية قبل النشر. آخر مراجعة في .
المصادر الرسمية التي قُرئت لهذا المقال

