استقرار حجم کاری فضای محرمانه با MIGها با استفاده از مقیاس‌بندی خودکار، ترمیم خودکار و به‌روزرسانی‌های تصویر

۱. مرور کلی

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

در این آزمایشگاه کد، شما یاد خواهید گرفت که چگونه یک بار کاری فضای محرمانه (Confidential Space) را روی یک گروه نمونه مدیریت‌شده (MIG) مستقر کنید. همچنین یاد خواهید گرفت که چگونه با استفاده از بررسی‌های سلامت، خودکارسازی (autohealing)، مقیاس‌بندی خودکار بر اساس استفاده از CPU و به‌روزرسانی‌های مداوم برای تصاویر سیستم عامل و بارهای کاری را فعال کنید.

فرآیندهای نشان داده شده در این آزمایشگاه کد باید به شما در راه‌اندازی فضای محرمانه امن و آماده برای تولید برای استقرارهای حیاتی و طولانی مدت کمک کند.

آنچه یاد خواهید گرفت

  • نحوه ایجاد یک الگوی نمونه تخصصی برای فضای محرمانه.
  • نحوه استفاده از Google Compute Engine و نحوه پیکربندی MIGها و گروه‌های نمونه
  • نحوه ایجاد یک قانون فایروال و بررسی سلامت برای بهبود خودکار.
  • نحوه پیکربندی یک MIG منطقه‌ای با الگو و بررسی سلامت.
  • نحوه تنظیم مقیاس‌بندی خودکار برای MIG.
  • نحوه تنظیم به‌روزرسانی‌های تصویر سیستم عامل با یک کلیک با استفاده از اسکریپت‌نویسی در MIGها برای تصاویر بار کاری و همچنین انتشار تصاویر جدید سیستم عامل برای Confidential Space

آنچه نیاز دارید

  • یک پروژه گوگل کلود با قابلیت پرداخت.
  • آشنایی با ویرایشگرهای متن، استقرارهای Docker و اسکریپت‌نویسی Bash
  • ابزار خط فرمان gcloud نصب و احراز هویت شد.
  • آشنایی اولیه با موتور محاسباتی، فضای محرمانه، IAM، ماشین‌های مجازی محرمانه، فناوری کانتینر، مخازن راه دور، حساب‌های سرویس، Cloud Run و Cloud Scheduler
  • یک تصویر کانتینر بار کاری فضای محرمانه که قبلاً ساخته شده و به رجیستری مصنوعات ارسال شده است.

۲. نحوه کار فضای محرمانه با MIGها

استفاده از یک گروه نمونه مدیریت‌شده (MIG) برای استقرار بار کاری فضای محرمانه، یک برنامه امن را قوی‌تر، مقیاس‌پذیرتر و آسان‌تر برای اجرا می‌کند.

نیازهای امنیتی و عملیاتی یک سرویس تولیدی به طور منطقی بین دو مؤلفه تقسیم می‌شود. فضای محرمانه با اجرای بار کاری در یک محیط بسیار ایزوله، رمزگذاری شده و دارای گواهی به نام محیط اجرای مطمئن (TEE)، امنیت لازم را فراهم می‌کند. در مقابل، MIGها قابلیت‌های عملیاتی ضروری مورد نیاز برای اجرای برنامه امن در مقیاس بزرگ، مشابه Kubernetes، را فراهم می‌کنند. MIGها خطرات ذاتی اجرای یک بار کاری حیاتی بر روی یک ماشین مجازی واحد را که می‌تواند به طور بالقوه کند یا مستعد خرابی باشد، از بین می‌برند. این ترکیب هم حفاظت از داده‌ها و هم قابلیت اطمینان سیستم را تضمین می‌کند. این راه‌حل، دسترسی بالا و خودترمیمی را تضمین می‌کند زیرا بار کاری در چندین ماشین مجازی در یک استخر اجرا می‌شود. اگر یک ماشین مجازی از کار بیفتد، سرویس به دلیل تعادل بار و وجود نمونه‌های باقی مانده، کاملاً کاربردی باقی می‌ماند.

