وب سایت خود را با Google Kubernetes Engine (GKE) استقرار، مقیاس و به روز رسانی کنید.

۱. مقدمه

اجرای وب‌سایت‌ها و برنامه‌ها سخت است.

اوضاع وقتی که نباید، خراب می‌شود، سرورها از کار می‌افتند، افزایش تقاضا باعث می‌شود منابع بیشتری مورد استفاده قرار گیرند و ایجاد تغییرات بدون از کارافتادگی، پیچیده و استرس‌زا است.

ابزاری را تصور کنید که می‌تواند به شما در انجام همه این کارها کمک کند و حتی به شما امکان خودکارسازی آنها را بدهد! با GKE، همه این کارها نه تنها ممکن است، بلکه آسان نیز هست! در این آزمایشگاه کد، شما نقش یک توسعه‌دهنده را که یک وب‌سایت تجارت الکترونیک را برای یک شرکت فرضی - Fancy Store - اداره می‌کند، بر عهده می‌گیرید. به دلیل مشکلات مربوط به مقیاس‌پذیری و قطعی‌ها، وظیفه دارید برنامه خود را روی GKE مستقر کنید!

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

  1. یک کلاستر GKE ایجاد کنید.
  2. یک کانتینر داکر ایجاد کنید.
  3. کانتینر را در GKE مستقر کنید.
  4. کانتینر را از طریق یک سرویس در معرض دید قرار دهید.
  5. کانتینر را به چندین کپی مقیاس‌بندی کنید.
  6. وب‌سایت را اصلاح کنید.
  7. نسخه جدیدی را بدون هیچ گونه خرابی منتشر کنید.

نمودار معماری

ddba666bd2b02d0d.png

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

  • نحوه ایجاد یک کلاستر GKE
  • نحوه ایجاد یک تصویر داکر
  • نحوه استقرار تصاویر داکر در کوبرنتیز
  • نحوه مقیاس‌بندی یک برنامه در Kubernetes
  • نحوه انجام به‌روزرسانی چرخشی در Kubernetes

پیش‌نیازها

  • یک حساب گوگل با دسترسی مدیریتی برای ایجاد پروژه‌ها یا پروژه‌ای با نقش مالک پروژه
  • آشنایی اولیه با داکر و کوبرنتیز (اگر آشنایی اولیه ندارید، لطفاً همین حالا داکر و کوبرنتیز را بررسی کنید.)

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

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

اگر از قبل حساب گوگل ندارید، باید یکی ایجاد کنید . وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید.

53dad2cefdae71da.png

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

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

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

پوسته ابری

در حالی که می‌توانید از راه دور با لپ‌تاپ خود Google Cloud و GKE را مدیریت کنید، برای codelab از Cloud Shell - یک محیط خط فرمان که در Cloud اجرا می‌شود - استفاده خواهید کرد.

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

  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

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

gcloud services enable container.googleapis.com

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

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

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

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

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

795c794b03c5d2b0.png

6b394dfb8a6031f2.png

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

۴. کپی کردن مخزن منبع

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

دستورات زیر را برای کپی کردن مخزن منبع به نمونه Cloud Shell خود و تغییر آن به دایرکتوری مناسب اجرا کنید. همچنین وابستگی‌های Node.js را نصب خواهید کرد تا بتوانید برنامه خود را قبل از استقرار آزمایش کنید.

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

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

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

cd ~/monolith-to-microservices/monolith
npm start

خروجی:

Monolith listening on port 8080!

شما می‌توانید با کلیک روی آیکون پیش‌نمایش وب در منوی Cloud Shell و انتخاب پیش‌نمایش روی پورت ۸۰۸۰، پیش‌نمایشی از برنامه خود را مشاهده کنید.

۵۸۶۹۷۳۸f0e9ec386.png

این باید یک پنجره جدید باز کند که در آن می‌توانید فروشگاه فانتزی خود را در حال کار ببینید!

9ed25c3f0cbe62fa.png

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

۵. ایجاد کانتینر داکر با Cloud Build

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

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

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

ابتدا باید با اجرای دستور زیر، Cloud Build API را فعال کنید:

gcloud services enable cloudbuild.googleapis.com

پس از فعال شدن API، دستور زیر را در Cloud Shell اجرا کنید تا فرآیند ساخت آغاز شود:

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith: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>/monolith:1.0.0  SUCCESS

