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

۱. مرور کلی

ASP.NET Core یک چارچوب متن‌باز و چندسکویی برای ساخت برنامه‌های مدرن مبتنی بر ابر و متصل به اینترنت با استفاده از زبان برنامه‌نویسی سی‌شارپ است.

Kubernetes یک سیستم متن‌باز برای خودکارسازی استقرار، مقیاس‌پذیری و مدیریت برنامه‌های کانتینری است. Istio یک چارچوب متن‌باز برای اتصال، ایمن‌سازی، مدیریت و نظارت بر سرویس‌ها است.

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

در بخش دوم آزمایش، شما ویژگی‌های Istio مانند معیارها، ردیابی، مدیریت ترافیک پویا، تزریق خطا و موارد دیگر را بیشتر بررسی خواهید کرد.

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

  • نحوه ایجاد و بسته‌بندی یک برنامه ساده ASP.NET Core در یک کانتینر داکر.
  • نحوه ایجاد یک کلاستر Kubernetes با موتور گوگل Kubernetes (GKE).
  • نحوه نصب Istio روی یک کلاستر Kubernetes در GKE.
  • چگونه برنامه ASP.NET Core خود را مستقر کنید و ترافیک آن را برای مدیریت توسط Istio پیکربندی کنید.

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

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

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

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

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

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

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

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

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

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

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

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

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

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

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید 4292cbf4971c9786.png .

bce75f34b2c53987.png

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

70f315d7b402b476.png

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

fbe3a0674c982259.png

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

