۱. مرور کلی
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 پیکربندی کنید.
آنچه نیاز دارید
چگونه از این آموزش استفاده خواهید کرد؟
تجربه خود را با پلتفرم ابری گوگل چگونه ارزیابی میکنید؟
۲. تنظیمات و الزامات
تنظیم محیط خودتنظیم
- وارد Cloud Console شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب Gmail یا Google Workspace ندارید، باید یکی ایجاد کنید .



شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژههای 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`
- دستور زیر را در 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.
برای تأیید اجرای برنامه، روی دکمه پیشنمایش وب در بالا سمت راست کلیک کنید و «پیشنمایش روی پورت ۸۰۸۰» را انتخاب کنید.

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

وقتی مطمئن شدید که برنامه در حال اجرا است، 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 استفاده کنید:

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

وقتی تأیید کردید که برنامه به صورت محلی در یک کانتینر داکر به خوبی اجرا میشود، میتوانید کانتینر در حال اجرا را با Ctrl-> C متوقف کنید.
اکنون که تصویر طبق برنامه کار میکند، میتوانید آن را به Google Container Registry ، یک مخزن خصوصی برای تصاویر Docker خود که از هر پروژه Google Cloud (و همچنین از خارج از Google Cloud Platform) قابل دسترسی است، ارسال کنید:
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1
اگر همه چیز خوب پیش برود و پس از مدتی، باید بتوانید تصویر کانتینر را که در بخش رجیستری کانتینر فهرست شده است، مشاهده کنید. در این مرحله، شما یک تصویر داکر در سطح پروژه دارید که Kubernetes میتواند به آن دسترسی داشته باشد و آن را هماهنگ کند، همانطور که در چند دقیقه آینده خواهید دید.

اگر کنجکاو هستید، میتوانید با دنبال کردن این لینک، تصاویر کانتینر را همانطور که در فضای ابری گوگل ذخیره شدهاند، مرور کنید: 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 قابل مشاهده خواهد بود.

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

۱۰. تبریک میگویم!
شما به تازگی یک برنامه ساده ASP.NET Core را در Kubernetes که روی Google Kubernetes Engine (GKE) اجرا میشود، مستقر کردهاید و آن را طوری پیکربندی کردهاید که توسط Istio مدیریت شود.
شاید از خود بپرسید «فایده Istio چیست؟». این سوال بسیار خوبی است. تاکنون، هیچ مزیتی در مدیریت این برنامه توسط Istio وجود نداشته است. در بخش دوم تمرین، ویژگیهای Istio مانند معیارها، ردیابی، مدیریت ترافیک پویا، تجسم سرویس و تزریق خطا را بیشتر بررسی خواهیم کرد.
مراحل بعدی
- استقرار برنامه ASP.NET Core در GKE با Istio (بخش 2) .
- درباره ایستیو بیشتر بدانید.
- درباره کوبرنتیز بیشتر بدانید.
- درباره موتور گوگل کوبرنتیز بیشتر بدانید.
- درباره .NET در پلتفرم ابری گوگل بیشتر بدانید.
مجوز
این اثر تحت مجوز عمومی 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