برای مشاهده تاریخچه ساخت یا تماشای فرآیند به صورت زنده، می‌توانید به کنسول ابری (Cloud Console) بروید. روی دکمه منو در گوشه بالا سمت چپ کلیک کنید، به پایین اسکرول کنید تا به Ci/CD برسید، سپس روی Cloud Build کلیک کنید و در نهایت روی History کلیک کنید. در آنجا می‌توانید لیستی از ساخت‌های قبلی خود را مشاهده کنید، اما فقط باید نسخه‌ای که خودتان ایجاد کرده‌اید، وجود داشته باشد.

4c753ede203255f6.png

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

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

6e88ed1643dfe629.png

۶. کانتینر را در GKE مستقر کنید

حالا که وب‌سایت خود را کانتینرایز کرده‌اید و کانتینر را به رجیستری کانتینرها منتقل کرده‌اید، می‌توانید آن را در Kubernetes مستقر کنید!

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

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

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

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

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

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

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

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

kubectl get all

خروجی:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-7d8bc7bf68-htm7z   1/1     Running   0          6m21s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.27.240.1   <none>        443/TCP   24h

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1         1         1            1           20m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   1         1         1       20m

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

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

# Show pods
kubectl get pods

# Show deployments
kubectl get deployments

# Show replica sets
kubectl get rs

#You can also combine them
kubectl get pods,deployments

برای دیدن مزایای کامل Kubernetes، می‌توانید یک خرابی سرور را شبیه‌سازی کنید، Pod را حذف کنید و ببینید چه اتفاقی می‌افتد!

نام پاد خود را از دستور قبلی کپی کنید و دستور زیر را برای حذف آن اجرا کنید:

kubectl delete pod/<POD_NAME>

اگر به اندازه کافی سریع هستید، می‌توانید دستور قبلی را اجرا کنید تا دوباره همه چیز را ببینید و باید دو Pod ببینید، یکی در حال خاتمه دادن و دیگری در حال ایجاد یا اجرا:

kubectl get all

خروجی:

NAME                            READY   STATUS        RESTARTS   AGE
pod/monolith-7d8bc7bf68-2bxts   1/1     Running       0          4s
pod/monolith-7d8bc7bf68-htm7z   1/1     Terminating   0          9m35s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.27.240.1   <none>        443/TCP   24h

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1         1         1            1           24m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   1         1         1       24m

چرا این اتفاق افتاد؟ ReplicaSet متوجه شد که پاد در حال خاتمه است و یک پاد جدید را فعال کرد تا تعداد کپی‌های مورد نظر را حفظ کند. بعداً خواهید دید که چگونه مقیاس‌بندی کنید تا مطمئن شوید چندین نمونه در حال اجرا دارید تا اگر یکی از آنها از کار افتاد، کاربران شما هیچ گونه خرابی را مشاهده نکنند!

۷. افشای استقرار GKE

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

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

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

خروجی:

service/monolith exposed

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

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

kubectl get service

خروجی:

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

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

9ed25c3f0cbe62fa.png

شما باید همان وب‌سایتی را که قبلاً آزمایش کردید، ببینید! تبریک می‌گویم! وب‌سایت شما کاملاً بر روی Kubernetes اجرا می‌شود!

۸. مقیاس‌بندی استقرار GKE

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

دستور زیر را اجرا کنید تا بتوانید پیاده‌سازی خود را تا سه کپی گسترش دهید:

kubectl scale deployment monolith --replicas=3

خروجی:

deployment.apps/monolith scaled

تأیید استقرار مقیاس‌پذیر

برای تأیید اینکه Deployment با موفقیت مقیاس‌بندی شده است، دستور زیر را اجرا کنید:

kubectl get all

خروجی:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-7d8bc7bf68-2bxts   1/1     Running   0          36m
pod/monolith-7d8bc7bf68-7ds7q   1/1     Running   0          45s
pod/monolith-7d8bc7bf68-c5kxk   1/1     Running   0          45s

NAME                 TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
service/kubernetes   ClusterIP      10.27.240.1    <none>         443/TCP        25h
service/monolith     LoadBalancer   10.27.253.64   XX.XX.XX.XX   80:32050/TCP   6m7s

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   3         3         3            3           61m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   3         3         3       61m