علاوه بر این، MIGها از بررسی‌های سلامت قابل تنظیم برای نظارت مداوم بر وضعیت عملیاتی ماشین‌های مجازی استفاده می‌کنند. اگر یک نمونه ناسالم تشخیص داده شود، MIG به طور خودکار آن را با یک ماشین مجازی جدید و سالم جایگزین می‌کند و در نتیجه عملکرد مداوم را تضمین می‌کند.

MIGها همچنین با قابلیت مقیاس‌بندی خودکار ، مقیاس‌پذیری مؤثری را برای کاربران ارائه می‌دهند. این قابلیت، روشی خودکار برای مدیریت ظرفیت بدون دخالت دستی فراهم می‌کند و نیاز به افزودن یا حذف انعطاف‌پذیر ظرفیت بر اساس میزان استفاده را برآورده می‌سازد.

در نهایت، MIGها از طریق Rolling Updates، به‌روزرسانی‌های بدون قطعی (Zero-Downtime) را فعال می‌کنند. یکی از مزایای کلیدی، قابلیت « ارتقاء با یک کلیک » برای تصویر سیستم عامل Confidential Space OS یا تصویر کانتینر برنامه (یا هر دو) است، بدون اینکه هیچ گونه قطعی سرویسی ایجاد شود. MIG این تغییر را با جایگزینی تدریجی نمونه‌های قدیمی‌تر با نمونه‌های جدیدتر که تصویر به‌روزرسانی شده را اجرا می‌کنند، مدیریت می‌کند و در طول استقرار، دسترسی مداوم را تضمین می‌کند. توجه داشته باشید که ممکن است برنامه شما برای پشتیبانی از این نوع ارتقاء تدریجی، نیاز به سازگاری با نسخه‌های قبلی داشته باشد.

۳. راه‌اندازی منابع ابری

قبل از اینکه شروع کنی

  1. یک پروژه گوگل کلود راه‌اندازی کنید. برای اطلاعات بیشتر در مورد ایجاد یک پروژه گوگل کلود، لطفاً به آزمایشگاه کد «اولین پروژه گوگل خود را راه‌اندازی و پیمایش کنید» مراجعه کنید. می‌توانید برای کسب اطلاعات بیشتر در مورد نحوه بازیابی شناسه پروژه و تفاوت آن با نام پروژه و شماره پروژه، به بخش ایجاد و مدیریت پروژه‌ها مراجعه کنید.
  2. فعال کردن صورتحساب برای پروژه‌هایتان
  3. در یکی از پوسته‌های ابری (Cloud Shell) پروژه گوگل خود، متغیرهای محیطی مورد نیاز پروژه را مطابق شکل زیر تنظیم کنید.
export  CURRENT_PROJECT_ID=<Google Cloud project id of current project>
  1. API محاسبات محرمانه و API های زیر را برای پروژه خود فعال کنید.
gcloud config set project $CURRENT_PROJECT_ID
gcloud services enable \
cloudapis.googleapis.com \
container.googleapis.com \
artifactregistry.googleapis.com \
confidentialcomputing.googleapis.com \
compute.googleapis.com \
logging.googleapis.com \
run.googleapis.com \
cloudscheduler.googleapis.com
  1. در پروژه ابری گوگل کلود خود، Cloud Shell را روی مخزن گیت‌هاب Codelab در فضای محرمانه کپی کنید و از دستور زیر برای دریافت اسکریپت‌های مناسب مورد نیاز برای تکمیل این codelab استفاده کنید.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  1. دایرکتوری را برای گروه نمونه codelab به دایرکتوری scripts تغییر دهید.
cd confidential-space/codelabs/mig_cs_codelab/scripts
  1. خط شناسه پروژه را در config_env.sh به‌روزرسانی کنید تا شناسه پروژه انتخابی شما را منعکس کند.
  2. متغیرهای از پیش موجود را تنظیم کنید. نام منابع را با استفاده از این متغیرها لغو کنید.
  • شما می‌توانید متغیرهای زیر را با نام‌های منابع ابری موجود تنظیم کنید. اگر متغیر تنظیم شده باشد، از منابع ابری موجود مربوطه در پروژه استفاده می‌شود. اگر تنظیم نشده باشد، نام منبع ابری از اسکریپت config_env.sh می‌آید.
  1. اسکریپت config_env.sh را اجرا کنید تا نام متغیرهای باقی‌مانده برای این پروژه بر اساس شناسه پروژه برای نام منابع، مقادیری را تعیین کند.
