۱. مرور کلی
در بخش اول آزمایش، شما یک برنامه ASP.NET Core ایجاد کردید، آن را کانتینرایز کردید و در Google Kubernetes Engine (GKE) مستقر کردید و ترافیک آن را طوری پیکربندی کردید که توسط Istio مدیریت شود.
این بخش دوم از آزمایش فرض میکند که شما از قبل کلاستر Kubernetes و برنامهی مربوط به آزمایش اول را در حال اجرا دارید. خواهید دید که چگونه Istio میتواند با حداقل تغییرات کد به مدیریت، نظارت و ایمنسازی سرویسهای شما کمک کند. به طور خاص، ویژگیهای Istio مانند معیارها، ردیابی، تجسم سرویس، مدیریت ترافیک پویا، تزریق خطا و موارد دیگر را بررسی خواهید کرد.
آنچه یاد خواهید گرفت
- نحوه پرس و جو از معیارها با Prometheus.
- نحوه مصورسازی معیارها با گرافانا
- How to create a new version of your service.
- نحوه پین کردن یک سرویس به یک نسخه خاص.
- How to split traffic between different versions.
- نحوه تزریق خطاها در فراخوانیهای سرویس.
آنچه نیاز دارید
چگونه از این آموزش استفاده خواهید کرد؟
تجربه خود را با پلتفرم ابری گوگل چگونه ارزیابی میکنید؟
۲. تنظیمات و الزامات
تنظیم محیط خودتنظیم
- وارد Cloud Console شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. (اگر از قبل حساب Gmail یا G Suite ندارید، باید یکی ایجاد کنید .)
شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژههای Google Cloud (نام بالا قبلاً گرفته شده و برای شما کار نخواهد کرد، متاسفیم!). بعداً در این آزمایشگاه کد به آن PROJECT_ID گفته خواهد شد.
- در مرحله بعد، برای استفاده از منابع گوگل کلود، باید پرداخت را در Cloud Console فعال کنید .
اجرای این آزمایشگاه کد، اگر اصلاً هزینهای نداشته باشد، نباید هزینه زیادی داشته باشد. حتماً دستورالعملهای بخش «پاکسازی» را که به شما نحوه خاموش کردن منابع را آموزش میدهد، دنبال کنید تا پس از این آموزش، متحمل هزینه نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.
شروع پوسته ابری
اگرچه میتوان گوگل کلود را از راه دور و از طریق لپتاپ شما مدیریت کرد، اما در این آزمایشگاه کد از گوگل کلود شل ، یک محیط خط فرمان که در گوگل کلود اجرا میشود، استفاده میکنید.
فعال کردن پوسته ابری
- از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید
.
اگر قبلاً Cloud Shell را شروع نکردهاید، یک صفحه میانی (در زیر صفحه) به شما نمایش داده میشود که توضیح میدهد چیست. در این صورت، روی ادامه کلیک کنید (و دیگر هرگز آن را نخواهید دید). آن صفحه یکبار مصرف به این شکل است:
آمادهسازی و اتصال به Cloud Shell فقط چند لحظه طول میکشد.
این ماشین مجازی با تمام ابزارهای توسعهای که نیاز دارید، مجهز شده است. این ماشین یک دایرکتوری خانگی ۵ گیگابایتی پایدار ارائه میدهد و در فضای ابری گوگل اجرا میشود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود میبخشد. بخش عمدهای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را میتوان به سادگی با یک مرورگر یا کرومبوک انجام داد.
پس از اتصال به Cloud Shell، باید ببینید که از قبل احراز هویت شدهاید و پروژه از قبل روی شناسه پروژه شما تنظیم شده است.
- برای تأیید احراز هویت، دستور زیر را در Cloud Shell اجرا کنید:
gcloud auth list
خروجی دستور
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
gcloud config list project
خروجی دستور
[core] project = <PROJECT_ID>
اگر اینطور نیست، میتوانید با این دستور آن را تنظیم کنید:
gcloud config set project <PROJECT_ID>
خروجی دستور
Updated property [core/project].
۳. برنامه را آزمایش کنید
قبل از شروع آزمایش، مطمئن شوید که برنامه از آزمایش قبلی هنوز کار میکند. به عنوان یادآوری، نحوه مشاهده IP خارجی و پورت دروازه که در قسمت EXTERNAL-IP فهرست شدهاند، به این صورت است:
kubectl get svc istio-ingressgateway -n istio-system
برای مشاهده برنامه، میتوانید مرورگر خود را باز کرده و به http://<gatewayurl> بروید:

اگر برنامه را نمیبینید، به آزمایش قبلی برگردید تا مطمئن شوید که تمام مراحل را دنبال کردهاید و هم برنامه و هم Istio به درستی نصب و اجرا شدهاند.
در این مرحله، ممکن است از خود بپرسید که "فایده Istio چیست؟". با اجازه دادن به Istio برای مدیریت ترافیک برنامه خود، ویژگیهایی مانند معیارها، ردیابی، مدیریت پویای ترافیک، تجسم سرویس، تزریق خطا و موارد دیگر را به صورت رایگان دریافت خواهید کرد.
در مرحله بعدی، بررسی معیارها را آغاز خواهید کرد.
۴. معیارها با گرافانا و پرومتئوس
به طور پیشفرض، Istio برخی معیارها را تولید میکند. میتوانید از افزونهها برای پرسوجو و تجسم این معیارهای پیشفرض استفاده کنید.
پرومتئوس
پرومتئوس یک راهکار مانیتورینگ متنباز است. میتوانید از پرومتئوس برای پرسوجو از معیارهای تولید شده توسط Istio استفاده کنید، اما ابتدا باید افزونه پرومتئوس را نصب کنید.
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/prometheus.yaml
تأیید کنید که Prometheus در حال اجرا است:
kubectl get svc prometheus -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE prometheus ClusterIP 10.31.243.62 <none> 9090/TCP 1d
با چند بار مراجعه به http://<gatewayurl> یا اجرای دستور curl، مقداری ترافیک به برنامه ارسال کنید.
تنظیم پورت فورواردینگ برای رابط کاربری پرومتئوس:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 8080:9090
اکنون میتوانید با کلیک بر روی دکمه پیشنمایش وب در گوشه بالا سمت راست Cloud Shell و کلیک بر روی پیشنمایش روی پورت ۸۰۸۰، یک کوئری اجرا کنید:

رابط کاربری پرومتئوس را در یک تب جدید مشاهده خواهید کرد:

برای کسب اطلاعات بیشتر در مورد پرومتئوس، به بخش «پرس و جو در معیارها با پرومتئوس» مراجعه کنید.
گرافانا
گرافانا (Grafana) یکی دیگر از افزونهها برای مصورسازی معیارها است.
گرافانا را نصب کنید. istio-version را با نسخه فعلی Istio خود جایگزین کنید، به عنوان مثال، 1.0.3-gke.3 :
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/grafana.yaml
تأیید کنید که گرافانا در حال اجرا است:
kubectl get svc grafana -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana ClusterIP 10.31.248.230 <none> 3000/TCP 1d
با چند بار مراجعه به http://<gatewayurl> یا اجرای دستور curl، مقداری ترافیک به برنامه ارسال کنید.
تنظیم پورت فورواردینگ برای رابط کاربری گرافانا:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 8080:3000
شما میتوانید داشبوردهای گرافانا را با مراجعه به پیشنمایش وب مشاهده کنید:


برای کسب اطلاعات بیشتر در مورد گرفنا، به بخش «تصویرسازی معیارها با گرافانا» مراجعه کنید.
۵. یک نسخه جدید از برنامه ایجاد کنید
در برههای از زمان، برنامهای که به محیط عملیاتی منتقل کردهاید، نیاز به رفع اشکالات یا افزودن ویژگیهای جدید خواهد داشت. بیایید ببینیم این فرآیند چگونه خواهد بود.
ابتدا، بیایید برنامه را تغییر دهیم. ویرایشگر کد را از Cloud Shell باز کنید.
به مسیر HelloWorldAspNetCore > Views > Home در Index.cshtml بروید و یکی از پیامهای carousel را بهروزرسانی کنید.
خط زیر را پیدا کنید:
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core
و آن را به این تغییر دهید:
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core on Google Cloud
تغییرات را ذخیره کنید و سپس به Cloud Shell برگردید. درون HelloWorldAspNetCore, تصویر داکر را بسازید:
docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 .
و به رجیستری کانتینر فشار دهید:
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2
بعد از اینکه تصویر کانتینر را ارسال کردید، میتوانید نسخه جدید را در مرحله بعدی مستقر کنید.
۶. ایجاد استقرار جدید
برای استقرار نسخه جدید، ابتدا باید یک استقرار جدید برای آن در Kubernetes ایجاد کنید. موارد زیر را در انتهای فایل aspnetcore.yaml اضافه کنید:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: aspnetcore-v2
spec:
replicas: 1
selector:
matchLabels:
app: aspnetcore
version: v2
template:
metadata:
labels:
app: aspnetcore
version: v2
spec:
containers:
- name: aspnetcore
image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
نسخه جدید را با kubectl در فضای نام پیشفرض مستقر کنید:
kubectl apply -f aspnetcore.yaml
service "aspnetcore" unchanged deployment.extensions "aspnetcore-v1" unchanged deployment.extensions "aspnetcore-v2" created
تأیید کنید که پادهای مورد انتظار در حال اجرا هستند:
kubectl get pods
NAME READY STATUS RESTARTS AGE aspnetcore-v1-6cf64748-mddb 2/2 Running 0 34s aspnetcore-v2-5d765db-l9xmg 2/2 Running 0 1m
حالا، دوباره برنامه را آزمایش کنید. IP خارجی دروازه را دریافت کنید:
kubectl get svc istio-ingressgateway -n istio-system
این مورد در زیر EXTERNAL-IP فهرست شده است. یک مرورگر ناشناس را باز کنید و به http://<replace-with-external-ip> مراجعه کنید.
وقتی صفحه را رفرش میکنید، گاهی اوقات، پیام «درباره ساخت برنامههای وب با ASP.NET Core بیاموزید» را مشاهده خواهید کرد:

در مواقع دیگر، پیام «درباره ساخت برنامههای وب با ASP.NET Core در Google Cloud بیاموزید» را خواهید دید:

دلیل این امر آن است که هر دو نسخه v1 و v2 در پشت یک سرویس Kubernetes ( aspnetcore-service ) قرار دارند و VirtualService که در تمرین قبلی ایجاد کردید ( aspnetcore-virtualservice ) از آن سرویس به عنوان میزبان استفاده میکند.
در مرحله بعد، سرویس را با استفاده از DestinationRule به نسخه v2 متصل میکنید.
۷. سرویس خود را به نسخه جدید پین کنید
در این مرحله، سرویس خود را برای استفاده از استقرار v2 پین میکنید و میتوانید این کار را با یک DestinationRule انجام دهید. DestinationRule مجموعهای از سیاستهایی را که باید پس از وقوع عملیات مسیریابی VirtualService به یک درخواست اعمال شوند، پیکربندی میکند.
یک DestinationRule همچنین زیرمجموعههای قابل آدرسدهی، یعنی نسخههای نامگذاریشده، از میزبان مقصد مربوطه را تعریف میکند. این زیرمجموعهها در مشخصات مسیر VirtualService هنگام ارسال ترافیک به نسخههای خاص سرویس استفاده میشوند.
یک فایل جدید به نام aspnetcore-destinationrule.yaml ایجاد کنید:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: aspnetcore-destinationrule
spec:
host: aspnetcore-service
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
در مرحله بعد، DestinationRule را ایجاد کنید. این کار دو زیرمجموعه (v1 و v2) ایجاد میکند که میتوانید از VirtualService استفاده کنید:
kubectl apply -f aspnetcore-destinationrule.yaml
destinationrule.networking.istio.io "aspnetcore-destionationrule" created
حالا، به فایل aspnetcore-virtualservice.yaml برگردید تا VirtualService را برای استفاده از زیرمجموعه v2 بهروزرسانی کنید:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- route:
- destination:
host: aspnetcore-service
subset: v2
بهروزرسانی سرویس مجازی:
kubectl apply -f aspnetcore-virtualservice.yaml
مرورگر خود را باز کنید و به http://<replace-with-external-ip>. حتی پس از چندین بار رفرش کردن، باید پیام "درباره ساخت برنامههای وب با ASP.NET Core در Google Cloud بیاموزید" را مشاهده کنید:

۸. تقسیم ترافیک بین نسخهها
گاهی اوقات، ممکن است بخواهید ترافیک را برای آزمایش بین نسخهها تقسیم کنید. برای مثال، ممکن است بخواهید ۷۵٪ از ترافیک را به نسخه ۱ و ۲۵٪ از ترافیک را به نسخه ۲ سرویس ارسال کنید. میتوانید به راحتی با Istio به این هدف دست یابید. یک فایل جدید aspnetcore-virtualservice-weights.yaml ایجاد کنید تا به دو زیرمجموعه با وزنهای مختلف ارجاع دهید:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- route:
- destination:
host: aspnetcore-service
subset: v1
weight: 75
- destination:
host: aspnetcore-service
subset: v2
weight: 25
بهروزرسانی سرویس مجازی:
kubectl apply -f aspnetcore-virtualservice-weights.yaml
حالا، وقتی مرورگر را رفرش میکنید، باید نسخههای v1 در مقابل v2 را با نسبت تقریباً ۳:۱ مشاهده کنید.
برای کسب اطلاعات بیشتر، به تقسیم ترافیک در Istio مراجعه کنید.
۹. تزریق خطاها
یکی دیگر از کارهای مفید توسعه برای آزمایش، تزریق خطاها یا تأخیرها به ترافیک و مشاهده نحوه رفتار سرویسها در پاسخ به آنهاست.
برای مثال، ممکن است بخواهید برای ۵۰٪ از ترافیک نسخه v1، یک پاسخ درخواست بد (HTTP 400) برگردانید. فایل aspnetcore-virtualservice-fault-abort.yaml را مطابق با موارد زیر ایجاد کنید:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- fault:
abort:
percentage:
value: 50
httpStatus: 400
route:
- destination:
host: aspnetcore-service
subset: v1
بهروزرسانی سرویس مجازی:
kubectl apply -f aspnetcore-virtualservice-fault-abort.yaml
حالا، وقتی مرورگر را رفرش میکنید، باید ببینید که نیمی از مواقع، سرویس v1 کد پاسخ HTTP 400s را برمیگرداند.
یا شاید بخواهید ۵ ثانیه به درخواستها تأخیر اضافه کنید. فایل aspnetcore-virtualservice-fault-delay.yaml را مطابق با موارد زیر ایجاد کنید:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- fault:
delay:
fixedDelay: 5s
percentage:
value: 100
route:
- destination:
host: aspnetcore-service
subset: v1
بهروزرسانی سرویس مجازی:
kubectl apply -f aspnetcore-virtualservice-fault-delay.yaml
حالا، وقتی مرورگر را رفرش میکنید، باید ببینید که درخواستها ۵ ثانیه تأخیر دارند.
برای کسب اطلاعات بیشتر در مورد ویژگیهای Istio مانند مهلتهای زمانی، تلاشهای مجدد، قوانین شرطی، قطعکنندههای مدار و موارد دیگر، به ویژگیهای مدیریت ترافیک مراجعه کنید.
۱۰. تبریک میگویم!
امیدوارم این آزمایش به شما یک مرور کلی از آنچه Istio میتواند برای خدمات شما انجام دهد، داده باشد. برای کسب اطلاعات بیشتر در مورد Istio و GKE.
مراحل بعدی
- درباره ایستیو بیشتر بدانید.
- درباره کوبرنتیز بیشتر بدانید.
- درباره موتور گوگل کوبرنتیز بیشتر بدانید.
- درباره .NET در پلتفرم ابری گوگل بیشتر بدانید.
مجوز
این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.
۱۱. پاکسازی
میتوانید برنامه را حذف کرده و Istio را حذف نصب کنید یا میتوانید به سادگی خوشه Kubernetes را حذف کنید.
برنامه را حذف کنید
برای حذف برنامه:
kubectl delete -f aspnetcore-gateway.yaml kubectl delete -f aspnetcore-virtualservice.yaml kubectl delete -f aspnetcore-destinationrule.yaml kubectl delete -f aspnetcore.yaml
برای تأیید حذف برنامه:
kubectl get gateway kubectl get virtualservices kubectl get destinationrule kubectl get pods
حذف نصب Istio
برای حذف Istio:
kubectl delete -f install/kubernetes/istio-demo-auth.yaml
برای تأیید اینکه ایستیو از بین رفته است:
kubectl get pods -n istio-system
حذف خوشه Kubernetes
gcloud container clusters delete hello-dotnet-cluster