چگونه از Minikube برای توسعه و آزمایش محلی Kubernetes استفاده کنیم

چگونه از Minikube برای توسعه و آزمایش محلی Kubernetes استفاده کنیم

Kubernetes یک سیستم متن‌باز برای ارکستراسیون کانتینرهاست که جهت خودکارسازی استقرار، مقیاس‌پذیری، و مدیریت نرم‌افزار طراحی شده است. این سیستم در سطح سازمانی بسیار محبوب شده است زیرا امکان مقیاس‌پذیری افقی منابع سرور را فراهم می‌کند. بسیاری از ارائه‌دهندگان خدمات ابری، از جمله DigitalOcean، راه‌حل‌های Kubernetes مدیریت‌شده‌ی خود را ارائه می‌دهند.

از آن‌جایی که استقرار Kubernetes معمولاً به چندین سرور نیاز دارد، توسعه و آزمایش پشته‌ی Kubernetes پیش از استقرار در محیط عملیاتی می‌تواند بسیار منابع‌بر باشد. به همین دلیل، توسعه‌دهندگان Kubernetes پروژه‌ی همراهی به نام minikube را حفظ کرده‌اند که می‌تواند با چارچوبی مانند Docker کار کند تا یک خوشه‌ی Kubernetes را روی یک ماشین منفرد شبیه‌سازی کند.

در این آموزش، minikube را روی یک رایانه‌ی محلی یا سرور راه دور نصب خواهید کرد. همچنین به داشبورد داخلی Kubernetes دسترسی خواهید یافت تا خوشه‌تان را در یک مرورگر کاوش کنید. پس از راه‌اندازی خوشه، یک اپلیکیشن آزمایشی را استقرار خواهید داد و بررسی می‌کنید که چگونه از طریق minikube به آن دسترسی داشته باشید. در بخش پایانی این آموزش، بررسی خواهید کرد که چگونه از Minikube در کنار خوشه‌های Kubernetes راه دور با استفاده از پروفایل‌های پیکربندی استفاده کنید.

اگر به‌دنبال یک سرویس میزبانی Kubernetes مدیریت‌شده هستید، می‌توانید سرویس مدیریت‌شده‌ی ساده‌ی ما برای رشد را بررسی کنید.

پیش‌نیازها


برای دنبال کردن این آموزش، به موارد زیر نیاز دارید:

  • آشنایی با مفاهیم Kubernetes. لطفاً برای جزئیات بیشتر به مقاله‌ی «مقدمه‌ای بر Kubernetes» مراجعه کنید.
  • چارچوب کانتینر Docker نصب‌شده در محیط Windows، Mac، یا Linux که از آن minikube را اجرا می‌کنید. اگر در محیط Linux کار نمی‌کنید، به مستندات Docker برای مراحل نصب مراجعه کنید. اگر از Docker در Linux استفاده می‌کنید، اطمینان حاصل کنید که آن را طوری پیکربندی کرده‌اید که بدون دسترسی sudo کار کند.
  • مدیر بسته‌ی Homebrew. Homebrew را می‌توان روی macOS یا محیط‌های Linux نصب کرد. اگر از Windows استفاده می‌کنید، می‌توانید Homebrew را در WSL نصب کنید.
  • حداقل ۲ CPU، ۲ گیگابایت حافظه، و ۲۰ گیگابایت فضای دیسک در محیطی که می‌خواهید Minikube را نصب کنید.

مرحله ۱.نصب و اجرای Minikube


می‌توانید minikube را از طریق مدیر بسته‌ی Homebrew نصب کنید:

brew install minikube

خروجی:

==> Installing minikube
==> Pouring minikube--1.25.2.x86_64_linux.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
  /home/sammy/.linuxbrew/etc/bash_completion.d
==> Summary
🍺  /home/sammy/.linuxbrew/Cellar/minikube/1.25.2: 9 files, 70.0MB

نکته: شروع کار با minikube در Windows دارای نکاتی است. این ابزار در WSL2 (نسخه فعلی Windows Subsystem for Linux) کار می‌کند، اما باید طوری پیکربندی شود که از Docker به‌جای backend پیش‌فرض خود استفاده کند. برای این منظور، باید Docker را با پشتیبانی از WSL2 نصب کرده و سپس پس از نصب minikube طبق این مستند، دستور زیر را اجرا کنید:

minikube config set driver docker

برای شروع استفاده از minikube، می‌توانید دستور start را اجرا کنید. این دستور به‌طور خودکار یک خوشه‌ی Kubernetes محلی با استفاده از چند کانتینر Docker و نسخه‌ای پایدار از Kubernetes ایجاد می‌کند:

