Kubernetes چیست؟ ساخت اولین کلاستر محلی با Minikube در ویندوز
در این آموزش عملی، تفاوت Kubernetes با Docker را میآموزید، Minikube و kubectl را در ویندوز آماده میکنید و یک برنامه نمونه را با Deployment و Service روی کلاستر محلی اجرا و عیبیابی میکنید.
وقتی یک برنامه کانتینری فقط روی لپتاپ شما اجرا میشود، Docker یا Docker Compose معمولاً کافی است. اما در محیطی که چند نسخه از برنامه باید روی چند ماشین اجرا شوند، خرابی نمونهها جبران شود و انتشار نسخه جدید قابل کنترل باشد، مسئله از «اجرای کانتینر» به «مدیریت وضعیت مطلوب» تغییر میکند. Kubernetes برای همین سطح از مسئله طراحی شده است.
در این راهنما ابتدا اجزای اصلی را با زبان ساده میشناسیم، سپس روی ویندوز یک کلاستر آموزشی با Minikube میسازیم و برنامه نمونه را با Deployment و Service اجرا میکنیم. هدف، ساخت یک محیط تمرینی واقعی است؛ Minikube ابزار یادگیری و توسعه محلی است و جای کلاستر Production را نمیگیرد.
Kubernetes چیست و چه کاری انجام میدهد؟
Kubernetes یا K8s یک سامانه متنباز برای استقرار، مقیاسدهی و مدیریت برنامههای کانتینری است. شما وضعیت مطلوب را تعریف میکنید؛ مثلاً میگویید سه نمونه از برنامه باید همیشه اجرا باشند. کنترلرهای کلاستر وضعیت واقعی را با این تعریف مقایسه میکنند و در صورت خرابی یا حذف یک نمونه، برای بازگرداندن وضعیت مطلوب اقدام میکنند.
مفاهیم پایهای که باید بشناسید
- Cluster: مجموعه Control Plane و Nodeهایی که Workloadها را اجرا میکنند.
- Node: ماشین مجازی یا فیزیکی عضو کلاستر.
- Pod: کوچکترین واحد قابل استقرار؛ یک یا چند کانتینر هممکان با شبکه و Storage مشترک.
- Deployment: تعداد Replicaها، Image و روش بهروزرسانی برنامه را مدیریت میکند.
- Service: یک endpoint پایدار برای دسترسی شبکهای به مجموعهای از Podهای متغیر میسازد.
- kubectl: ابزار خط فرمان برای ارتباط با API کلاستر است.
تفاوت Kubernetes با Docker و Docker Compose
| موضوع | Docker Compose | Kubernetes |
|---|---|---|
| هدف اصلی | اجرای چند کانتینر روی یک میزبان | ارکستریشن Workload در کلاستر |
| تعریف وضعیت | فایل Compose | منابع API و Manifest |
| خودترمیمی | محدود به قابلیتهای Runtime | کنترلرها Podهای ازدسترفته را جایگزین میکنند |
| مقیاس افقی | برای محیط محلی ساده | Replica و سیاستهای مقیاسپذیری |
| پیچیدگی عملیاتی | کمتر | بیشتر و نیازمند مانیتورینگ و امنیت |
برای یک نمونه چندسرویسی پیش از ورود به ارکستریشن، راهنمای نصب n8n با Docker Compose را ببینید. اگر به اجرای مدل محلی علاقه دارید، راهنمای Ollama در ویندوز مسیر مکملی است.
یادگیری Kubernetes به معنی کنارگذاشتن Docker نیست. برنامه همچنان بهصورت Image کانتینری بستهبندی میشود؛ Kubernetes محل و تعداد اجرای آن Image و شبکه میان اجزا را مدیریت میکند.
پیشنیازهای Minikube در ویندوز
برای اجرای Node محلی، Minikube به یک Driver مانند Docker یا Hyper-V نیاز دارد. اگر Docker Desktop از قبل دارید، Driver داکر مسیر سادهای برای تمرین است. پیش از شروع، مجازیسازی CPU را بررسی کنید و منابع آزاد کافی برای ماشین یا کانتینر Minikube کنار بگذارید.
- Minikube را فقط از صفحه رسمی پروژه دریافت کنید.
kubectlرا از مستندات رسمی Kubernetes یا Package Manager معتبر نصب کنید.- پس از نصب، پنجره PowerShell تازه باز کنید تا PATH جدید خوانده شود.
- نسخه Client را بررسی کنید؛ kubectl باید حداکثر یک Minor Version با Control Plane فاصله داشته باشد.
kubectl version --clientminikube versionminikube start --driver=docker --cpus=2 --memory=4096kubectl cluster-infokubectl get nodeskubectl get pods --all-namespacesاگر Docker Driver در دسترس نیست، Driver سازگار دیگری را مطابق مستندات Minikube انتخاب کنید. همزمان چند روش مجازیسازی را بدون شناخت فعال نکنید؛ خطاهای شبکه و منابع معمولاً از Driver نامناسب یا Runtime خاموش ناشی میشوند.
ساخت نخستین Deployment و Service
بهجای ساخت Pod خام، از Deployment استفاده میکنیم تا کنترلر تعداد Replicaها را حفظ کند. سپس Service از نوع NodePort مسیر پایدار شبکه را فراهم میکند. فایل زیر را با نام hello-k8s.yaml ذخیره کنید.
apiVersion: apps/v1kind: Deploymentmetadata: name: hello-webspec: replicas: 2 selector: matchLabels: app: hello-web template: metadata: labels: app: hello-web spec: containers: - name: web image: nginx:1.27-alpine ports: - containerPort: 80---apiVersion: v1kind: Servicemetadata: name: hello-webspec: selector: app: hello-web ports: - port: 80 targetPort: 80 type: NodePortبرچسب app: hello-web حلقه اتصال Deployment و Service است. اگر Selector با Labelهای Pod تطابق نداشته باشد، Service ساخته میشود اما Endpoint سالمی نخواهد داشت.
اعمال Manifest و مشاهده وضعیت
kubectl apply -f .\hello-k8s.yamlkubectl rollout status deployment/hello-webkubectl get deployments,pods,serviceskubectl get endpoints hello-webminikube service hello-web --urlدستور آخر URL قابل دسترسی را چاپ میکند. در برخی Driverهای ویندوز یا WSL2 لازم است همان فرایند Minikube باز بماند. راه جایگزین قابل پیشبینی، اجرای kubectl port-forward service/hello-web 8080:80 و بازکردن http://localhost:8080 است.
چطور یک مشکل را مرحلهبهمرحله عیبیابی کنیم؟
| نشانه | دستور بررسی | علت محتمل |
|---|---|---|
| Node آماده نیست | kubectl describe node minikube | Driver، Runtime یا کمبود منابع |
| Pod در Pending مانده | kubectl describe pod نام-pod | منابع ناکافی یا مشکل Scheduling |
| ImagePullBackOff | kubectl describe pod نام-pod | نام Image، Registry یا شبکه |
| CrashLoopBackOff | kubectl logs نام-pod --previous | خروج برنامه یا تنظیمات نادرست |
| Service پاسخ نمیدهد | kubectl get endpoints hello-web | عدم تطابق Selector و Label |
همیشه از وضعیت سطح بالاتر به جزئیات بروید: Node، Deployment، Pod، Event، Log و سپس شبکه. دستور kubectl get events --sort-by=.metadata.creationTimestamp معمولاً خطاهای Scheduling و Pull را سریع آشکار میکند.
Scale و Rollout چه تفاوتی دارند؟
افزایش Replica
با kubectl scale deployment hello-web --replicas=3 تعداد نمونههای مطلوب را تغییر میدهید. Deployment تلاش میکند سه Pod آماده نگه دارد. این تمرین مفهوم Desired State را ملموس میکند.
بهروزرسانی Image
تغییر Image در Manifest و اجرای دوباره kubectl apply یک Rollout ایجاد میکند. وضعیت را با kubectl rollout status deployment/hello-web و تاریخچه را با kubectl rollout history deployment/hello-web ببینید. برای بازگشت آموزشی میتوانید از kubectl rollout undo deployment/hello-web استفاده کنید.
نکات امنیتی از همان محیط تمرین
- Manifest حاوی رمز عبور یا Token را در Git ثبت نکنید.
- از Tag شناور مانند
latestبرای نسخه قابل تکرار استفاده نکنید؛ نسخه یا Digest مشخص انتخاب کنید. - Container را در صورت امکان با کاربر غیرریشه و Filesystem فقطخواندنی اجرا کنید.
- دسترسی
kubectlرا معادل دسترسی مدیریتی بالقوه در نظر بگیرید و از kubeconfig محافظت کنید. - داشبورد Minikube و API Server را روی اینترنت عمومی منتشر نکنید.
- منابع CPU و Memory و Health Check را پیش از نزدیکشدن به Production تعریف کنید.
Minikube چه زمانی کافی نیست؟
Minikube برای یادگیری، توسعه و آزمایش Manifest عالی است، اما Production به طراحی جداگانه برای High Availability، شبکه، Storage پایدار، Backup، Upgrade، Observability، RBAC و مدیریت Secret نیاز دارد. موفقبودن برنامه روی یک Node محلی اثبات آمادگی Production نیست.
چکلیست پایان تمرین
kubectl get nodesیک Node در وضعیت Ready نشان میدهد.- دو Pod برنامه Running و Ready هستند.
- Service دارای Endpoint است.
- URL برنامه در مرورگر پاسخ میدهد.
- با حذف یک Pod، Deployment نمونه جایگزین میسازد.
- Scale به سه Replica انجام میشود.
- تاریخچه Rollout قابل مشاهده است.
- با
minikube stopکلاستر بدون حذف داده متوقف میشود.
جمعبندی
Kubernetes موتور اجرای کانتینر نیست؛ لایهای برای هماهنگکردن Workloadها و حفظ وضعیت مطلوب است. با Minikube میتوانید چرخه اصلی Deployment، Pod، Service، Scale و Rollout را بدون تهیه سرور واقعی تمرین کنید. پس از تسلط بر این مسیر، سراغ ConfigMap، Secret، Probe، Resource Limit، Ingress و RBAC بروید.
همین امروز کلاستر محلی را بساز، Manifest نمونه را اجرا کن و عمداً یک Pod را حذف کن تا خودترمیمی Kubernetes را ببینی.