مهاجرت یک وب سایت یکپارچه به میکروسرویس ها در موتور Google Kubernetes

۱. مقدمه

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

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

برخی از معایب در مقایسه با مونولیت‌ها عبارتند از:

  • از آنجا که یک برنامه مبتنی بر میکروسرویس، شبکه‌ای از سرویس‌های مختلف است که اغلب به روش‌هایی که آشکار نیستند با هم تعامل دارند، پیچیدگی کلی سیستم تمایل به رشد دارد.
  • برخلاف بخش‌های داخلی یک سیستم یکپارچه، میکروسرویس‌ها از طریق شبکه ارتباط برقرار می‌کنند. در برخی شرایط، این می‌تواند به عنوان یک نگرانی امنیتی تلقی شود. Istio این مشکل را با رمزگذاری خودکار ترافیک بین میکروسرویس‌ها حل می‌کند.
  • به دلیل تأخیر بین سرویس‌ها، دستیابی به همان سطح عملکرد مشابه با رویکرد یکپارچه می‌تواند دشوار باشد.
  • رفتار سیستم شما توسط یک سرویس واحد ایجاد نمی‌شود، بلکه توسط بسیاری از آنها و تعاملات آنها ایجاد می‌شود. به همین دلیل، درک نحوه رفتار سیستم شما در محیط عملیاتی (قابلیت مشاهده آن) دشوارتر است. Istio راه حلی برای این مشکل نیز هست.

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

برای این آزمایش، ما یک برنامه یکپارچه موجود را در یک خوشه Google Kubernetes Engine مستقر خواهیم کرد، سپس آن را به میکروسرویس‌ها تجزیه خواهیم کرد!

نمودار معماری میکروسرویس‌های ما

ما با تقسیم کردن برنامه یکپارچه خود به سه میکروسرویس، یکی یکی، شروع خواهیم کرد. میکروسرویس‌ها شامل سفارشات، محصولات و Frontend هستند. ما برای هر میکروسرویس با استفاده از Cloud Build که از داخل Cloud Shell فعال می‌شود، یک تصویر Docker می‌سازیم. سپس میکروسرویس‌های خود را با استفاده از LoadBalancer از نوع سرویس Kubernetes، روی Google Kubernetes Engine (GKE) مستقر و در معرض نمایش قرار می‌دهیم. ما این کار را برای هر سرویس انجام می‌دهیم و همزمان آنها را از برنامه یکپارچه خود بازسازی می‌کنیم. در طول این فرآیند، هم برنامه یکپارچه و هم میکروسرویس‌های ما تا انتها در حال اجرا خواهند بود، زمانی که می‌توانیم برنامه یکپارچه خود را حذف کنیم.

636a2d58588b2b87.png

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

  • چگونه یک برنامه‌ی یکپارچه (مونولیت) را به میکروسرویس‌ها تجزیه کنیم؟
  • نحوه ایجاد یک خوشه موتور گوگل کوبرنتیز
  • نحوه ایجاد یک تصویر داکر
  • نحوه استقرار تصاویر داکر در کوبرنتیز

پیش‌نیازها

  • یک حساب کاربری پلتفرم گوگل کلود با دسترسی مدیریتی برای ایجاد پروژه‌ها یا یک پروژه با نقش مالک پروژه
  • درک اولیه از داکر و کوبرنتیز

۲. تنظیمات محیطی

تنظیم محیط خودتنظیم

اگر از قبل حساب گوگل (جیمیل یا برنامه‌های گوگل) ندارید، باید یکی ایجاد کنید . وارد کنسول پلتفرم ابری گوگل ( console.cloud.google.com ) شوید و یک پروژه جدید ایجاد کنید:

53dad2cefdae71da.png

تصویر از تاریخ 2016-02-10 12:45:26.png

شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه‌های Google Cloud (نام بالا قبلاً گرفته شده و برای شما کار نخواهد کرد، متاسفیم!). بعداً در این آزمایشگاه کد به آن PROJECT_ID گفته خواهد شد.

در مرحله بعد، برای استفاده از منابع Google Cloud و فعال کردن API موتور کانتینر ، باید صورتحساب را در کنسول توسعه‌دهندگان فعال کنید .

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

کاربران جدید پلتفرم ابری گوگل واجد شرایط دریافت یک دوره آزمایشی رایگان ۳۰۰ دلاری هستند.