minikube start

این فرایند کمی زمان می‌برد و خروجی‌ای مشابه زیر ایجاد می‌کند که نشان می‌دهد kubectl برای شما پیکربندی شده است.

خروجی:

👍  Starting control plane node minikube in cluster minikube
🚜  Pulling base image ...
💾  Downloading Kubernetes v1.23.1 preload ...
    > preloaded-images-k8s-v16-v1...: 504.42 MiB / 504.42 MiB  100.00%
    > gcr.io/k8s-minikube/kicbase: 378.98 MiB / 378.98 MiB  100.00%
🔥  Creating docker container (CPUs=2, Memory=1987MB) ...
🐳  Preparing Kubernetes v1.23.1 on Docker 20.10.12 ...
    ▪ kubelet.housekeeping-interval=5m
    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
🔎  Verifying Kubernetes components...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: default-storageclass, storage-provisioner
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

نکته: اگر می‌خواهید minikube را با نسخه‌ای غیر پیش‌فرض از Kubernetes برای بررسی سازگاری اجرا کنید، می‌توانید از گزینه‌ی --kubernetes-version در دستور start استفاده کنید، مانند:

minikube start --kubernetes-version v1.2.3

نصب minikube از طریق Homebrew همچنین ابزار kubectl را فراهم می‌کند، که ابزار اصلی برای مدیریت خوشه‌های Kubernetes از طریق خط فرمان است. اکنون می‌توانید مانند هر خوشه‌ی Kubernetes دیگری از دستور زیر برای فهرست کردن همه‌ی پادهای در حال اجرا در خوشه‌تان استفاده کنید:

kubectl get pods -A

آرگومان -A پادهای در حال اجرا در تمام نام‌فضاها را برمی‌گرداند.

خروجی:

NAMESPACE     NAME                               READY   STATUS    RESTARTS      AGE
kube-system   coredns-64897985d-ttwl9            1/1     Running   0             46s
kube-system   etcd-minikube                      1/1     Running   0             57s
kube-system   kube-apiserver-minikube            1/1     Running   0             61s
kube-system   kube-controller-manager-minikube   1/1     Running   0             57s
kube-system   kube-proxy-ddtgd                   1/1     Running   0             46s
kube-system   kube-scheduler-minikube            1/1     Running   0             57s
kube-system   storage-provisioner                1/1     Running   1 (14s ago)   54s

اکنون یک خوشه‌ی Kubernetes به‌صورت محلی در حال اجرا دارید که می‌توانید با ابزارهای معمول Kubernetes مانند kubectl با آن کار کنید. در مراحل بعدی این آموزش، یاد خواهید گرفت چگونه از برخی قابلیت‌های اضافی minikube برای نظارت و تغییر پیکربندی خوشه‌ی محلی استفاده کنید.

بخش ۲.دسترسی به داشبورد Kubernetes

Minikube به‌صورت پیش‌فرض داشبورد Kubernetes را پیاده‌سازی می‌کند. شما می‌توانید از داشبورد Kubernetes برای پایش سلامت خوشه یا برای استقرار دستی اپلیکیشن‌ها استفاده کنید. اگر Minikube را به‌صورت محلی نصب کرده‌اید، می‌توانید با اجرای دستور زیر به داشبورد دسترسی پیدا کنید:

minikube dashboard

این دستور به‌صورت خودکار داشبورد را راه‌اندازی کرده، یک پورت از داخل خوشه Kubernetes به خارج از آن منتقل (forward) می‌کند تا بتوانید مستقیماً به آن دسترسی پیدا کنید، و سپس یک مرورگر وب را به سمت آن پورت محلی باز می‌کند.

 داشبورد Kubernetes
داشبورد Kubernetes

فوروارد کردن پورت (port forwarding) ترمینالی که در آن اجرا می‌شود را تا زمانی که فعال است مسدود خواهد کرد؛ بنابراین احتمالاً ترجیح می‌دهید آن را در یک پنجره ترمینال جدید اجرا کنید تا بتوانید به کار خود ادامه دهید. برای توقف ایمن چنین فرآیندهایی، می‌توانید از ترکیب کلیدهای Ctrl+C استفاده کنید.

اگر Minikube را روی یک سرور راه دور اجرا می‌کنید که دسترسی آسانی به مرورگر وب در آن ندارید، می‌توانید دستور minikube dashboard را با گزینه‌ی --url اجرا کنید. این گزینه فرآیند فوروارد کردن پورت را آغاز کرده و یک URL در اختیار شما قرار می‌دهد که می‌توانید برای دسترسی به داشبورد استفاده کنید، بدون این‌که مرورگر به‌صورت مستقیم باز شود:

minikube dashboard --url

خروجی:

🤔  Verifying dashboard health ...
🚀  Launching proxy ...
🤔  Verifying proxy health ...
http://127.0.0.1:34197/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/

به شماره پورتی که توسط این دستور برگردانده می‌شود توجه داشته باشید، چراکه این شماره در سیستم شما متفاوت خواهد بود.

با این حال، پیکربندی امنیتی پیش‌فرض Kubernetes اجازه نخواهد داد که این URL روی یک ماشین راه دور قابل دسترسی باشد. شما نیاز دارید که یک تونل SSH برای دسترسی به URL داشبورد ایجاد کنید. برای ساخت تونل از ماشین محلی به سرورتان، دستور ssh را با گزینه‌ی -L اجرا کنید. شماره پورتی را که از خروجی فرآیند فوروارد به‌دست آوردید به همراه آدرس IP سرور راه دور وارد کنید:

ssh -L 34197:127.0.0.1:34197 sammy@your_server_ip

سپس باید بتوانید در مرورگر به داشبورد در این آدرس دسترسی داشته باشید:

http://127.0.0.1:34197/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/

اکنون که راه‌های بیشتری برای کار با minikube شبیه به یک خوشه‌ی کامل Kubernetes را مشاهده کردید، در مرحله‌ی بعد، یک اپلیکیشن نمونه را مستقر کرده و به آن دسترسی خواهید داشت تا بررسی کنید که خوشه‌ی Minikube شما به‌درستی کار می‌کند.

بخش ۳.استقرار و تست یک اپلیکیشن نمونه

شما می‌توانید از دستور kubectl برای استقرار یک اپلیکیشن آزمایشی در خوشه Minikube خود استفاده کنید. دستور زیر، یک اپلیکیشن نمونه Kubernetes را دانلود و مستقر می‌کند – در این مثال، اپلیکیشن hello-app گوگل:

kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0

این دستور، یک دیپلویمنت ایجاد می‌کند که درون خوشه‌تان با نام web شناخته می‌شود و از یک ایمیج راه دور به نام hello-app روی gcr.io (رجیستری کانتینر گوگل) استفاده می‌کند.

در مرحله بعد، دیپلویمنت web را به‌صورت یک سرویس Kubernetes با استفاده از گزینه --type=NodePort و پورت 8080 در معرض نمایش قرار دهید:

kubectl expose deployment web --type=NodePort --port=8080

اکنون می‌توانید با دستور زیر بررسی کنید که سرویس در حال اجراست یا نه:

kubectl get service web

به یاد داشته باشید که NodePort در Kubernetes از پورت‌های تصادفی استفاده می‌کند، بنابراین خروجی شما متفاوت خواهد بود.

خروجی نمونه:

NAME   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
web    NodePort   10.109.254.242   <none>        8080:31534/TCP   10s

اکنون می‌توانید با استفاده از minikube یک URL دریافت کنید که از خارج کانتینر قابل دسترسی باشد. این URL به شما اجازه می‌دهد به سرویس hello-app که روی پورت 8080 داخل خوشه در حال اجراست، دسترسی داشته باشید. اگر minikube را به‌صورت محلی اجرا می‌کنید، نیازی به انجام فوروارد پورت به‌صورت دستی نخواهید داشت.

برای دریافت URL اپلیکیشن نمونه، دستور زیر را اجرا کنید:

minikube service web --url

خروجی نمونه:

http://192.168.49.2:31534

اکنون می‌توانید سعی کنید به این URL متصل شوید. برای انجام این کار از برنامه خط فرمان curl استفاده می‌کنید که ابزار محبوبی برای ارسال انواع درخواست‌های وب است. به‌طور کلی، اگر می‌خواهید بررسی کنید که آیا یک اتصال خاص باید در مرورگر کار کند یا نه، ابتدا آن را با curl تست کنید.

curl http://192.168.49.2:31534

خروجی:

Hello, world!
Version: 1.0.0
Hostname: web-746c8679d4-j92tb

اگر minikube را روی ماشین محلی اجرا می‌کنید، همچنین می‌توانید این URL را در مرورگر باز کنید و باید همان متن ساده را ببینید. اگر روی سرور راه دور هستید، می‌توانید دوباره از تونل SSH مانند مرحله دوم استفاده کنید تا این خروجی را در مرورگر مشاهده کنید.