source config_env.sh
  1. مجوزهای پروژه را اضافه کنید. مجوزها را می‌توان با دنبال کردن جزئیات موجود در صفحه وب اعطای نقش IAM اضافه کرد.

برای این پروژه به مجوزهای زیر نیاز دارید

  • نویسنده ثبت آثار باستانی
  • مدیر زمان‌بندی ابری
  • نماینده خدمات محاسباتی
  • کاربر با حجم کاری محاسبات محرمانه
  • نویسنده گزارش
  • توسعه‌دهنده‌ی کلود ران
  • اجرای ابری Invoker
gcloud config set project $CURRENT_PROJECT_ID

# Add Artifact Registry Writer role
gcloud projects add-iam-policy-binding $CURRENT_PROJECT_ID --member="serviceAccount:${CURRENT_WORKLOAD_SERVICE_ACCOUNT}" --role='roles/artifactregistry.writer'

# Add Confidential Space Workload Userd
gcloud projects add-iam-policy-binding $CURRENT_PROJECT_ID --member="serviceAccount:${CURRENT_WORKLOAD_SERVICE_ACCOUNT}" --role='roles/confidentialcomputing.workloadUser'

# Add Logging Log Writer
gcloud projects add-iam-policy-binding $CURRENT_PROJECT_ID --member="serviceAccount:${CURRENT_WORKLOAD_SERVICE_ACCOUNT}" --role='roles/logging.logWriter'

# Add Cloud Run Developer
gcloud projects add-iam-policy-binding $CURRENT_PROJECT_ID --member="serviceAccount:${CURRENT_WORKLOAD_SERVICE_ACCOUNT}" --role='roles/run.developer'

# Add Cloud Run Invoker
gcloud projects add-iam-policy-binding $CURRENT_PROJECT_ID --member="serviceAccount:${CURRENT_WORKLOAD_SERVICE_ACCOUNT}" --role='roles/run.invoker'


# Add Cloud Scheduler Admin
gcloud projects add-iam-policy-binding $CURRENT_PROJECT_ID --member="serviceAccount:${CURRENT_WORKLOAD_SERVICE_ACCOUNT}" --role='roles/cloudscheduler.admin'
  1. به test_workload.py نگاه کنید
  • خروجی بار کاری را با بررسی کد منبع تأیید کنید، باید به سادگی نسخه فعلی بار کاری را چاپ کند.
  • وقتی برای اولین بار بار کاری خود را به CS منتقل می‌کنیم و خروجی را بررسی می‌کنیم، باید عبارت "version A" را چاپ شده ببینیم.

۴. تنظیم حجم کار

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

مراحل ایجاد بار کاری

  1. برای ایجاد حجم کار، دستور create_workload.sh را اجرا کنید. این اسکریپت:
  • رجیستری مصنوعات متعلق به پروژه را ایجاد می‌کند که در آن حجم کار منتشر خواهد شد.
  • کد را می‌سازد و آن را در یک تصویر داکر بسته‌بندی می‌کند. برای اطلاعات بیشتر به پیکربندی dockerfile مربوطه مراجعه کنید.
  • ایمیج داکر را در Artifact Registry متعلق به پروژه منتشر می‌کند.
  • به حساب سرویس <نام حساب سرویس شما> مجوزهای خواندن برای رجیستری مصنوع <نام مخزن رجیستری مصنوع> را اعطا می‌کند.

۵. راه‌اندازی یک الگوی نمونه و MIG

مراحل ایجاد الگوی نمونه

ابتدا باید یک الگوی نمونه (Instance Template ) ایجاد کنید. این الگو، طرح اولیه‌ی مورد نیاز گروه نمونه‌ی مدیریت‌شده (MIG) برای آماده‌سازی و اجرای بارهای کاری شما در فضای محرمانه (Confidential Space) است.