پوسته ابری گوگل

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

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

  1. برای فعال کردن Cloud Shell از کنسول Cloud، کافیست روی Activate Cloud Shell کلیک کنید. fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (فقط چند لحظه طول می‌کشد تا آماده شود و به محیط متصل شود).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

اسکرین شات 2017-06-14 ساعت 10.13.43 PM.png

پس از اتصال به Cloud Shell، باید ببینید که از قبل احراز هویت شده‌اید و پروژه از قبل روی PROJECT_ID شما تنظیم شده است.

gcloud auth list

خروجی دستور

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

خروجی دستور

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

به دنبال PROJECT_ID خود هستید؟ بررسی کنید که در مراحل راه‌اندازی از چه شناسه‌ای استفاده کرده‌اید یا آن را در داشبورد Cloud Console جستجو کنید:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqA BYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell همچنین برخی از متغیرهای محیطی را به طور پیش‌فرض تنظیم می‌کند که ممکن است هنگام اجرای دستورات بعدی مفید باشند.

echo $GOOGLE_CLOUD_PROJECT

خروجی دستور

<PROJECT_ID>
  1. در نهایت، منطقه پیش‌فرض و پیکربندی پروژه را تنظیم کنید.
gcloud config set compute/zone us-central1-f

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

۳. کلون کردن مخزن منبع

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

دستورات زیر را اجرا کنید تا مخزن git را به نمونه Cloud Shell خود کپی کنید و به دایرکتوری مناسب بروید. ما همچنین وابستگی‌های NodeJS را نصب خواهیم کرد تا بتوانیم قبل از استقرار، برنامه یکپارچه خود را آزمایش کنیم. اجرای این اسکریپت ممکن است چند دقیقه طول بکشد.

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

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

۴. ایجاد یک خوشه GKE

حالا که محیط توسعه‌دهنده‌ی فعال خود را دارید، به یک کلاستر Kubernetes نیاز داریم تا برنامه‌ی یکپارچه و در نهایت میکروسرویس‌های خود را در آن مستقر کنیم! قبل از اینکه بتوانیم یک کلاستر ایجاد کنیم، باید مطمئن شویم که APIهای مناسب فعال هستند. دستور زیر را اجرا کنید تا API کانتینرها فعال شود و بتوانیم از موتور Google Kubernetes استفاده کنیم:

gcloud services enable container.googleapis.com

حالا ما آماده‌ایم تا کلاستر خود را ایجاد کنیم! دستور زیر را اجرا کنید تا یک کلاستر GKE به نام fancy-cluster با ۳ گره ایجاد شود.

gcloud container clusters create fancy-cluster --num-nodes 3

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

gcloud compute instances list

خروجی:

NAME                                          ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
gke-fancy-cluster-default-pool-ad92506d-1ng3  us-east4-a  n1-standard-1               10.150.0.7   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4fvq  us-east4-a  n1-standard-1               10.150.0.5   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4zs3  us-east4-a  n1-standard-1               10.150.0.6   XX.XX.XX.XX    RUNNING

همچنین می‌توانید خوشه Kubernetes و اطلاعات مرتبط با آن را در کنسول Google Cloud مشاهده کنید. روی دکمه منو در بالا سمت چپ کلیک کنید، به پایین بروید تا به Kubernetes Engine برسید و روی Clusters کلیک کنید. باید خوشه خود را با نام fancy-cluster ببینید.

795c794b03c5d2b0.png

6b394dfb8a6031f2.png

تبریک! شما اولین کلاستر Kubernetes خود را ایجاد کردید!

۵. پیاده‌سازی برنامه‌ی یکپارچه‌ی موجود

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

cd ~/monolith-to-microservices
./deploy-monolith.sh

دسترسی به مونولیت

برای یافتن آدرس IP خارجی برای برنامه یکپارچه ما، دستور زیر را اجرا کنید.

kubectl get service monolith

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

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
monolith     10.3.251.122    203.0.113.0     80:30877/TCP     3d

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

<pending> چند دقیقه صبر کنید و دوباره امتحان کنید.