اکنون یک مثال مینیمال از اپلیکیشنی دارید که از طریق minikube مستقر شده است. معمولاً در خوشه‌های Kubernetes تولیدی (production)، دسترسی دقیق‌تری برای نقاط دسترسی وب فراهم می‌شود، اما این موضوع وابسته به قابلیت‌های خاص minikube نیست و شما در اینجا اصول اولیه را مشاهده کردید.

در مرحله‌ی بعدی، از برخی ابزارهای داخلی Minikube برای تغییر مقادیر پیش‌فرض پیکربندی خوشه خود استفاده خواهید کرد.

بخش ۴.مدیریت منابع و سیستم فایل Minikube

دستور minikube چندین زیردستور (subcommand) برای کمک به مدیریت خوشه در اختیار شما قرار می‌دهد. برای مثال، اگر زمانی نیاز داشتید مقدار حافظه (RAM) موجود در خوشه‌تان را تغییر دهید، می‌توانید با استفاده از minikube config مقدار پیش‌فرض را تغییر دهید. به‌طور پیش‌فرض، این مقدار بر حسب مگابایت است؛ بنابراین دستور زیر معادل اختصاص دادن ۴ گیگابایت حافظه است:

minikube config set memory 4096

خروجی:

❗  These changes will take effect upon a minikube delete and then a minikube start

خروجی اشاره می‌کند که برای اعمال این تغییر، باید خوشه را مجدداً مستقر (redeploy) کنید.

نکته: اگرچه خوشه‌های Kubernetes تولیدی معمولاً هنگام تغییر منابعی مثل حافظه نیاز به مستقرسازی مجدد ندارند، اما نباید انتظار داشته باشید که تغییرات پایدار را مستقیماً داخل یک خوشه در حال اجرا انجام دهید – فقط باید در فایل‌های پیکربندی این تغییرات اعمال شود. بنابراین، مستقرسازی مجدد خوشه minikube باید بدون مشکل انجام شود.

برای حذف و راه‌اندازی مجدد خوشه:

minikube delete

خروجی:

🔥  Deleting "minikube" in docker ...
🔥  Deleting container "minikube" ...
🔥  Removing /home/sammy/.minikube/machines/minikube ...
💀  Removed all traces of the "minikube" cluster.

و سپس:

minikube start

Minikube همچنین این قابلیت را فراهم می‌کند که به‌صورت موقت یک دایرکتوری از سیستم فایل محلی خود را در خوشه سوار (mount) کنید. برای صادر کردن (export) یک دایرکتوری به خوشه، از دستور minikube mount استفاده کنید.

ساختار این دستور به صورت local_path:minikube_host_path است. بخش local_path مسیر دایرکتوری محلی شماست که می‌خواهید در خوشه سوار شود، و بخش minikube_host_path محلی در کانتینر یا ماشین مجازی minikube است که می‌خواهید به فایل‌ها از آنجا دسترسی داشته باشید.

مثال زیر، دایرکتوری خانگی ($HOME) شما را در مسیر /host خوشه minikube سوار می‌کند:

minikube mount $HOME:/host

خروجی:

📁  Mounting host path /home/sammy into VM as /host ...
    ▪ Mount type:
    ▪ User ID:      docker
    ▪ Group ID:     docker
    ▪ Version:      9p2000.L
    ▪ Message Size: 262144
    ▪ Options:      map[]
    ▪ Bind Address: 192.168.49.1:43605
🚀  Userspace file server: ufs starting
✅  Successfully mounted /home/sammy to /host

📌  NOTE: This process must stay alive for the mount to be accessible ...

این قابلیت زمانی مفید است که بخواهید ورودی یا خروجی‌هایی مثل لاگ‌ها را از خوشه minikube ذخیره کنید.

مشابه فوروارد پورت، این فرآیند به‌صورت مسدود‌کننده (blocking) در ترمینال اجرا می‌شود تا زمانی که با Ctrl+C آن را متوقف کنید.

در مرحله بعد (و نهایی) از این آموزش، یاد می‌گیرید که چگونه به‌طور مؤثر بین خوشه‌ی محلی minikube و یک خوشه‌ی Kubernetes راه دور سوییچ کنید.

بخش ۵.(اختیاری) کار با چند خوشه Kubernetes

برای اجرای چند خوشه‌ی Kubernetes به‌صورت محلی، Minikube از پروفایل‌های متعدد استفاده می‌کند. به‌عنوان مثال، اگر بخواهید هم‌زمان با چند نسخه‌ی مختلف از Kubernetes کار کرده و آن‌ها را آزمایش کنید، می‌توانید چند خوشه‌ی Kubernetes ایجاد کرده و با استفاده از فلگ --profile یا -p بین آن‌ها جابه‌جا شوید.

