درک Skaffold

۱. اهداف

Skaffold ابزاری است که گردش کار ساخت، انتشار و استقرار برنامه شما را مدیریت می‌کند. می‌توانید از Skaffold برای پیکربندی آسان یک فضای کاری توسعه محلی، ساده‌سازی حلقه توسعه داخلی خود و ادغام با ابزارهای دیگر مانند Kustomize و Helm برای کمک به مدیریت مانیفست‌های Kubernetes خود استفاده کنید.

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

شما:

  • پیکربندی و فعال‌سازی Skaffold برای توسعه محلی
  • ساخت و اجرای یک برنامه ساده golang
  • مدیریت استقرار برنامه‌های محلی با Skaffold
  • مانیفست‌ها را رندر کنید و برنامه خود را مستقر کنید

۲. قبل از شروع

آماده سازی فضای کاری شما

  1. با مراجعه به آدرس زیر، ویرایشگر Cloud Shell را باز کنید:
https://shell.cloud.google.com

کوکی‌های شخص ثالث را مجاز کنید. روی «سایت کار نمی‌کند» و سپس «اجازه دادن به کوکی‌ها» کلیک کنید.

7b702066a2135a3d.png

3394f82132eb4fd4.png

  1. اگر قبلاً این کار را نکرده‌اید، در پنجره ترمینال، منبع برنامه را با دستور زیر کلون کنید:
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
  1. به دایرکتوری مخزن کلون شده بروید:
cd software-delivery-workshop/labs/understanding-skaffold/getting-started
  1. با اجرای دستور زیر، فضای کاری Cloud Shell خود را روی دایرکتوری فعلی تنظیم کنید:
cloudshell workspace .

آماده سازی پروژه شما

  1. با اجرای دستور زیر، مطمئن شوید که پروژه Google Cloud شما به درستی تنظیم شده است:
gcloud config set project {{project-id}}

۳. شروع کار با اسکفولد

  1. دستور زیر را برای ایجاد فایل پیکربندی سطح بالای Skaffold، skaffold.yaml ، اجرا کنید:
cat <<EOF > skaffold.yaml
apiVersion: skaffold/v2beta21
kind: Config
metadata:
  name: getting-started-kustomize
build:
  tagPolicy:
    gitCommit:
      ignoreChanges: true
  artifacts:
  - image: skaffold-kustomize
    context: app
    docker:
      dockerfile: Dockerfile
deploy:
  kustomize:
    paths:
    - overlays/dev
profiles:
- name: staging
  deploy:
    kustomize:
      paths:
      - overlays/staging
- name: prod
  deploy:
    kustomize:
      paths:
      - overlays/prod
EOF
  1. فایل skaffold.yaml در پنل IDE باز کنید. این فایل پیکربندی سطح بالا است که خط لوله Skaffold را تعریف می‌کند.

به قالب YAML شبیه به Kubernetes و بخش‌های زیر در YAML توجه کنید:

  • build
  • deploy
  • profiles

این بخش‌ها نحوه ساخت و استقرار برنامه و همچنین پروفایل‌های مربوط به هر هدف استقرار را تعریف می‌کنند.

می‌توانید اطلاعات بیشتر در مورد لیست کامل مراحل Skaffold را در مستندات مراحل خط لوله Skaffold مطالعه کنید.

۴. ساختن

بخش build شامل پیکربندی است که نحوه ساخت برنامه را تعریف می‌کند. در این حالت می‌توانید پیکربندی نحوه مدیریت تگ‌های git و همچنین بخش artifacts را که تصاویر کانتینر تشکیل‌دهنده برنامه را تعریف می‌کند، مشاهده کنید.

علاوه بر این، در این بخش می‌توانید مرجع Dockerfile مورد استفاده برای ساخت تصاویر را مشاهده کنید. Skaffold علاوه بر این از ابزارهای ساخت دیگری مانند Jib ، Maven ، Gradle ، Cloud-native Buildpacks ، Bazel و اسکریپت‌های سفارشی پشتیبانی می‌کند. می‌توانید اطلاعات بیشتر در مورد این پیکربندی را در مستندات Skaffold Build مطالعه کنید.

۵. استقرار