الگوی نمونه (Instance Template) ضروری است زیرا تمام پارامترهای تخصصی را تعریف می‌کند:

  • نوع ماشین: در این مثال ما از یک نوع ماشین ماشین مجازی محرمانه (مثلاً n2d-standard-2 ) استفاده می‌کنیم که از فناوری محاسبات محرمانه AMD SEV ( --confidential-compute-type=SEV ) پشتیبانی می‌کند.
  • تصویر سیستم عامل ماشین مجازی: ما از پروژه confidential-space-images و خانواده تصاویر confidential-space-debug برای دریافت آخرین تصویر سیستم عامل فضای محرمانه استفاده می‌کنیم.
  • توجه: ما در این راهنما از تصویر اشکال‌زدایی (debug image) برای تسهیل عیب‌یابی آسان‌تر استفاده می‌کنیم. برخلاف تصویر تولید، نسخه اشکال‌زدایی، ماشین مجازی را پس از اتمام بار کاری شما در حال اجرا نگه می‌دارد و امکان دسترسی به SSH را برای آزمایش فراهم می‌کند. برای استقرارهای تولید با استفاده از داده‌های حساس دنیای واقعی، باید به خانواده تصویر تولید تغییر دهید.
  • مرجع حجم کار: خط مورد نیاز tee-image-reference در فراداده شامل تصویر کانتینر خاص (حجم کار برنامه شما) است که ماشین مجازی Confidential Space VM آن را اجرا خواهد کرد.

این تنظیمات تضمین می‌کند که هر ماشین مجازی ایجاد شده توسط MIG، یک فضای محرمانه با پیکربندی صحیح و آماده برای اجرای بار کاری شما باشد.

مراحل ایجاد گروه نمونه مدیریت‌شده

مرحله بعدی ایجاد گروه نمونه مدیریت‌شده (MIG) با استفاده از الگویی است که تعریف کرده‌اید. MIG ضروری است زیرا استقرار، مدیریت و مقیاس‌بندی چندین ماشین مجازی یکسان را خودکار می‌کند.

اسکریپت create_launch_mig.sh سه هدف اصلی را دنبال می‌کند:

۱. ایجاد MIG

  • دستور: gcloud compute instance-groups managed create ${CURRENT_MIG_NAME}
  • هدف: این دستور گروهی را ایجاد می‌کند که ماشین‌های مجازی شما را مدیریت خواهد کرد.
  • --size 3 : مشخص می‌کند که MIG باید در ابتدا ۳ نمونه از حجم کاری شما را ایجاد و نگهداری کند.
  • --template ${TEMPLATE_NAME} : نکته مهم این است که به Instance Template که قبلاً ایجاد شده است، ارجاع می‌دهد و تضمین می‌کند که هر 3 نمونه به عنوان ماشین‌های مجازی Confidential Space که کانتینر بار کاری tee-image-reference خاص شما را اجرا می‌کنند، پیکربندی شده‌اند.
  • --zone ${CURRENT_PROJECT_ZONE} : محل استقرار نمونه‌ها را مشخص می‌کند.

۲. دریافت شماره پروژه

  • دستور: PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)")
  • هدف: این اسکریپت شناسه عددی پروژه شما را دریافت می‌کند. این شماره اغلب برای ایجاد نقش‌ها و مجوزهای حساب سرویس، به ویژه برای نمایندگان سرویس تحت مدیریت گوگل، مورد نیاز است.

۳. مجوزهای IAM را اعطا کنید

  • دستور: gcloud projects add-iam-policy-binding --role="roles/compute.serviceAgent"
  • هدف: این مرحله نقش عامل سرویس موتور محاسباتی (Compute Engine Service Agent) را به حساب سرویس (Service Account) بار کاری شما ( ${SERVICE_ACCOUNT }) اعطا می‌کند. این مجوز مهم است زیرا به حساب سرویس اجازه می‌دهد تا از طرف سرویس موتور محاسباتی پروژه عمل کند - که اغلب برای ویژگی‌های خودکار MIG مانند مدیریت نمونه‌ها، راه‌اندازی شبکه و تعامل با سایر سرویس‌های Google Cloud ضروری است.

برای ایجاد گروه نمونه مدیریت‌شده، create_launch_mig.sh را اجرا کنید.

۶. مراحل فعال‌سازی Autohealing و Autoscaling

راه‌اندازی خوددرمانی

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