شما باید سه نمونه از Pod خود را در حال اجرا ببینید. همچنین، توجه داشته باشید که Deployment و ReplicaSet شما اکنون تعداد مطلوب سه را دارند.

۹. ایجاد تغییرات در وب‌سایت

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

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

cd ~/monolith-to-microservices/react-app/src/pages/Home
mv index.js.new index.js
cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js

کد حاصل باید به این شکل باشد:

/*
Copyright 2019 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
  root: {
    flexGrow: 1
  },
  paper: {
    width: "800px",
    margin: "0 auto",
    padding: theme.spacing(3, 2)
  }
}));
export default function Home() {
  const classes = useStyles();
  return (
    <div className={classes.root}>
      <Paper className={classes.paper}>
        <Typography variant="h5">
          Fancy Fashion &amp; Style Online
        </Typography>
        <br />
        <Typography variant="body1">
          Tired of mainstream fashion ideas, popular trends and societal norms?
          This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
          Start shopping Fancy items now!
        </Typography>
      </Paper>
    </div>
  );
}

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

cd ~/monolith-to-microservices/react-app
npm run build:monolith

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

دستور زیر را برای راه‌اندازی یک Cloud Build جدید با نسخه به‌روزرسانی‌شده‌ی image به شماره ۲.۰.۰ اجرا کنید:

cd ~/monolith-to-microservices/monolith

#Feel free to test your application
npm start

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

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

در بخش بعدی، از آن تصویر برای به‌روزرسانی برنامه خود بدون هیچ‌گونه خرابی استفاده خواهید کرد.

۱۰. وب‌سایت را بدون قطعی به‌روزرسانی کنید

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

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

از طریق خط فرمان، می‌توانید با دستور زیر به Kubernetes بگویید که می‌خواهید ایمیج مربوط به Deployment خود را به نسخه جدید به‌روزرسانی کنید:

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

خروجی:

deployment.apps/monolith image updated

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

شما می‌توانید با اجرای دستور زیر، به‌روزرسانی Deployment خود را تأیید کنید:

kubectl get pods

خروجی:

NAME                        READY   STATUS              RESTARTS   AGE
monolith-584fbc994b-4hj68   1/1     Terminating         0          60m
monolith-584fbc994b-fpwdw   1/1     Running             0          60m
monolith-584fbc994b-xsk8s   1/1     Terminating         0          60m
monolith-75f4cf58d5-24cq8   1/1     Running             0          3s
monolith-75f4cf58d5-rfj8r   1/1     Running             0          5s
monolith-75f4cf58d5-xm44v   0/1     ContainerCreating   0          1s

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

برای تأیید تغییرات، دوباره به IP خارجی متعادل‌کننده بار بروید و متوجه شوید که برنامه شما به‌روزرسانی شده است.

دستور زیر را برای فهرست کردن سرویس‌ها و مشاهده آدرس IP در صورت فراموش کردن آن اجرا کنید:

kubectl get svc

وب‌سایت شما باید متنی را که به کامپوننت صفحه اصلی اضافه کرده‌اید، نمایش دهد!

8006c9938dbd5aa5.png

۱۱. تمیز کردن

حذف مخزن گیت

cd ~
rm -rf monolith-to-microservices

تصاویر رجیستری کانتینر را حذف کنید

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

# Delete the container image for version 1.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet

# Delete the container image for version 2.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quiet

حذف مصنوعات Cloud Build از فضای ذخیره‌سازی ابری

توجه: اگر از Cloud Build برای مصنوعاتی غیر از این codelab استفاده کرده‌اید، باید منبع خود را به صورت دستی از سطل ذخیره‌سازی ابری gs://<PROJECT_ID>_cloudbuild/source حذف کنید.

# The following command will take all source archives from all builds and delete them from cloud storage

# Run this command to print all sources:
# gcloud builds list | awk 'NR > 1 {print $4}'

gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; done

حذف سرویس GKE

kubectl delete service monolith
kubectl delete deployment monolith

حذف خوشه GKE

gcloud container clusters delete fancy-cluster

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

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

شما وب‌سایت خود را روی GKE مستقر، مقیاس‌پذیر و به‌روزرسانی کردید. اکنون با Docker و Kubernetes تجربه دارید!

منابع اضافی