Kubernetes چیست؟ ساخت اولین کلاستر محلی با Minikube در ویندوز

در این آموزش عملی، تفاوت Kubernetes با Docker را می‌آموزید، Minikube و kubectl را در ویندوز آماده می‌کنید و یک برنامه نمونه را با Deployment و Service روی کلاستر محلی اجرا و عیب‌یابی می‌کنید.

وقتی یک برنامه کانتینری فقط روی لپ‌تاپ شما اجرا می‌شود، یا Compose معمولاً کافی است. اما در محیطی که چند نسخه از برنامه باید روی چند ماشین اجرا شوند، خرابی نمونه‌ها جبران شود و انتشار نسخه جدید قابل کنترل باشد، مسئله از «اجرای کانتینر» به «مدیریت وضعیت مطلوب» تغییر می‌کند. برای همین سطح از مسئله طراحی شده است.

در این راهنما ابتدا اجزای اصلی را با زبان ساده می‌شناسیم، سپس روی یک کلاستر آموزشی با می‌سازیم و برنامه نمونه را با Deployment و Service اجرا می‌کنیم. هدف، ساخت یک محیط تمرینی واقعی است؛ ابزار یادگیری و توسعه محلی است و جای کلاستر Production را نمی‌گیرد.

چیست و چه کاری انجام می‌دهد؟

یا K8s یک سامانه متن‌باز برای استقرار، مقیاس‌دهی و مدیریت برنامه‌های کانتینری است. شما وضعیت مطلوب را تعریف می‌کنید؛ مثلاً می‌گویید سه نمونه از برنامه باید همیشه اجرا باشند. کنترلرهای کلاستر وضعیت واقعی را با این تعریف مقایسه می‌کنند و در صورت خرابی یا حذف یک نمونه، برای بازگرداندن وضعیت مطلوب اقدام می‌کنند.

مفاهیم پایه‌ای که باید بشناسید

  • Cluster: مجموعه Control Plane و Nodeهایی که Workloadها را اجرا می‌کنند.
  • Node: ماشین مجازی یا فیزیکی عضو کلاستر.
  • Pod: کوچک‌ترین واحد قابل استقرار؛ یک یا چند کانتینر هم‌مکان با شبکه و Storage مشترک.
  • Deployment: تعداد Replicaها، Image و روش به‌روزرسانی برنامه را مدیریت می‌کند.
  • Service: یک endpoint پایدار برای دسترسی شبکه‌ای به مجموعه‌ای از Podهای متغیر می‌سازد.
  • : ابزار خط فرمان برای ارتباط با API کلاستر است.

تفاوت با و Compose

موضوع Compose
هدف اصلیاجرای چند کانتینر روی یک میزبانارکستریشن Workload در کلاستر
تعریف وضعیتفایل Composeمنابع API و Manifest
خودترمیمیمحدود به قابلیت‌های Runtimeکنترلرها Podهای از‌دست‌رفته را جایگزین می‌کنند
مقیاس افقیبرای محیط محلی سادهReplica و سیاست‌های مقیاس‌پذیری
پیچیدگی عملیاتیکمتربیشتر و نیازمند مانیتورینگ و امنیت

برای یک نمونه چندسرویسی پیش از ورود به ارکستریشن، راهنمای نصب n8n با Docker Compose را ببینید. اگر به اجرای مدل محلی علاقه دارید، راهنمای Ollama در ویندوز مسیر مکملی است.

یادگیری به معنی کنارگذاشتن نیست. برنامه همچنان به‌صورت Image کانتینری بسته‌بندی می‌شود؛ محل و تعداد اجرای آن Image و شبکه میان اجزا را مدیریت می‌کند.

پیش‌نیازهای در

برای اجرای Node محلی، به یک Driver مانند یا Hyper-V نیاز دارد. اگر Desktop از قبل دارید، Driver داکر مسیر ساده‌ای برای تمرین است. پیش از شروع، مجازی‌سازی CPU را بررسی کنید و منابع آزاد کافی برای ماشین یا کانتینر کنار بگذارید.

  1. را فقط از صفحه رسمی پروژه دریافت کنید.
  2. kubectl را از مستندات رسمی یا Package Manager معتبر نصب کنید.
  3. پس از نصب، پنجره PowerShell تازه باز کنید تا PATH جدید خوانده شود.
  4. نسخه Client را بررسی کنید؛ باید حداکثر یک Minor Version با Control Plane فاصله داشته باشد.