# 1. Create Health Check (TCP Port 22)
gcloud compute health-checks create tcp ${HEALTH_CHECK_NAME} \
  --port 22 \
  --check-interval 30s \
  --healthy-threshold 1 \
  --timeout 10s \
  --unhealthy-threshold 3 \
  --global

# 2. Allow Health Check Traffic (Firewall)
gcloud compute firewall-rules create allow-health-check \
    --allow tcp:22 \
    --source-ranges 130.211.0.0/22,35.191.0.0/16 \
    --network default \
    --project="${CURRENT_PROJECT_ID}" \ 

# 3. Apply to MIG
gcloud compute instance-groups managed update ${CURRENT_MIG_NAME} \
    --health-check ${HEALTH_CHECK_NAME} \
    --initial-delay 60 \
    --zone ${CURRENT_PROJECT_ZONE}

تنظیم مقیاس‌بندی خودکار

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

gcloud compute instance-groups managed set-autoscaling ${CURRENT_MIG_NAME} \
    --max-num-replicas 5 \
    --target-cpu-utilization 0.80 \
    --cool-down-period 90 \
    --zone ${CURRENT_PROJECT_ZONE}

۷. تأیید حجم کار و تنظیم به‌روزرسانی‌های تصویر

حجم کار را تأیید کنید

پس از اینکه گروه نمونه مدیریت‌شده (MIG) ماشین‌های مجازی را راه‌اندازی کرد، باید تأیید کنیم که بار کاری فضای محرمانه شما به درستی اجرا می‌شود.

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

gcloud compute instance-groups managed list-instances ${CURRENT_MIG_NAME} \
    --zone ${CURRENT_PROJECT_ZONE}

همچنین می‌توانید خروجی پورت سریال را برای آن نمونه خاص بررسی کنید تا گزارش حجم کار خود را ببینید.

# Replace <INSTANCE_NAME> with one of the names from the previous command
gcloud compute instances get-serial-port-output <INSTANCE_NAME> \
    --zone ${CURRENT_PROJECT_ZONE} \
    --port 1

تنظیم به‌روزرسانی‌های تصویر

در یک محیط عملیاتی، گروه نمونه مدیریت‌شده (MIG) شما باید به‌طور منظم به‌روزرسانی شود تا دو سناریوی متمایز را برطرف کند:

  1. به‌روزرسانی‌های حجم کار: انتشار نسخه جدیدی از کد برنامه شما (مثلاً به‌روزرسانی test_workload.py از نسخه ۱ به نسخه ۲).
  2. به‌روزرسانی‌های زیرساخت: گوگل در حال انتشار یک وصله امنیتی یا به‌روزرسانی برای سیستم‌عامل Confidential Space OS است. توجه داشته باشید که بهترین روش، دریافت آخرین نسخه CS Image حداقل به صورت ماهانه است.

از آنجا که ما الگوی نمونه خود را با یک پیوند تصویر پویا (.../images/family/...) و یک برچسب کانتینر پویا (:latest) پیکربندی کرده‌ایم، می‌توانیم هر دوی این سناریوها را با یک عملیات "Rolling Replace" مدیریت کنیم. این تضمین می‌کند که ناوگان ماشین‌های مجازی شما همیشه آخرین نسخه پشته را بدون هیچ گونه خرابی و بدون نیاز به ایجاد یک الگوی نمونه جدید برای هر تغییر جزئی اجرا می‌کنند.

اسکریپت Rolling Replace

در زیر پوشه update_images به فایل update_images_script.sh بروید. این اسکریپت یک Rolling Replace را فعال می‌کند که به تدریج هر ماشین مجازی موجود در گروه را از بین می‌برد و دوباره ایجاد می‌کند.

#!/bin/bash

# Initialize the template
gcloud compute instance-groups managed set-instance-template "${CURRENT_MIG_NAME}" \
--template=projects/"${PROJECT_ID}"/global/instanceTemplates/"${TEMPLATE_NAME}" \
--zone="${CURRENT_PROJECT_ZONE}" \
--project="${PROJECT_ID}"

# Trigger the rolling replace
gcloud compute instance-groups managed rolling-action replace "${CURRENT_MIG_NAME}" \
    --version=template="${TEMPLATE_NAME}" \
    --project="${PROJECT_ID}" \
    --zone="${CURRENT_PROJECT_ZONE}" \
    --max-surge=1 \
    --max-unavailable=0