اگر قصد دارید مدتی با یک پروفایل خاص کار کنید، دستور minikube profile به شما این امکان را می‌دهد که پروفایل پیش‌فرض مورد نظر خود را تنظیم کنید تا نیازی به مشخص‌کردن آن با هر دستور با استفاده از --profile نداشته باشید.

برای شروع Minikube با یک پروفایل جدید، می‌توانید از دستور start با فلگ -p استفاده کنید:

minikube start -p new-profile

سپس، برای تغییر پروفایل فعال Minikube از دستور زیر استفاده کنید:

minikube profile new-profile

خروجی:

✅  minikube profile was successfully set to new-profile

برای مشاهده‌ی پروفایل فعلی‌ای که در حال استفاده از آن هستید، می‌توانید از دستور get profile استفاده کنید:

minikube config get profile

خروجی:

new-profile

چه از چند پروفایل استفاده کنید یا نه، Minikube به‌صورت خودکار فایل‌های پیکربندی را در مسیرهای پیش‌فرض ایجاد می‌کند، جایی که kubectl و سایر ابزارهای Kubernetes می‌توانند آن‌ها را بخوانند. برای مثال، اگر دستور زیر را اجرا کنید:

kubectl get nodes

دستور بالا، پیکربندی خوشه‌ی Minikube شما را تحلیل کرده و گره (node) مربوطه را نشان خواهد داد:

خروجی نمونه:

NAME       STATUS   ROLES                  AGE     VERSION
minikube   Ready    control-plane,master   3h18m   v1.23.1

هنگام اجرای kubectl، می‌توانید مسیر فایل پیکربندی kubeconfig متفاوتی را نسبت به مسیر پیش‌فرض ~/.kube/config مشخص کنید. در این حالت، kubectl از اعتبارنامه‌های (credentials) خوشه‌ی تعریف‌شده در آن فایل استفاده خواهد کرد. برای مثال، اگر یک فایل پیکربندی دیگر با نام remote-kubeconfig.yaml دارید، می‌توانید گره‌های آن خوشه را با دستور زیر دریافت کنید:

kubectl --kubeconfig=remote-kubeconfig.yaml get nodes

این گره‌ها، گره‌هایی هستند که در محیط راه دور اجرا می‌شوند:

خروجی:

NAME                   STATUS   ROLES    AGE    VERSION
pool-xr6rvqbox-uha8f   Ready    <none>   2d2h   v1.21.9
pool-xr6rvqbox-uha8m   Ready    <none>   2d2h   v1.21.9
pool-xr6rvqbox-uha8q   Ready    <none>   2d2h   v1.21.9

Kubernetes به‌طور کلی طوری طراحی شده است که با یک فایل پیکربندی در هر خوشه کار کند، به‌طوری که بتوان آن را هنگام اجرای دستورات به kubectl و سایر ابزارها داد. اگرچه امکان ترکیب چند فایل پیکربندی وجود دارد، ولی بهترین روش به نحوه‌ی استفاده‌ی شما از Kubernetes بستگی دارد و انجام این کار ضروری نیست. همچنین ممکن است بخواهید استفاده از Krew، مدیر بسته‌ای برای افزونه‌های kubectl را بررسی کنید.

نتیجه‌گیری

در این آموزش، شما Minikube را نصب کردید و داشبورد داخلی Kubernetes را برای نظارت و استقرار اپلیکیشن‌ها پیکربندی نمودید. همچنین برخی از بهترین شیوه‌ها برای کار هم‌زمان با یک نمونه‌ی تستی محلی Minikube و یک نمونه‌ی Kubernetes راه دور را با استفاده از پروفایل‌های Minikube و فلگ --kubeconfig بررسی کردید.

تست و ارزیابی پیکربندی‌های Kubernetes با استفاده از Minikube در محیط محلی می‌تواند کمک بزرگی باشد برای این‌که تشخیص دهید آیا آماده‌ی استقرار Kubernetes در محیط production هستید یا نه.

در مرحله‌ی بعد، شاید بخواهید یاد بگیرید که چگونه برخی اپلیکیشن‌های مقیاس‌پذیر را روی Kubernetes مستقر کنید، مانند ArgoCD برای استقرار مستمر (Continuous Deployment) یا TOBS برای نظارت و مشاهد‌ه‌پذیری (observability).

 

منبع DigitalOcean

۹۰
۱۴۰۴/۵/۱۲