cluster-setup.ps1PowerShell
kubectl version --clientminikube versionminikube start --driver=docker --cpus=2 --memory=4096kubectl cluster-infokubectl get nodeskubectl get pods --all-namespaces
UTF-8PowerShell

اگر Driver در دسترس نیست، Driver سازگار دیگری را مطابق مستندات انتخاب کنید. هم‌زمان چند روش مجازی‌سازی را بدون شناخت فعال نکنید؛ خطاهای شبکه و منابع معمولاً از Driver نامناسب یا Runtime خاموش ناشی می‌شوند.

ساخت نخستین Deployment و Service

به‌جای ساخت Pod خام، از Deployment استفاده می‌کنیم تا کنترلر تعداد Replicaها را حفظ کند. سپس Service از نوع NodePort مسیر پایدار شبکه را فراهم می‌کند. فایل زیر را با نام hello-k8s.yaml ذخیره کنید.

hello-k8s.yamlYAML
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
UTF-8YAML

برچسب app: hello-web حلقه اتصال Deployment و Service است. اگر Selector با Labelهای Pod تطابق نداشته باشد، Service ساخته می‌شود اما Endpoint سالمی نخواهد داشت.

اعمال Manifest و مشاهده وضعیت

deploy.ps1PowerShell
kubectl apply -f .\hello-k8s.yamlkubectl rollout status deployment/hello-webkubectl get deployments,pods,serviceskubectl get endpoints hello-webminikube service hello-web --url
UTF-8PowerShell

دستور آخر URL قابل دسترسی را چاپ می‌کند. در برخی Driverهای یا WSL2 لازم است همان فرایند باز بماند. راه جایگزین قابل پیش‌بینی، اجرای kubectl port-forward service/hello-web 8080:80 و بازکردن http://localhost:8080 است.

چطور یک مشکل را مرحله‌به‌مرحله عیب‌یابی کنیم؟

نشانهدستور بررسیعلت محتمل
Node آماده نیستkubectl describe node minikubeDriver، Runtime یا کمبود منابع
Pod در Pending ماندهkubectl describe pod نام-podمنابع ناکافی یا مشکل Scheduling
ImagePullBackOffkubectl describe pod نام-podنام Image، Registry یا شبکه
CrashLoopBackOffkubectl 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 محافظت کنید.
  • داشبورد و API Server را روی اینترنت عمومی منتشر نکنید.
  • منابع CPU و Memory و Health Check را پیش از نزدیک‌شدن به Production تعریف کنید.

چه زمانی کافی نیست؟

برای یادگیری، توسعه و آزمایش Manifest عالی است، اما Production به طراحی جداگانه برای High Availability، شبکه، Storage پایدار، Backup، Upgrade، Observability، RBAC و مدیریت Secret نیاز دارد. موفق‌بودن برنامه روی یک Node محلی اثبات آمادگی Production نیست.

چک‌لیست پایان تمرین

  1. kubectl get nodes یک Node در وضعیت Ready نشان می‌دهد.
  2. دو Pod برنامه Running و Ready هستند.
  3. Service دارای Endpoint است.
  4. URL برنامه در مرورگر پاسخ می‌دهد.
  5. با حذف یک Pod، Deployment نمونه جایگزین می‌سازد.
  6. Scale به سه Replica انجام می‌شود.
  7. تاریخچه Rollout قابل مشاهده است.
  8. با minikube stop کلاستر بدون حذف داده متوقف می‌شود.

جمع‌بندی

موتور اجرای کانتینر نیست؛ لایه‌ای برای هماهنگ‌کردن Workloadها و حفظ وضعیت مطلوب است. با می‌توانید چرخه اصلی Deployment، Pod، Service، Scale و Rollout را بدون تهیه سرور واقعی تمرین کنید. پس از تسلط بر این مسیر، سراغ ConfigMap، Secret، Probe، Resource Limit، Ingress و RBAC بروید.

همین امروز کلاستر محلی را بساز، Manifest نمونه را اجرا کن و عمداً یک Pod را حذف کن تا خودترمیمی را ببینی.

منابع رسمی