پس از اتصال به 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`
  1. دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد:
gcloud config list project

خروجی دستور

[core]
project = <PROJECT_ID>

اگر اینطور نیست، می‌توانید با این دستور آن را تنظیم کنید:

gcloud config set project <PROJECT_ID>

خروجی دستور

Updated property [core/project].

۳. یک برنامه ASP.NET Core در Cloud Shell ایجاد کنید

در خط فرمان Cloud Shell، می‌توانید با بررسی نسخه ابزار خط فرمان dotnet، تأیید کنید که این ابزار از قبل نصب شده است. این دستور باید نسخه ابزار خط فرمان dotnet نصب شده را نمایش دهد:

dotnet --version

در مرحله بعد، یک برنامه وب ASP.NET Core با ساختار جدید ایجاد کنید.

dotnet new mvc -o HelloWorldAspNetCore

این باید یک پروژه ایجاد کند و وابستگی‌های آن را بازیابی کند. شما باید پیامی مشابه زیر را ببینید.

Restore completed in 11.44 sec for HelloWorldAspNetCore.csproj.

Restore succeeded.

۴. برنامه ASP.NET Core را اجرا کنید

تقریباً آماده اجرای برنامه خود هستیم. به پوشه برنامه بروید.

cd HelloWorldAspNetCore

در نهایت، برنامه را اجرا کنید.

dotnet run --urls=http://localhost:8080

برنامه شروع به گوش دادن به پورت ۸۰۸۰ می‌کند.

Hosting environment: Production
Content root path: /home/atameldev/HelloWorldAspNetCore
Now listening on: http://[::]:8080
Application started. Press Ctrl+C to shut down.

برای تأیید اجرای برنامه، روی دکمه پیش‌نمایش وب در بالا سمت راست کلیک کنید و «پیش‌نمایش روی پورت ۸۰۸۰» را انتخاب کنید.

ضبط.PNG

صفحه وب پیش‌فرض ASP.NET Core را مشاهده خواهید کرد:

f579a9baedc108a9.png

وقتی مطمئن شدید که برنامه در حال اجرا است، Ctrl+C را فشار دهید تا برنامه بسته شود.

۵. بسته‌بندی برنامه ASP.NET Core در یک کانتینر داکر

در مرحله بعد، برنامه خود را برای اجرا به عنوان یک کانتینر آماده کنید. اولین قدم تعریف کانتینر و محتویات آن است.

در دایرکتوری پایه برنامه، یک Dockerfile برای تعریف تصویر Docker ایجاد کنید.

touch Dockerfile

با استفاده از ویرایشگر مورد علاقه خود ( vim, nano,emacs یا ویرایشگر کد Cloud Shell) موارد زیر را به Dockerfile اضافه کنید.

# Use Microsoft's official build .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-sdk/
FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build
WORKDIR /app

# Install production dependencies.
# Copy csproj and restore as distinct layers.
COPY *.csproj ./
RUN dotnet restore

# Copy local code to the container image.
COPY . ./
WORKDIR /app

# Build a release artifact.
RUN dotnet publish -c Release -o out

# Use Microsoft's official runtime .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-aspnet/
FROM mcr.microsoft.com/dotnet/aspnet:5.0-alpine AS runtime
WORKDIR /app
COPY --from=build /app/out ./

# Make sure the app binds to port 8080
ENV ASPNETCORE_URLS http://*:8080

# Run the web service on container startup.
ENTRYPOINT ["dotnet", "HelloWorldAspNetCore.dll"]

یکی از پیکربندی‌های مهم موجود در Dockerfile شما، پورتی است که برنامه از طریق آن به ترافیک ورودی گوش می‌دهد (8080). این کار با تنظیم متغیر محیطی ASPNETCORE_URLS انجام می‌شود، که برنامه‌های ASP.NET Core از آن برای تعیین پورت مورد نظر برای گوش دادن استفاده می‌کنند.

این Dockerfile ذخیره کنید. حالا، بیایید ایمیج را بسازیم:

docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1 .

پس از اتمام این کار (دانلود و استخراج همه چیز مدتی طول می‌کشد)، می‌توانید ببینید که ایمیج ساخته شده و به صورت محلی ذخیره شده است:

docker images

REPOSITORY                             TAG   
gcr.io/yourproject-XXXX/hello-dotnet   v1            

با دستور زیر که یک کانتینر داکر را به صورت محلی روی پورت ۸۰۸۰ از روی کانتینر تازه ایجاد شده شما اجرا می‌کند، ایمیج را به صورت محلی آزمایش کنید:

docker run -p 8080:8080 gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1

و دوباره از ویژگی پیش‌نمایش وب CloudShell استفاده کنید:

تصویر از 2015-11-03 17:20:22.png

شما باید صفحه وب پیش‌فرض ASP.NET Core را در یک تب جدید ببینید.

f579a9baedc108a9.png

وقتی تأیید کردید که برنامه به صورت محلی در یک کانتینر داکر به خوبی اجرا می‌شود، می‌توانید کانتینر در حال اجرا را با Ctrl-> C متوقف کنید.

اکنون که تصویر طبق برنامه کار می‌کند، می‌توانید آن را به Google Container Registry ، یک مخزن خصوصی برای تصاویر Docker خود که از هر پروژه Google Cloud (و همچنین از خارج از Google Cloud Platform) قابل دسترسی است، ارسال کنید:

docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1

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

73558f3a54ce1c0c.png

اگر کنجکاو هستید، می‌توانید با دنبال کردن این لینک، تصاویر کانتینر را همانطور که در فضای ابری گوگل ذخیره شده‌اند، مرور کنید: https://console.cloud.google.com/storage/browser/ (لینک کامل نتیجه باید به این شکل باشد: https://console.cloud.google.com/project/ PROJECT_ID /storage/browser/).

۶. ایجاد یک کلاستر Kubernetes/GKE با Istio

ابتدا مطمئن شوید که Kubernetes Engine API را فعال کرده‌اید:

gcloud services enable container.googleapis.com

یک کلاستر Kubernetes ایجاد کنید. در صورت تمایل می‌توانید منطقه را به جایی نزدیک به خودتان تغییر دهید:

gcloud container clusters create hello-istio \
  --cluster-version=latest \
  --machine-type=n1-standard-2 \
  --num-nodes=4 \
  --region europe-west1

چند لحظه صبر کنید تا کلاستر شما تنظیم شود. این کلاستر در بخش Kubernetes Engine کنسول Google Cloud Platform قابل مشاهده خواهد بود.

e46fd9c6ee82bcc4.png

برای این codelab، ما Istio را از istio.io دانلود و نصب خواهیم کرد. گزینه‌های نصب دیگری نیز وجود دارد، از جمله افزونه Istio برای GKE و Anthos Service Mesh . مراحل نصب پس از این مرحله، روی هر نصب Istio کار خواهد کرد.

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

curl -L https://istio.io/downloadIstio | sh -

این اسکریپت نسخه Istio دانلود شده را به شما نشان می‌دهد:

Istio has been successfully downloaded into the istio-1.8.1 folder on your system.

دایرکتوری نصب شامل برنامه‌های نمونه و فایل باینری کلاینت istioctl است. به آن دایرکتوری بروید:

cd istio-1.8.1

دستور ارائه شده را کپی و جایگذاری کنید تا دایرکتوری bin به PATH شما اضافه شود، بنابراین می‌توانید istioctl استفاده کنید:

export PATH="$PATH:/home/<YOURHOMEID>/istio-1.8.1/bin"

با بررسی آمادگی کلاستر برای Istio، تأیید کنید که istioctl در دسترس است:

istioctl x precheck

باید پیامی مبنی بر Install Pre-Check passed! The cluster is ready for Istio installation.

نصب Istio با پروفایل دمو:

istioctl install --set profile=demo

Istio اکنون در کلاستر شما نصب شده است.

تزریق خودکار در اتاقک خودرو

برای شروع استفاده از Istio، نیازی به ایجاد هیچ تغییری در برنامه ندارید. هنگام پیکربندی و اجرای سرویس‌ها، Envoy sidecarها به طور خودکار به هر pod مربوط به سرویس تزریق می‌شوند.

برای اینکه این کار انجام شود، باید تزریق sidecar را برای فضای نام ('default') که برای میکروسرویس‌های خود استفاده می‌کنید، فعال کنید. این کار را با اعمال یک برچسب انجام می‌دهید:

kubectl label namespace default istio-injection=enabled

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

kubectl get namespace -L istio-injection

خروجی تأیید می‌کند که تزریق sidecar برای فضای نام پیش‌فرض فعال شده است:

NAME              STATUS   AGE    ISTIO-INJECTION
default           Active   3m     enabled
istio-system      Active   63s    disabled
...

۷. نصب را تأیید کنید

Istio با سه سرویس ارائه می‌شود: صفحه کنترل istiod و دروازه‌های ورودی و خروجی (که می‌توانید آنها را به عنوان "پروکسی‌های جانبی برای بقیه اینترنت" در نظر بگیرید) که به ترتیب istio-ingressgateway و istio-egressgateway نام دارند.

kubectl get svc -n istio-system

خروجی شما باید به این شکل باشد:

NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP                                                                     AGE
istio-egressgateway    ClusterIP      10.55.252.182   <none>
istio-ingressgateway   LoadBalancer   10.55.250.185   35.233.118.42
istiod                 ClusterIP      10.55.253.217   <none>

Ingress Gateway نوعی LoadBalancer دارد، بنابراین از طریق اینترنت قابل دسترسی است؛ بقیه فقط باید از داخل کلاستر قابل دسترسی باشند.

در مرحله بعد، مطمئن شوید که غلاف‌های Kubernetes مربوطه مستقر شده‌اند و همه کانتینرها فعال و در حال اجرا هستند:

kubectl get pods -n istio-system

وقتی همه پادها در حال اجرا هستند، می‌توانید ادامه دهید.

NAME                                    READY   STATUS
istio-egressgateway-674988f895-m6tk4    1/1     Running
istio-ingressgateway-6996f7dcc8-7lvm2   1/1     Running
istiod-6bf5fc8b64-j79hj                 1/1     Running
  • istiod : صفحه کنترل Istio. پیکربندی و برنامه‌نویسی پروکسی سایدکارها، کشف سرویس، توزیع گواهی و تزریق سایدکار را مدیریت می‌کند.
  • ingress gateway : درخواست‌های ورودی از خارج از کلاستر شما را مدیریت می‌کند.
  • egress gateway : درخواست‌های خروجی به نقاط انتهایی خارج از کلاستر شما را مدیریت می‌کند.

۸. برنامه را مستقر کنید

اکنون که تأیید کرده‌اید که Istio نصب و اجرا شده است، می‌توانید برنامه ASP.NET Core را مستقر کنید.

استقرار و خدمات

ابتدا، یک فایل aspnetcore.yaml با استفاده از ویرایشگر مورد علاقه خود ( vim, nano,emacs یا ویرایشگر کد Cloud Shell) ایجاد کنید و Kubernetes Deployment و Service را برای برنامه تعریف کنید:

apiVersion: v1
kind: Service
metadata:
  name: aspnetcore-service
  labels:
    app: aspnetcore
spec:
  ports:
  - port: 8080
    name: http
  selector:
    app: aspnetcore
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: aspnetcore-v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: aspnetcore
      version: v1
  template:
    metadata:
      labels:
        app: aspnetcore
        version: v1
    spec:
      containers:
      - name: aspnetcore
        image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

محتویات این فایل، Deployments و Services استاندارد برای استقرار برنامه هستند و هیچ چیز خاصی مربوط به Istio ندارند.

سرویس‌ها را با استفاده از kubectl در فضای نام پیش‌فرض مستقر کنید:

kubectl apply -f aspnetcore.yaml
service "aspnetcore-service" created
deployment.extensions "aspnetcore-v1" created

تأیید کنید که پادها در حال اجرا هستند:

kubectl get pods
NAME                          READY     STATUS    RESTARTS   AGE
aspnetcore-v1-6cf64748-mddb   2/2       Running   0          34s

درگاه و سرویس مجازی

برای اینکه به ترافیک ورودی اجازه ورود به شبکه داده (mesh) داده شود، باید یک Gateway و یک VirtualService ایجاد کنید.

یک دروازه (Gateway) یک متعادل‌کننده بار (load balancer) را برای ترافیک HTTP/TCP پیکربندی می‌کند، که معمولاً در لبه شبکه (mesh) عمل می‌کند تا ترافیک ورودی برای یک برنامه را فعال کند. یک سرویس مجازی (VirtualService) قوانینی را تعریف می‌کند که نحوه مسیریابی درخواست‌ها برای یک سرویس را در یک شبکه سرویس Istio کنترل می‌کنند.

یک فایل aspnetcore-gateway.yaml برای تعریف Gateway ایجاد کنید:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: aspnetcore-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

یک فایل aspnetcore-virtualservice.yaml برای تعریف VirtualService ایجاد کنید:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: aspnetcore-virtualservice
spec:
  hosts:
  - "*"
  gateways:
  - aspnetcore-gateway
  http:
  - route:
    - destination:
        host: aspnetcore-service

دستور kubectl را برای استقرار Gateway با دستور زیر اجرا کنید:

kubectl apply -f aspnetcore-gateway.yaml

دستور خروجی زیر را تولید می‌کند:

gateway.networking.istio.io "aspnetcore-gateway" created

سپس، دستور زیر را برای استقرار VirtualService اجرا کنید:

kubectl apply -f aspnetcore-virtualservice.yaml

دستور خروجی زیر را تولید می‌کند:

virtualservice.networking.istio.io "aspnetcore-virtualservice" created

تأیید کنید که همه چیز در حال اجرا است:

kubectl get gateway
NAME                      AGE
aspnetcore-gateway   28s
kubectl get virtualservice
NAME                             AGE
aspnetcore-virtualservice   33s

تبریک! شما به تازگی یک برنامه با قابلیت Istio را مستقر کرده‌اید. در مرحله بعد، برنامه را در حال استفاده مشاهده می‌کنید.

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

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

kubectl get svc istio-ingressgateway -n istio-system

آدرس IP و پورت خارجی را به یک متغیر GATEWAY_URL صادر کنید:

export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')

export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

برای آزمایش برنامه curl استفاده کنید. سرویس باید با کد پاسخ 200 پاسخ دهد:

curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/

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

f579a9baedc108a9.png

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

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

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

مراحل بعدی

مجوز

این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.

۱۱. پاکسازی

اگر قصد ادامه دادن به بخش دوم آزمایش را ندارید، می‌توانید برنامه را حذف کرده و Istio را نیز از سیستم حذف کنید یا می‌توانید به سادگی کلاستر Kubernetes را حذف کنید.

برنامه را حذف کنید

برای حذف برنامه:

kubectl delete -f aspnetcore-gateway.yaml
Kubectl delete -f aspnetcore-virtualservice.yaml
kubectl delete -f aspnetcore.yaml

برای تأیید حذف برنامه:

kubectl get gateway 
kubectl get virtualservices 
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-istio