استقرار برنامه ASP.NET Core در Google Kubernetes Engine با Istio (قسمت 2)

1. بررسی اجمالی

در قسمت اول آزمایشگاه، یک برنامه ASP.NET Core ایجاد کردید، کانتینر کردید و آن را در Google Kubernetes Engine (GKE) مستقر کردید و ترافیک آن را برای مدیریت Istio پیکربندی کردید.

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

چیزی که یاد خواهید گرفت

  • چگونه معیارها را با پرومتئوس پرس و جو کنیم.
  • نحوه تجسم معیارها با Grafana.
  • چگونه یک نسخه جدید از سرویس خود ایجاد کنیم.
  • چگونه یک سرویس را به یک نسخه خاص پین کنیم.
  • نحوه تقسیم ترافیک بین نسخه های مختلف
  • نحوه تزریق خطا در تماس های سرویس.

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

چگونه از این آموزش استفاده خواهید کرد؟

فقط از طریق آن را بخوانید آن را بخوانید و تمرینات را کامل کنید

تجربه خود را با Google Cloud Platform چگونه ارزیابی می کنید؟

تازه کار متوسط مسلط

2. راه اندازی و الزامات

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

  1. به کنسول Cloud وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. (اگر قبلاً یک حساب Gmail یا G Suite ندارید، باید یک حساب ایجاد کنید .)

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KWs

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhZMaJbZwH50RJwHirkVPR_0RJwl0oXrhZMaJbZwH5MGQZwZw5

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-forxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT4p5EC29Ts

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

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

اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. حتماً دستورالعمل‌های موجود در بخش «تمیز کردن» را دنبال کنید که به شما توصیه می‌کند چگونه منابع را خاموش کنید تا بیش از این آموزش متحمل صورت‌حساب نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.

Cloud Shell را راه اندازی کنید

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

Cloud Shell را فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell کلیک کنید dnDTxS9j60RcXdTjea12HLB9paS9Gzf7PfFLE9RW8g0Qx1bz7nmCzyCu4rjluX3bOE wavOpDwioXEkzOf6xtZp6-ZbJa08jwJqZHFXDW0F O9Ljw .

‌

اگر قبلاً Cloud Shell را راه‌اندازی نکرده‌اید، با یک صفحه میانی (زیر تاشو) روبرو می‌شوید که آن را توصیف می‌کند. اگر اینطور است، روی Continue کلیک کنید (و دیگر آن را نخواهید دید). در اینجا به نظر می رسد که آن صفحه یک بار مصرف:

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kS3FJQMTKDKDN

تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRPKc5uFA0tmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRPKc5uFA0r3

این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این دایرکتوری اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد شبکه و احراز هویت را بسیار افزایش می دهد. بیشتر، اگر نه همه، کار شما در این کد لبه را می توان به سادگی با یک مرورگر یا Chromebook انجام داد.

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

  1. برای تایید احراز هویت، دستور زیر را در 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> بروید:

f579a9baedc108a9.png

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

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

در مرحله بعدی با کاوش معیارها شروع خواهید کرد.

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 کلیک کنید:

772a5248aa493025.png

رابط کاربری Prometheus را در یک تب جدید خواهید دید:

272ee63c1fe0be16.png

برای کسب اطلاعات بیشتر در مورد پرومتئوس، به جستجوی معیارها با پرومتئوس مراجعه کنید.

گرافانا

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 را مشاهده کنید:

806d696d85267a37.png

524cb9f6d66f8655.png

برای کسب اطلاعات بیشتر درباره Granfana، به تجسم معیارها با Grafana مراجعه کنید.

5. یک نسخه جدید از برنامه ایجاد کنید

در برخی موارد، برنامه‌ای که برای تولید به کار گرفته‌اید به رفع اشکال یا ویژگی‌های اضافی نیاز دارد. بیایید ببینیم که این روند چگونه به نظر می رسد.

ابتدا بیایید برنامه را اصلاح کنیم. ویرایشگر کد را از Cloud Shell باز کنید.

mxrggIJ2Zz8E47ULCEo4NywjM-EpSkZF5c3TQgfGx4nODwP2obiQXrwQjEEaXuBhJDA2jJ5evR7TuHIy1gsqqDRFm0Wh3xhZUu9tn_xBm1HKzFo30000000000000000000_xBm1HKzFo س

به 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 بیاموزید» را می‌بینید:

11d528132dbb6cee.png

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

3eb0d5be1b4cb40b.png

این به این دلیل است که هر دو استقرار 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» بیاموزید:

3eb0d5be1b4cb40b.png

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.

مراحل بعدی

مجوز

این اثر تحت مجوز 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