# Wait for the update to complete
gcloud compute instance-groups managed wait-until --version-target-reached "${CURRENT_MIG_NAME}" \
    --zone="${CURRENT_PROJECT_ZONE}" \
    --project="${PROJECT_ID}"

برای این اسکریپت می‌توانیم به جای restart از replace استفاده کنیم.

  • یک Restart به سادگی دستگاه را مجدداً راه‌اندازی می‌کند. این کار دیسک سیستم عامل موجود را حفظ می‌کند، به این معنی که وصله‌های جدید سیستم عامل را دریافت نمی‌کند .
  • دستور Replace ماشین مجازی را حذف کرده و یک ماشین مجازی جدید از روی الگو ایجاد می‌کند. این کار سیستم را مجبور می‌کند تا جدیدترین ایمیج سیستم عامل Confidential Space را از خانواده جستجو کند و همچنین ایمیج کانتینر "آخرین" را از رجیستری دریافت کند.

–max-surge=1 : این به MIG اجازه می‌دهد تا به طور موقت ۱ ماشین مجازی اضافی بالاتر از اندازه هدف شما ایجاد کند. این یک ماشین مجازی جدید (به‌روزرسانی‌شده) را راه‌اندازی می‌کند و قبل از حذف یک ماشین مجازی قدیمی (منسوخ‌شده) منتظر می‌ماند تا سالم شود.

–max-unavailable=0 : این گزینه عدم خرابی را تضمین می‌کند. به MIG می‌گوید که مجاز به آفلاین کردن هیچ دستگاهی نیست ، مگر اینکه قبلاً با موفقیت یک جایگزین را نصب کرده باشد.

اسکریپت راه‌اندازی مجدد غلتان

در زیر دایرکتوری update_images اسکریپت دیگری به نام update_workload_image_script.sh وجود دارد. این اسکریپت یک Rolling Restart را فعال می‌کند، این روشی سریع‌تر است که صرفاً برای به‌روزرسانی حجم کار استفاده می‌شود. از آنجا که Confidential Space در هر بوت، تصویر کانتینر را از رجیستری دریافت می‌کند، یک راه‌اندازی مجدد برای به‌روزرسانی برنامه شما به :latest version بدون تغییر میزبان اصلی کافی است.

#!/bin/bash
# Reboots the existing VMs to refresh the container
gcloud compute instance-groups managed rolling-action restart "${CURRENT_MIG_NAME}" \
    --project="${PROJECT_ID}" \
    --zone="${CURRENT_PROJECT_ZONE}" \
    --max-surge=1 \
    --max-unavailable=0

# Wait for the update to complete
gcloud compute instance-groups managed wait-until --stable "${CURRENT_MIG_NAME}" \
    --zone="${CURRENT_PROJECT_ZONE}" \
    --project="${CURRENT_PROJECT_ID}"

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

ما می‌توانیم «ارتقاء با یک کلیک» را با شبیه‌سازی انتشار یک برنامه در دنیای واقعی آزمایش کنیم. ما کد بار کاری را تغییر می‌دهیم، آن را به رجیستری مصنوعات منتقل می‌کنیم، MIG را به‌روزرسانی می‌کنیم و تأیید می‌کنیم که نسخه جدید بدون هیچ گونه خرابی در حال اجرا است.

مرحله ۱: استقرار یک نسخه جدید از بار کاری

ابتدا، باید یک نسخه "جدید" از برنامه شما ایجاد کنیم.

  1. فایل محلی test_workload.py خود را باز کنید.
  2. دستور چاپ نسخه را از print("حجم کاری نسخه A") به print("حجم کاری نسخه B") تغییر دهید.
  3. با اجرای create_workload.sh، تصویر کانتینر را بازسازی و به Artifact Registry ارسال کنید. توجه داشته باشید که ما در حال ارسال به همان تگ (:latest) هستیم.

مرحله ۲: اجرای به‌روزرسانی رو به بالا

اسکریپت به‌روزرسانی که در بخش قبل ایجاد کردیم را اجرا کنید. این کار MIG را مجبور می‌کند تا هر ماشین مجازی را جایگزین کند و هش کانتینر جدید مرتبط با :latest را دریافت کند.