بخش deploy شامل پیکربندی است که نحوه استقرار برنامه را تعریف می‌کند. در این مورد می‌توانید مثالی از استقرار پیش‌فرض را مشاهده کنید که Skaffold را برای استفاده از ابزار Kustomize پیکربندی می‌کند.

ابزار Kustomize با ترکیب مجموعه‌ای از فایل‌های YAML کامپوننت‌های رایج (در دایرکتوری base ) با یک یا چند «پوشش» که معمولاً با یک یا چند هدف استقرار - معمولاً dev ، test ، staging و production یا موارد مشابه - مطابقت دارند، قابلیتی برای تولید مانیفست‌های Kubernetes فراهم می‌کند.

در این مثال می‌توانید دو لایه برای سه هدف dev ، staging و prod مشاهده کنید. لایه dev در طول توسعه محلی و لایه‌های staging و prod در هنگام استقرار با استفاده از Skaffold استفاده خواهند شد.

۶. پروفیل‌ها

بخش profiles شامل پیکربندی‌هایی است که پیکربندی‌های ساخت، آزمایش و استقرار را برای زمینه‌های مختلف تعریف می‌کند. زمینه‌های مختلف معمولاً محیط‌های متفاوتی در خط لوله استقرار برنامه شما هستند، مانند staging یا prod در این مثال. این بدان معناست که می‌توانید به راحتی مانیفست‌هایی را که محتوای آنها باید برای محیط‌های هدف مختلف متفاوت باشد، بدون تکرار پیکربندی تکراری، مدیریت کنید.

پیکربندی در بخش profiles می‌تواند هر موردی را از پیکربندی اصلی (مثلاً بخش‌های build ، test یا deploy ) جایگزین یا وصله کند.

به عنوان مثالی از این مورد، فایل overlays > prod > deployment.yaml را باز کنید. توجه داشته باشید که تعداد کپی‌ها برای برنامه در اینجا روی سه تنظیم شده است که پیکربندی پایه را نادیده می‌گیرد.

  1. فایل app > main.go زیر را در پنل IDE باز کنید. این یک برنامه ساده golang است که هر ثانیه یک رشته را در stdout می‌نویسد.
  2. توجه داشته باشید که برنامه همچنین نام غلاف Kubernetes که در آن اجرا می‌شود را نمایش می‌دهد.

مشاهده‌ی داکرفایل

  1. در پنل IDE، مسیر app > Dockerfile را باز کنید. این فایل شامل مجموعه‌ای از دستورالعمل‌ها برای ساخت تصویر کانتینر برنامه برای فایل main.go است و در فایل سطح بالای skaffold.yaml به آن ارجاع داده شده است.

۷. توسعه با Skaffold

پیکربندی محیط Kubernetes شما

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

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

Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
  1. دستور زیر را برای ایجاد فضاهای نام Kubernetes برای dev ، staging و prod اجرا کنید:
kubectl apply -f namespaces.yaml

شما باید خروجی زیر را ببینید:

namespace/dev created
namespace/staging created
namespace/prod created

استفاده از اسکفولد برای توسعه محلی

  1. دستور زیر را برای ساخت برنامه و استقرار آن در یک کلاستر محلی Kubernetes که در Cloud Shell اجرا می‌شود، اجرا کنید:
skaffold dev

شما باید فرآیند ساخت کانتینر برنامه را که ممکن است یک دقیقه طول بکشد، اجرا کنید و سپس خروجی برنامه هر ثانیه تکرار شود:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-dev-xxxxxxxxx-xxxxx

توجه داشته باشید که نام دقیق پاد با خروجی عمومی ارائه شده در بالا متفاوت خواهد بود.

ایجاد تغییرات در برنامه

اکنون که برنامه در خوشه محلی Kubernetes شما اجرا می‌شود، می‌توانید تغییراتی در کد ایجاد کنید و Skaffold به طور خودکار برنامه را در خوشه بازسازی و مجدداً مستقر می‌کند.

  1. فایل app > main.go را در پنل IDE باز کنید و رشته خروجی را تغییر دهید:
"Hello world from pod %s!\n"

به:

"Hello Skaffold world from pod %s!\n"

وقتی تغییر را اعمال کردید، باید ببینید که Skaffold تصویر را بازسازی کرده و آن را دوباره در کلاستر مستقر می‌کند، و تغییر در خروجی در پنجره ترمینال قابل مشاهده است.

  1. حالا، در فایل "app > main.go" در پنل IDE، خط زیر را تغییر دهید:
time.Sleep(time.Second * 1)

به

time.Sleep(time.Second * 10)

دوباره باید ببینید که برنامه بازسازی و مجدداً مستقر شده است، و خط خروجی هر 10 ثانیه یک بار ظاهر می‌شود.

ایجاد تغییرات در پیکربندی Kubernetes

در مرحله بعد، تغییری در پیکربندی Kubernetes ایجاد خواهید کرد و Skaffold بار دیگر به طور خودکار مجدداً مستقر خواهد شد.

  1. فایل base > deployment.yaml را در IDE باز کنید و خط زیر را تغییر دهید:
replicas: 1

به

replicas: 2

پس از استقرار مجدد برنامه، باید دو پاد در حال اجرا را مشاهده کنید که هر کدام نام متفاوتی خواهند داشت.

  1. حالا، همان خط را در فایل base > deployment.yaml به صورت زیر تغییر دهید:
replicas: 1

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

  1. در نهایت، در پنجره ترمینال، Ctrl-C را فشار دهید تا توسعه محلی Skaffold متوقف شود.

قطع انتشار

در مرحله بعد، با ساخت یک تصویر انتشار و استقرار آن در یک خوشه، یک انتشار ایجاد خواهید کرد.

  1. برای ساخت نسخه، دستور زیر را اجرا کنید:
skaffold build --file-output artifacts.json

این دستور (در صورت لزوم) تصویر نهایی را می‌سازد و جزئیات انتشار را در فایل artifacts.json خروجی می‌دهد.

اگر می‌خواهید از ابزاری مانند Cloud Deploy برای استقرار در کلاسترهای خود استفاده کنید، این فایل حاوی اطلاعات انتشار است. این بدان معناست که مصنوعات (یا مصنوعات) در مسیر اجرا تغییرناپذیر هستند.

  1. برای مشاهده محتوای فایل artifacts.json دستور زیر را اجرا کنید:
cat artifacts.json | jq

توجه داشته باشید که این فایل حاوی مرجعی به تصویری است که در استقرار نهایی استفاده خواهد شد.

استقرار به مرحله‌بندی

  1. دستور زیر را برای استقرار نسخه با استفاده از پروفایل staging اجرا کنید:
skaffold deploy --profile staging --build-artifacts artifacts.json --tail

پس از اتمام استقرار، باید خروجی مشابه زیر را از دو Pod مشاهده کنید:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-staging-xxxxxxxxxx-xxxxx!
  1. برای متوقف کردن خروجی Skaffold، در پنجره ترمینال Ctrl-C را فشار دهید.
  2. برای مشاهده‌ی اجرای برنامه در کلاستر، دستور زیر را اجرا کنید:
kubectl get all --namespace staging

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

استقرار به مرحله تولید

  1. اکنون دستور زیر را برای استقرار نسخه با استفاده از پروفایل prod اجرا کنید:
skaffold deploy --profile prod --build-artifacts artifacts.json --tail

پس از اتمام استقرار، باید خروجی مشابه زیر را از سه Pod مشاهده کنید:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-prod-xxxxxxxxxx-xxxxx!
  1. برای متوقف کردن خروجی Skaffold، در پنجره ترمینال Ctrl-C را فشار دهید.

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

  1. برای مشاهده‌ی اجرای برنامه در کلاستر، دستور زیر را اجرا کنید:
kubectl get all --namespace prod

باید خروجی‌ای مشابه خطوط زیر را ببینید که نشان‌دهنده‌ی استقرار prod هستند:

NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/skaffold-kustomize-prod   3/3     3            3           16m

همچنین باید سه غلاف برنامه در حال اجرا را ببینید.

NAME                                           READY   STATUS    RESTARTS   AGE
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m

۸. تبریک می‌گویم!

تبریک! شما آزمایشگاه Understanding Skaffold به پایان رساندید و یاد گرفتید که چگونه Skaffold را برای توسعه محلی و استقرار برنامه پیکربندی و استفاده کنید.

قدم بعدی چیست؟

برای کسب اطلاعات بیشتر در مورد اسکفولد به ادامه مطلب مراجعه کنید:

پاکسازی

  1. برای خاموش کردن خوشه محلی، دستور زیر را اجرا کنید:
minikube delete