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

۱. مرور کلی

در بخش اول آزمایش، شما یک برنامه 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.
  • نحوه تزریق خطاها در فراخوانی‌های سرویس.

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

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

فقط تا انتها بخوانید آن را بخوانید و تمرین‌ها را انجام دهید

تجربه خود را با پلتفرم ابری گوگل چگونه ارزیابی می‌کنید؟

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

۲. تنظیمات و الزامات

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

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

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhZMaJbZwH50RJwHirkVPR_0RJwl0oXrhZMaJbZwH5MGQZwZw5

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

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

  1. در مرحله بعد، برای استفاده از منابع گوگل کلود، باید پرداخت را در Cloud Console فعال کنید .

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

شروع پوسته ابری

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

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید dnDTxS9j60RcXdTjea12HLB9paS9Gzf7PfFLE9RW8g0Qx1bz7nmCzyCu4rjluX3bOEwavOpDwioXEkzOf6xtZp6-ZbJa08jwJqtmeeW8jZ1tYfi2lyXqvW3WFHP0eAxDkQDfpO9Ljw .

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

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

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77w WKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kS3FXY_NzuujjEqDF1nsbDKkNMThrqcdMGtQ

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

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

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

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

  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].

۳. برنامه را آزمایش کنید

قبل از شروع آزمایش، مطمئن شوید که برنامه از آزمایش قبلی هنوز کار می‌کند. به عنوان یادآوری، نحوه مشاهده IP خارجی و پورت دروازه که در قسمت EXTERNAL-IP فهرست شده‌اند، به این صورت است:

kubectl get svc istio-ingressgateway -n istio-system

برای مشاهده برنامه، می‌توانید مرورگر خود را باز کرده و به http://<gatewayurl> بروید:

f579a9baedc108a9.png

اگر برنامه را نمی‌بینید، به آزمایش قبلی برگردید تا مطمئن شوید که تمام مراحل را دنبال کرده‌اید و هم برنامه و هم 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 و کلیک بر روی پیش‌نمایش روی پورت ۸۰۸۰، یک کوئری اجرا کنید:

772a5248aa493025.png

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

272ee63c1fe0be16.png

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

گرافانا

گرافانا (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

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

806d696d85267a37.png

524cb9f6d66f8655.png

برای کسب اطلاعات بیشتر در مورد گرفنا، به بخش «تصویرسازی معیارها با گرافانا» مراجعه کنید.

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

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

ابتدا، بیایید برنامه را تغییر دهیم. ویرایشگر کد را از Cloud Shell باز کنید.

mxrggIJ2Zz8E47ULCEo4NywjM-EpSkZF5c3TQgfGx4nODwP2obiQXrwQjEEaXuBhJDA2j J5evR7TuHIy1gsqqDRFm0Wh3xhZUu9tn_xb1ygFlBm1HKJqLdfz_aK7WJS33u2IBDO2oQ

به مسیر 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 بیاموزید» را مشاهده خواهید کرد:

11d528132dbb6cee.png

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

3eb0d5be1b4cb40b.png

دلیل این امر آن است که هر دو نسخه 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 بیاموزید" را مشاهده کنید:

3eb0d5be1b4cb40b.png

۸. تقسیم ترافیک بین نسخه‌ها

گاهی اوقات، ممکن است بخواهید ترافیک را برای آزمایش بین نسخه‌ها تقسیم کنید. برای مثال، ممکن است بخواهید ۷۵٪ از ترافیک را به نسخه ۱ و ۲۵٪ از ترافیک را به نسخه ۲ سرویس ارسال کنید. می‌توانید به راحتی با 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.

مراحل بعدی

مجوز

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