# Run your update script
./update_images/update_images_script.sh

صبر کنید تا اسکریپت کامل شود

مرحله ۳: تأیید به‌روزرسانی از طریق پورت سریال

پس از اتمام به‌روزرسانی، تأیید می‌کنیم که ماشین‌های مجازی جدید کد به‌روزرسانی‌شده را اجرا می‌کنند.

# Replace <INSTANCE_NAME> with one of the names from the previous command
gcloud compute instances get-serial-port-output <INSTANCE_NAME> \
    --zone ${CURRENT_PROJECT_ZONE} \
    --port 1

دریافت نام یک نمونه جدید:

gcloud compute instance-groups managed list-instances ${CURRENT_MIG_NAME} --zone ${CURRENT_PROJECT_ZONE}

لاگ‌ها را بررسی کنید:

# Replace <NEW_INSTANCE_NAME> with one of the names of the running VMs
gcloud compute instances get-serial-port-output <NEW_INSTANCE_NAME> \
    --zone ${CURRENT_PROJECT_ZONE} \
    --port 1

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

خروجی مورد انتظار: شما باید پیام لاگ به‌روزرسانی‌شده را مشاهده کنید که تأیید می‌کند استقرار با موفقیت انجام شده است:

... بار کاری نسخه B ...

مرحله ۴: تأیید پیکربندی زیرساخت (اختیاری)

همچنین می‌توانید با بررسی متادیتای Instance Template خود، تأیید کنید که این الگو به درستی پیکربندی شده است تا به‌روزرسانی‌های پویا را هم برای سیستم‌عامل و هم برای Workload دریافت کند.

برای مشاهده‌ی مرجع پویای کانتینر، دستور زیر را اجرا کنید:

gcloud compute instance-templates describe ${TEMPLATE_NAME} \
    | grep -A 1 tee-image-reference

نتیجه: شما باید تصویر کانتینر خود را که به :latest ختم می‌شود، ببینید.

  • پیامد: از آنجا که الگو به تگ اشاره می‌کند و نه به یک هش خاص، هر جایگزینی با عملکرد چرخشی با موفقیت جدیدترین کدی را که در مرحله 1 وارد کرده‌اید، دریافت می‌کند.

(اختیاری) به‌روزرسانی‌های خودکار

اگرچه به‌روزرسانی‌های دستی برای نسخه‌های اصلی مفید هستند، اما اغلب می‌خواهید ناوگان شما به‌طور خودکار آخرین وصله‌های امنیتی یا نسخه‌های استقرار منظم را بدون دخالت انسان دریافت کند.

ما می‌توانیم فرآیند «Rolling Replace» را با بسته‌بندی اسکریپت به‌روزرسانی خود در یک Cloud Run Job خودکار کنیم. برای این آزمایشگاه کد، آن را هر ۱۵ دقیقه یک بار اجرا می‌کنیم. در یک محیط عملیاتی، باید خیلی کمتر اجرا شود. بسته به نیاز کاربر، ممکن است آن را به صورت هفتگی یا ماهانه پیکربندی کنند.

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

ابتدا، باید فایل update_images_script.sh خود (که شامل منطق gcloud ... rolling-action replace است) را در یک کانتینر داکر بسته‌بندی کنیم تا بتواند در فضای ابری اجرا شود.

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

دستور زیر را اجرا کنید:

# Build and Push the "Updater" Container
# This packages your update logic into a docker image
./update_images/deploy_docker_script_image.sh

این چه کاری انجام می‌دهد:

  • این فایل update_images_script.sh را از دایرکتوری update_images/ دریافت می‌کند.
  • این یک تصویر داکر حاوی Google Cloud SDK و اسکریپت شما ایجاد می‌کند.
  • این دستور، تصویر را به ‎${CURRENT_PROJECT_REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY}/update-script:latest‎ منتقل می‌کند.

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

حالا باید به گوگل کلود بگوییم که این کانتینر را به صورت دوره‌ای اجرا کند. ما از Cloud Run Jobs برای اجرای کانتینر و از Cloud Scheduler برای فعال کردن آن استفاده می‌کنیم.