پس از اینکه آدرس IP خارجی را برای برنامه‌ی یکپارچه‌ی خود تعیین کردید، آن را کپی کنید. مرورگر خود را به این URL (مانند http://203.0.113.0) هدایت کنید تا بررسی کنید که آیا برنامه‌ی یکپارچه‌ی شما قابل دسترسی است یا خیر.

9ed25c3f0cbe62fa.png

شما باید صفحه خوشامدگویی برای وب‌سایت یکپارچه را درست مانند تصویر بالا ببینید. صفحه خوشامدگویی یک صفحه استاتیک است که بعداً توسط میکروسرویس Frontend ارائه می‌شود. اکنون وب‌سایت یکپارچه شما به طور کامل روی Kubernetes اجرا شده است!

۶. انتقال سفارشات به میکروسرویس

اکنون که وب‌سایت یکپارچه موجود خود را روی GKE اجرا می‌کنیم، می‌توانیم هر سرویس را به یک میکروسرویس تقسیم کنیم. معمولاً، باید یک تلاش برنامه‌ریزی برای تقسیم سرویس‌ها به بخش‌های کوچک‌تر، معمولاً حول بخش‌های خاصی از برنامه مانند دامنه تجاری، انجام شود. برای اهداف نمایشی، ما یک مثال ساده ایجاد کرده‌ایم و هر سرویس را حول دامنه تجاری، سفارشات، محصولات و Frontend تقسیم کرده‌ایم. کد قبلاً منتقل شده است و ما بر ساخت و استقرار سرویس‌ها در Google Kubernetes Engine (GKE) تمرکز خواهیم کرد.

ایجاد سفارشات جدید در میکروسرویس

اولین سرویسی که بررسی خواهیم کرد، سرویس Orders است. ما از کدبیس جداگانه ارائه شده استفاده خواهیم کرد و یک کانتینر داکر جداگانه برای این سرویس ایجاد خواهیم کرد.

ایجاد کانتینر داکر با Google Cloud Build

از آنجایی که ما قبلاً کدبیس را برای شما منتقل کرده‌ایم، اولین قدم ما ایجاد یک کانتینر داکر از سرویس Order با استفاده از Google Cloud Build خواهد بود.

معمولاً باید یک رویکرد دو مرحله‌ای را در پیش بگیرید که شامل ساخت یک کانتینر داکر و ارسال آن به یک رجیستری برای ذخیره تصویر برای GKE جهت دریافت از آن است. اما می‌توانیم کار را آسان‌تر کنیم، می‌توانیم از Google Cloud Build برای ساخت کانتینر داکر و قرار دادن تصویر در رجیستری کانتینر گوگل کلود با یک دستور واحد استفاده کنیم! این به ما امکان می‌دهد با صدور یک دستور واحد، تصویر خود را بسازیم و به رجیستری کانتینر منتقل کنیم. برای مشاهده فرآیند دستی ایجاد یک فایل داکر و ارسال آن، می‌توانید به اینجا مراجعه کنید.

Google Cloud Build فایل‌ها را از دایرکتوری فشرده کرده و آنها را به یک مخزن ذخیره‌سازی ابری گوگل منتقل می‌کند. سپس فرآیند ساخت، تمام فایل‌ها را از مخزن گرفته و از Dockerfile برای اجرای فرآیند ساخت Docker استفاده می‌کند. از آنجایی که ما پرچم --tag را با میزبان gcr.io برای تصویر Docker مشخص کرده‌ایم، تصویر Docker حاصل به رجیستری کانتینر ابری گوگل منتقل می‌شود.

دستورات زیر را برای ساخت کانتینر داکر و قرار دادن آن در رجیستری کانتینر گوگل اجرا کنید:

cd ~/monolith-to-microservices/microservices/src/orders
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/orders:1.0.0 .

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

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                  IMAGES                              STATUS
1ae295d9-63cb-482c-959b-bc52e9644d53  2019-08-29T01:56:35+00:00  33S       gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz  gcr.io/<PROJECT_ID>/orders:1.0.0  SUCCESS

برای مشاهده تاریخچه ساخت یا تماشای فرآیند به صورت زنده، می‌توانید به کنسول Google Cloud بروید. روی دکمه منو در بالا سمت چپ کلیک کنید و به پایین بروید تا به Tools → Cloud Build برسید و روی History کلیک کنید. در اینجا می‌توانید لیستی از تمام ساخت‌های قبلی خود را مشاهده کنید، فقط باید یکی باشد که تازه ایجاد کرده‌اید.

4c753ede203255f6.png

اگر روی شناسه ساخت کلیک کنید، می‌توانید تمام جزئیات مربوط به آن ساخت، از جمله خروجی گزارش را مشاهده کنید.

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

6e88ed1643dfe629.png

استقرار کانتینر در GKE

حالا که وب‌سایت خود را کانتینرایز کرده‌ایم و کانتینر خود را به رجیستری کانتینر گوگل (Google Container Registry) منتقل کرده‌ایم، وقت آن رسیده که آن را در Kubernetes مستقر کنیم!

Kubernetes برنامه‌ها را به صورت Pods نمایش می‌دهد، که واحدهایی هستند که یک کانتینر (یا گروهی از کانتینرهای متصل به هم) را نشان می‌دهند. Pod کوچکترین واحد قابل استقرار در Kubernetes است. در این آموزش، هر Pod فقط شامل کانتینر میکروسرویس‌های شما می‌شود.

برای استقرار و مدیریت برنامه‌ها در یک کلاستر GKE، باید با سیستم مدیریت کلاستر Kubernetes ارتباط برقرار کنید. معمولاً این کار را با استفاده از ابزار خط فرمان kubectl از داخل Cloud Shell انجام می‌دهید.

ابتدا یک منبع Deployment ایجاد خواهیم کرد. Deployment چندین کپی از برنامه شما، به نام replicas، را مدیریت می‌کند و آنها را برای اجرا روی گره‌های جداگانه در خوشه شما زمان‌بندی می‌کند. در این حالت، Deployment فقط یک Pod از برنامه شما را اجرا خواهد کرد. Deployments با ایجاد یک ReplicaSet این امر را تضمین می‌کند. ReplicaSet مسئول اطمینان از اجرای همیشگی تعداد replicaهای مشخص شده است.

دستور kubectl create deployment که در زیر آمده است، باعث می‌شود Kubernetes یک Deployment با نام orders روی کلاستر شما با ۱ replica ایجاد کند.

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

kubectl create deployment orders --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/orders:1.0.0

تأیید استقرار

برای تأیید اینکه Deployment با موفقیت ایجاد شده است، دستور زیر را اجرا کنید، ممکن است چند لحظه طول بکشد تا وضعیت pod به Running تغییر کند:

kubectl get all

خروجی:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-779c8d95f5-dxnzl   1/1     Running   0          15h
pod/orders-5bc6969d76-kdxkk     1/1     Running   0          21s
NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
service/kubernetes   ClusterIP      10.39.240.1     <none>         443/TCP        19d
service/monolith     LoadBalancer   10.39.241.130   34.74.209.57   80:30412/TCP   15h
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1/1     1            1           15h
deployment.apps/orders     1/1     1            1           21s
NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-779c8d95f5   1         1         1       15h
replicaset.apps/orders-5bc6969d76     1         1         1       21s

این خروجی چندین چیز را به ما نشان می‌دهد. می‌توانیم Deployment فعلی، ReplicaSet با تعداد پاد دلخواه ۱ و پاد در حال اجرا را ببینیم. به نظر می‌رسد همه چیز با موفقیت ایجاد شده است!

کانتینر GKE را در معرض دید قرار دهید

ما برنامه خود را روی GKE مستقر کرده‌ایم، اما راهی برای دسترسی به آن در خارج از کلاستر نداریم. به طور پیش‌فرض، کانتینرهایی که روی GKE اجرا می‌کنید از طریق اینترنت قابل دسترسی نیستند، زیرا آدرس IP خارجی ندارند. شما باید صریحاً برنامه خود را از طریق یک منبع سرویس در معرض ترافیک اینترنت قرار دهید. یک سرویس، شبکه و پشتیبانی IP را برای Podهای برنامه شما فراهم می‌کند. GKE یک IP خارجی و یک متعادل‌کننده بار ( مشمول صورتحساب ) برای برنامه شما ایجاد می‌کند.

وقتی سرویس Orders خود را مستقر کردیم، آن را از طریق استقرار Kubernetes به صورت داخلی روی پورت ۸۰۸۱ قرار دادیم. برای اینکه این سرویس را به صورت خارجی در معرض نمایش قرار دهیم، باید یک سرویس Kubernetes از نوع LoadBalancer ایجاد کنیم تا ترافیک را از پورت ۸۰ به صورت خارجی به پورت داخلی ۸۰۸۱ برای سرویس Orders هدایت کند. دستور زیر را اجرا کنید تا وب‌سایت شما در اینترنت قرار گیرد:

kubectl expose deployment orders --type=LoadBalancer --port 80 --target-port 8081

دسترسی به سرویس

GKE آدرس IP خارجی را به منبع Service اختصاص می‌دهد - نه به Deployment. اگر می‌خواهید IP خارجی که GKE برای برنامه شما فراهم کرده است را پیدا کنید، می‌توانید سرویس را با دستور kubectl get service بررسی کنید:

kubectl get service orders

خروجی:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
orders       10.3.251.122    203.0.113.0     80:30877/TCP     3d

وقتی آدرس IP خارجی برنامه‌تان را تعیین کردید، آدرس IP را کپی کنید. آن را برای مرحله بعدی که برنامه یکپارچه‌مان را تغییر می‌دهیم تا به سرویس جدید Orders اشاره کند، ذخیره کنید!

پیکربندی مجدد مونولیت

از آنجایی که سرویس Orders را از برنامه‌ی یک‌تکه حذف کردیم، باید برنامه‌ی یک‌تکه را طوری تغییر دهیم که به میکروسرویس خارجی جدید Orders اشاره کند.

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

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

cd ~/monolith-to-microservices/react-app
nano .env.monolith

وقتی ویرایشگر باز می‌شود، فایل شما باید به شکل زیر باشد:

REACT_APP_ORDERS_URL=/service/orders
REACT_APP_PRODUCTS_URL=/service/products

عبارت REACT_APP_ORDERS_URL با فرمت جدید جایگزین کنید و آدرس IP میکروسرویس Orders خود را جایگزین کنید تا با موارد زیر مطابقت داشته باشد:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

برای ذخیره فایل در ویرایشگر نانو، کلیدهای CTRL+O ، ENTER و سپس CTRL+X را فشار دهید.

شما می‌توانید میکروسرویس جدید خود را با پیمایش URL که در این فایل تنظیم کرده‌اید، آزمایش کنید. صفحه وب باید یک پاسخ JSON از میکروسرویس Orders ما برگرداند.

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

بازسازی فایل‌های پیکربندی Monolith

npm run build:monolith

ایجاد کانتینر داکر با Google Cloud Build

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

استقرار کانتینر در GKE

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0

می‌توانید با رفتن به برنامه‌ی یکپارچه در مرورگر خود و رفتن به صفحه‌ی سفارشات، تأیید کنید که برنامه‌ی شما اکنون به میکروسرویس جدید Orders متصل است. تمام شناسه‌های سفارش باید به پسوند -MICROSERVICE ختم شوند، همانطور که در زیر نشان داده شده است:

۱cdd60bb0d4d1148.png

۷. انتقال محصولات به میکروسرویس

ایجاد محصولات جدید در میکروسرویس

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

ایجاد کانتینر داکر با Google Cloud Build

cd ~/monolith-to-microservices/microservices/src/products
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0 .

استقرار کانتینر در GKE

kubectl create deployment products --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0

کانتینر GKE را در معرض دید قرار دهید

kubectl expose deployment products --type=LoadBalancer --port 80 --target-port 8082

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

kubectl get service products

خروجی:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
products     10.3.251.122    203.0.113.0     80:30877/TCP     3d

آدرس IP را برای مرحله بعدی که برنامه یکپارچه خود را برای اشاره به میکروسرویس جدید Products پیکربندی مجدد می‌کنیم، ذخیره کنید.

پیکربندی مجدد مونولیت

از ویرایشگر نانو برای جایگزینی URL محلی با آدرس IP میکروسرویس‌های جدید Products ما استفاده کنید:

cd ~/monolith-to-microservices/react-app
nano .env.monolith

وقتی ویرایشگر باز می‌شود، فایل شما باید به شکل زیر باشد:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

عبارت REACT_APP_PRODUCTS_URL با فرمت جدید جایگزین کنید و آدرس IP میکروسرویس محصول خود را جایگزین کنید تا با آدرس زیر مطابقت داشته باشد:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=http://<PRODUCTS_IP_ADDRESS>/api/products

برای ذخیره فایل در ویرایشگر نانو، کلیدهای CTRL+O ، ENTER و سپس CTRL+X را فشار دهید.

شما می‌توانید میکروسرویس جدید خود را با پیمایش URL که در این فایل تنظیم کرده‌اید، آزمایش کنید. صفحه وب باید یک پاسخ JSON از میکروسرویس Products ما برگرداند.

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

بازسازی فایل‌های پیکربندی Monolith

npm run build:monolith

ایجاد کانتینر داکر با Google Cloud Build

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0 .

استقرار کانتینر در GKE

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0

می‌توانید با رفتن به برنامه‌ی یکپارچه در مرورگر خود و رفتن به صفحه‌ی محصولات، تأیید کنید که برنامه‌ی شما اکنون به میکروسرویس جدید Products متصل می‌شود. تمام نام‌های محصولات باید مانند تصویر زیر با پیشوند MS- شروع شوند:

5389b29f4b8c7c69.png

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

آخرین مرحله در فرآیند مهاجرت، انتقال کد Frontend به یک میکروسرویس و خاموش کردن سیستم یکپارچه است! پس از تکمیل این مرحله، ما با موفقیت سیستم یکپارچه خود را به معماری میکروسرویس‌ها منتقل کرده‌ایم!

ایجاد میکروسرویس جدید Frontend

بیایید همان روال دو مرحله قبل را برای ایجاد یک میکروسرویس frontend جدید دنبال کنیم.

قبلاً وقتی برنامه‌ی یکپارچه‌مان را بازسازی می‌کردیم، پیکربندی‌مان را به‌روزرسانی می‌کردیم تا به برنامه‌ی یکپارچه‌مان اشاره کند، اما حالا باید از همان پیکربندی برای میکروسرویس فرانت‌اندمان استفاده کنیم. دستورات زیر را اجرا کنید تا فایل‌های پیکربندی URL میکروسرویس‌هایمان را به کدبیس میکروسرویس فرانت‌اند کپی کنید:

cd ~/monolith-to-microservices/react-app
cp .env.monolith .env
npm run build

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

ایجاد کانتینر داکر با Google Cloud Build

cd ~/monolith-to-microservices/microservices/src/frontend
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0 .

استقرار کانتینر در GKE

kubectl create deployment frontend --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0

کانتینر GKE را در معرض دید قرار دهید

kubectl expose deployment frontend --type=LoadBalancer --port 80 --target-port 8080

حذف مونولیت

حالا که همه سرویس‌های ما به صورت میکروسرویس اجرا می‌شوند، می‌توانیم برنامه یکپارچه خود را حذف کنیم! توجه داشته باشید که در یک مهاجرت واقعی، این کار مستلزم تغییرات DNS و غیره نیز خواهد بود تا نام‌های دامنه موجود ما به میکروسرویس‌های جدید frontend برای برنامه ما اشاره کنند. دستورات زیر را برای حذف برنامه یکپارچه خود اجرا کنید:

kubectl delete deployment monolith
kubectl delete service monolith

کار خود را آزمایش کنید

برای تأیید صحت عملکرد همه چیز، آدرس IP قدیمی شما از سرویس یکپارچه‌تان نباید کار کند و آدرس IP جدید شما از سرویس frontend باید میزبان برنامه جدید باشد. برای مشاهده لیستی از تمام سرویس‌ها و آدرس‌های IP، از دستور زیر استفاده کنید:

kubectl get services

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

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
frontend     LoadBalancer   10.39.246.135   35.227.21.154    80:32663/TCP   12m
kubernetes   ClusterIP      10.39.240.1     <none>           443/TCP        18d
orders       LoadBalancer   10.39.243.42    35.243.173.255   80:32714/TCP   31m
products     LoadBalancer   10.39.250.16    35.243.180.23    80:32335/TCP   21m

پس از تعیین آدرس IP خارجی برای میکروسرویس Frontend خود، آدرس IP را کپی کنید. مرورگر خود را به این URL (مانند http://203.0.113.0) هدایت کنید تا بررسی کنید که آیا frontend شما قابل دسترسی است یا خیر. وب‌سایت شما باید مانند قبل از تقسیم یکپارچه به میکروسرویس‌ها باشد!

۹. پاکسازی

پس از آماده شدن، ساده‌ترین راه برای پاکسازی تمام فعالیت‌های انجام شده، حذف پروژه است. حذف پروژه، تمام منابعی را که در این Codelab ایجاد شده‌اند حذف می‌کند تا از عدم وقوع هزینه‌های مکرر غیرمنتظره اطمینان حاصل شود. دستور زیر را در Cloud Shell اجرا کنید، که در آن PROJECT_ID شناسه کامل پروژه است و نه فقط نام پروژه.

gcloud projects delete [PROJECT_ID]

با وارد کردن "Y" در صورت درخواست، حذف را تأیید کنید.

۱۰. تبریک می‌گویم!

شما با موفقیت برنامه یکپارچه خود را به میکروسرویس‌ها تقسیم کردید و آنها را در موتور Google Kubernetes مستقر کردید!

مراحل بعدی

برای کسب اطلاعات بیشتر در مورد Kubernetes، به codelab های زیر مراجعه کنید:

منابع اضافی