1. بررسی اجمالی
در قسمت اول آزمایشگاه، یک برنامه ASP.NET Core ایجاد کردید، کانتینر کردید و آن را در Google Kubernetes Engine (GKE) مستقر کردید و ترافیک آن را برای مدیریت Istio پیکربندی کردید.
این بخش دوم آزمایشگاه فرض میکند که شما از قبل خوشه Kubernetes و برنامه آزمایشگاه اول را در حال اجرا دارید. خواهید دید که چگونه Istio می تواند به مدیریت، نظارت و ایمن سازی خدمات شما با حداقل تغییرات کد کمک کند. به طور خاص، ویژگیهای Istio مانند معیارها، ردیابی، تجسم سرویس، مدیریت ترافیک پویا، تزریق خطا و موارد دیگر را بررسی میکنید.
چیزی که یاد خواهید گرفت
- چگونه معیارها را با پرومتئوس پرس و جو کنیم.
- نحوه تجسم معیارها با Grafana.
- چگونه یک نسخه جدید از سرویس خود ایجاد کنیم.
- چگونه یک سرویس را به یک نسخه خاص پین کنیم.
- نحوه تقسیم ترافیک بین نسخه های مختلف
- نحوه تزریق خطا در تماس های سرویس.
آنچه شما نیاز دارید
چگونه از این آموزش استفاده خواهید کرد؟
تجربه خود را با Google Cloud Platform چگونه ارزیابی می کنید؟
2. راه اندازی و الزامات
تنظیم محیط خود به خود
- به کنسول Cloud وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. (اگر قبلاً یک حساب Gmail یا G Suite ندارید، باید یک حساب ایجاد کنید .)
شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه های Google Cloud (نام بالا قبلاً گرفته شده است و برای شما کار نخواهد کرد، متأسفیم!). بعداً در این آزمایشگاه کد به عنوان PROJECT_ID
نامیده خواهد شد.
- در مرحله بعد، برای استفاده از منابع Google Cloud، باید صورتحساب را در Cloud Console فعال کنید .
اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. حتماً دستورالعملهای موجود در بخش «تمیز کردن» را دنبال کنید که به شما توصیه میکند چگونه منابع را خاموش کنید تا بیش از این آموزش متحمل صورتحساب نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.
Cloud Shell را راه اندازی کنید
در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده می کنید، یک محیط خط فرمان که در Google Cloud اجرا می شود.
Cloud Shell را فعال کنید
- از Cloud Console، روی Activate Cloud Shell کلیک کنید
.
اگر قبلاً Cloud Shell را راهاندازی نکردهاید، با یک صفحه میانی (زیر تاشو) روبرو میشوید که آن را توصیف میکند. اگر اینطور است، روی Continue کلیک کنید (و دیگر آن را نخواهید دید). در اینجا به نظر می رسد که آن صفحه یک بار مصرف:
تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.
این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این دایرکتوری اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد شبکه و احراز هویت را بسیار افزایش می دهد. بیشتر، اگر نه همه، کار شما در این کد لبه را می توان به سادگی با یک مرورگر یا Chromebook انجام داد.
پس از اتصال به Cloud Shell، باید ببینید که قبلاً احراز هویت شده اید و پروژه قبلاً روی ID پروژه شما تنظیم شده است.
- برای تایید احراز هویت، دستور زیر را در 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].
3. برنامه را تست کنید
قبل از شروع آزمایشگاه، مطمئن شوید که برنامه هنوز از آزمایشگاه قبلی کار می کند. به عنوان یادآوری، IP خارجی و پورت دروازه را که در زیر EXTERNAL-IP
فهرست شده است، به این صورت مشاهده می کنید:
kubectl get svc istio-ingressgateway -n istio-system
برای مشاهده برنامه، می توانید مرورگر خود را باز کرده و به http://<gatewayurl>
بروید:
اگر برنامه را نمی بینید، به آزمایشگاه قبلی برگردید تا مطمئن شوید که تمام مراحل را دنبال کرده اید و هم برنامه و هم ایستیو به درستی نصب و اجرا می شوند.
در این مرحله، ممکن است از خود بپرسید "فایده ایستیو چیست؟" با اجازه دادن به ایستیو برای مدیریت ترافیک برنامه شما، ویژگی هایی مانند معیارها، ردیابی، مدیریت ترافیک پویا، تجسم سرویس، تزریق خطا و موارد دیگر را به صورت رایگان دریافت می کنید.
در مرحله بعدی با کاوش معیارها شروع خواهید کرد.
4. متریک با Grafana و Prometheus
به طور پیش فرض، Istio برخی از معیارها را تولید می کند. می توانید از افزونه ها برای پرس و جو و تجسم این معیارهای پیش فرض استفاده کنید.
پرومتئوس
Prometheus یک راه حل مانیتورینگ منبع باز است. شما می توانید از Prometheus برای پرس و جو از معیارهای تولید شده توسط Istio استفاده کنید، اما ابتدا باید افزونه Prometheus را نصب کنید.
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 مقداری ترافیک را به برنامه ارسال کنید.
راه اندازی پورت فوروارد برای رابط کاربری Prometheus:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 8080:9090
اکنون می توانید با کلیک بر روی دکمه Web Preview در گوشه سمت راست بالای Cloud Shell، یک پرس و جو را اجرا کنید و روی Preview در پورت 8080 کلیک کنید:
رابط کاربری Prometheus را در یک تب جدید خواهید دید:
برای کسب اطلاعات بیشتر در مورد پرومتئوس، به جستجوی معیارها با پرومتئوس مراجعه کنید.
گرافانا
Grafana افزونه دیگری برای تجسم معیارها است.
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
بررسی کنید که Grafana در حال اجرا است:
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 مقداری ترافیک را به برنامه ارسال کنید.
راه اندازی پورت فوروارد برای رابط کاربری Grafana:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 8080:3000
میتوانید با مراجعه به پیشنمایش وب، داشبوردهای Grafana را مشاهده کنید:
برای کسب اطلاعات بیشتر درباره Granfana، به تجسم معیارها با Grafana مراجعه کنید.
5. یک نسخه جدید از برنامه ایجاد کنید
در برخی موارد، برنامهای که برای تولید به کار گرفتهاید به رفع اشکال یا ویژگیهای اضافی نیاز دارد. بیایید ببینیم که این روند چگونه به نظر می رسد.
ابتدا بیایید برنامه را اصلاح کنیم. ویرایشگر کد را از Cloud Shell باز کنید.
به Index.cshtml
زیر HelloWorldAspNetCore > Views > Home
بروید و یکی از پیام های چرخ فلک را به روز کنید.
خط زیر را پیدا کنید:
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
پس از فشار دادن تصویر کانتینر، می توانید نسخه جدید را در مرحله بعد مستقر کنید.
6. استقرار جدید را ایجاد کنید
برای استقرار نسخه جدید، ابتدا باید یک استقرار جدید برای آن در 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
پین میکنید.
7. سرویس خود را به نسخه جدید پین کنید
در این مرحله، سرویس خود را برای استفاده از استقرار 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
به روز رسانی VirtualService:
kubectl apply -f aspnetcore-virtualservice.yaml
مرورگر خود را باز کنید و از http://<replace-with-external-ip>.
حتی پس از چندین بار تازهسازی، باید پیام «درباره ساختن برنامههای وب با ASP.NET Core در Google Cloud» بیاموزید:
8. ترافیک را بین نسخه ها تقسیم کنید
گاهی اوقات، ممکن است بخواهید برای آزمایش، ترافیک را بین نسخه ها تقسیم کنید. به عنوان مثال، ممکن است بخواهید 75 درصد از ترافیک را به v1 و 25 درصد از ترافیک را به نسخه v2 این سرویس ارسال کنید. با ایستیو به راحتی می توانید به این هدف برسید. یک فایل 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
به روز رسانی VirtualService:
kubectl apply -f aspnetcore-virtualservice-weights.yaml
اکنون، وقتی مرورگر را بهروزرسانی میکنید، باید نسخههای v1 در مقابل نسخه 2 را ببینید که تقریباً با نسبت 3:1 ارائه میشوند.
برای کسب اطلاعات بیشتر، تقسیم ترافیک در ایستیو را ببینید.
9. عیب ها را تزریق کنید
یکی دیگر از وظایف توسعه مفیدی که برای آزمایش انجام می شود این است که خطاها یا تاخیرها را به ترافیک تزریق کنید و ببینید خدمات در پاسخ چگونه رفتار می کنند.
به عنوان مثال، ممکن است بخواهید یک پاسخ درخواست بد (HTTP 400) را برای 50 درصد از ترافیک به نسخه v1 برگردانید. فایل 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
به روز رسانی VirtualService:
kubectl apply -f aspnetcore-virtualservice-fault-abort.yaml
اکنون، وقتی مرورگر را بهروزرسانی میکنید، باید ببینید که نیمی از مواقع، سرویس v1 یک کد پاسخ HTTP 400s را برمیگرداند.
یا شاید بخواهید 5 ثانیه تاخیر به درخواست ها اضافه کنید. فایل 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
به روز رسانی VirtualService:
kubectl apply -f aspnetcore-virtualservice-fault-delay.yaml
حالا وقتی مرورگر را رفرش می کنید، باید ببینید که درخواست ها 5 ثانیه تاخیر دارند.
برای کسب اطلاعات بیشتر در مورد ویژگیهای Istio مانند مهلت زمانی، تلاش مجدد، قوانین مشروط، قطع کننده مدار و موارد دیگر، به ویژگیهای مدیریت ترافیک مراجعه کنید.
10. تبریک می گویم!
امیدواریم که این آزمایشگاه به شما یک نمای کلی از کارهایی که ایستیو میتواند برای خدمات شما انجام دهد ارائه کرده است. برای کسب اطلاعات بیشتر در مورد Istio و GKE.
مراحل بعدی
- درباره ایستیو بیشتر بدانید.
- درباره Kubernetes بیشتر بیاموزید.
- درباره Google Kubernetes Engine بیشتر بیاموزید.
- درباره .NET در Google Cloud Platform بیشتر بیاموزید.
مجوز
این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.
11. پاکسازی
می توانید برنامه را حذف کرده و 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 را حذف کنید
برای حذف ایستیو:
kubectl delete -f install/kubernetes/istio-demo-auth.yaml
برای تایید اینکه ایستیو رفته است:
kubectl get pods -n istio-system
حذف خوشه Kubernetes
gcloud container clusters delete hello-dotnet-cluster