اسکریپت پیکربندی زمان‌بندی را اجرا کنید:

# Create the Cloud Run Job and the Scheduler Trigger
./create_configs/create_schedule_job.sh

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

  1. یک کار ابری اجرا ایجاد می‌کند: یک کار با نام mig-updater-job تعریف می‌کند که کانتینری را که به تازگی ارسال کرده‌ایم، اجرا می‌کند.
  2. یک محرک زمان‌بندی ایجاد می‌کند: یک کار زمان‌بندی ابری تنظیم می‌کند تا هر ۱۵ دقیقه به رابط برنامه‌نویسی کاربردی کار Cloud Run برسد.
# (Snippet from create_schedule_job.sh for reference)
# The schedule is set to run every 15 minutes for testing purposes
gcloud scheduler jobs create http ${SCHEDULER_NAME} \
    --schedule "*/15 * * * *" \
    --uri "https://${CURRENT_PROJECT_REGION}-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/${PROJECT_ID}/jobs/${JOB_NAME}:run" \
    --http-method POST \
    --oauth-service-account-email ${SERVICE_ACCOUNT}

مرحله ۳: تأیید خودکارسازی

لازم نیست ۱۵ دقیقه برای آزمایش آن صبر کنید. می‌توانید زمان‌بندی را مجبور کنید که فوراً اجرا شود تا خط لوله تأیید شود.

  1. اجرای اجباری کار:
gcloud scheduler jobs run ${SCHEDULER_NAME} --location ${CURRENT_PROJECT_REGION}
  1. بررسی اجرا: به کنسول Cloud Run > Jobs بروید. باید شروع اجرای جدیدی را ببینید.
  2. بررسی MIG: دستور gcloud compute instance-groups managed list-instances ${CURRENT_MIG_NAME} را اجرا کنید. خواهید دید که با شروع به‌روزرسانی غلتان توسط job، نمونه‌ها وارد حالت RECREATING می‌شوند.

چرا ۱۵ دقیقه؟ ما برای این آزمایشگاه کد، زمان‌بندی را روی */۱۵ * * * * تنظیم کرده‌ایم تا بتوانید نتایج را به سرعت مشاهده کنید. در یک محیط تولید واقعی، احتمالاً این زمان‌بندی را به صورت روزانه (مثلاً ۳ * * * برای ساعت ۳ بامداد) یا هفتگی تغییر می‌دهید.

۸. تمیز کردن

اسکریپت پاکسازی cleanup.sh می‌تواند برای پاکسازی منابعی که به عنوان بخشی از این آزمایشگاه کد ایجاد کرده‌ایم، استفاده شود. به عنوان بخشی از این پاکسازی، منابع زیر حذف خواهند شد:

  • گروه نمونه مدیریت‌شده (${CURRENT_MIG_NAME}) و ماشین‌های مجازی زیربنایی آن.
  • الگوی نمونه (${TEMPLATE_NAME}).
  • بررسی سلامت و قوانین فایروال (${HEALTH_CHECK_NAME}).
  • مخزن ثبت آثار باستانی (${REPOSITORY}).
  • حساب کاربری سرویس (اگر برای این آزمایشگاه یک حساب کاربری اختصاصی ایجاد کرده‌اید).

اگر کاوش شما تمام شد، لطفاً با دنبال کردن این دستورالعمل‌ها، حذف پروژه خود را در نظر بگیرید: خاموش کردن (حذف) پروژه‌ها .

تبریک می‌گویم

تبریک می‌گویم، شما با موفقیت آزمایشگاه کد را به پایان رساندید!

شما یاد گرفتید که چگونه با استفاده از گروه‌های نمونه مدیریت‌شده (MIG) به طور ایمن حجم کاری فضای محرمانه را مقیاس‌بندی کنید. شما با موفقیت Autohealing را برای بازیابی از خرابی‌ها، Autoscaling را برای مدیریت افزایش ناگهانی ترافیک پیکربندی کردید و به‌روزرسانی‌های Zero-Downtime را هم برای تصویر سیستم عامل فضای محرمانه و هم برای کانتینر حجم کاری خود انجام دادید.

بعدش چی؟

آزمایشگاه‌های کد بیشتری برای فضای محرمانه ببینید:

مطالعه بیشتر