1. بررسی اجمالی
ASP.NET Core یک چارچوب متن باز و چند پلتفرمی برای ساخت اپلیکیشن های مدرن مبتنی بر ابر و متصل به اینترنت با استفاده از زبان برنامه نویسی سی شارپ است.
Kubernetes یک سیستم منبع باز برای خودکارسازی استقرار، مقیاس بندی و مدیریت برنامه های کاربردی کانتینری است. ایستیو یک چارچوب باز برای اتصال، ایمن سازی، مدیریت و نظارت بر خدمات است.
در این بخش اول از آزمایشگاه، یک برنامه ساده ASP.NET Core را روی Kubernetes که در موتور Google Kubernetes (GKE) اجرا میشود، مستقر میکنید و آن را به گونهای پیکربندی میکنید که توسط Istio مدیریت شود.
در بخش دوم آزمایشگاه، ویژگیهای Istio مانند معیارها، ردیابی، مدیریت ترافیک پویا، تزریق خطا و موارد دیگر را بیشتر بررسی میکنید.
چیزی که یاد خواهید گرفت
- نحوه ایجاد و بسته بندی یک برنامه ساده ASP.NET Core در ظرف Docker.
- نحوه ایجاد یک خوشه Kubernetes با Google Kubernetes Engine (GKE).
- نحوه نصب Istio روی خوشه Kubernetes در GKE.
- نحوه استقرار برنامه ASP.NET Core و پیکربندی ترافیک آن برای مدیریت Istio.
آنچه شما نیاز دارید
چگونه از این آموزش استفاده خواهید کرد؟
تجربه خود را با Google Cloud Platform چگونه ارزیابی می کنید؟
2. راه اندازی و الزامات
تنظیم محیط خود به خود
- به کنسول Cloud وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .
شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه های 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`
- دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد:
gcloud config list project
خروجی فرمان
[core] project = <PROJECT_ID>
اگر اینطور نیست، می توانید آن را با این دستور تنظیم کنید:
gcloud config set project <PROJECT_ID>
خروجی فرمان
Updated property [core/project].
3. یک برنامه 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.
4. برنامه ASP.NET Core را اجرا کنید
ما تقریباً آماده اجرای برنامه خود هستیم. به پوشه برنامه بروید.
cd HelloWorldAspNetCore
در نهایت برنامه را اجرا کنید.
dotnet run --urls=http://localhost:8080
برنامه شروع به گوش دادن در پورت 8080 می کند.
Hosting environment: Production
Content root path: /home/atameldev/HelloWorldAspNetCore
Now listening on: http://[::]:8080
Application started. Press Ctrl+C to shut down.
برای تأیید اینکه برنامه در حال اجرا است، روی دکمه پیشنمایش وب در بالا سمت راست کلیک کنید و «پیشنمایش در پورت 8080» را انتخاب کنید.
صفحه وب پیش فرض ASP.NET Core را خواهید دید:
هنگامی که تأیید کردید که برنامه در حال اجرا است، Ctrl+C را فشار دهید تا برنامه خاموش شود.
5. برنامه ASP.NET Core را در ظرف Docker بسته بندی کنید
در مرحله بعد، برنامه خود را برای اجرا به عنوان یک کانتینر آماده کنید. اولین قدم این است که ظرف و محتویات آن را تعریف کنید.
در فهرست اصلی برنامه، یک 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 را به صورت محلی در پورت 8080 از تصویر ظرف تازه ایجاد شده شما اجرا می کند:
docker run -p 8080:8080 gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1
و دوباره از ویژگی پیش نمایش وب CloudShell استفاده کنید:
شما باید صفحه وب پیش فرض ASP.NET Core را در یک تب جدید ببینید.
هنگامی که تأیید کردید که برنامه به صورت محلی در یک ظرف Docker به خوبی اجرا میشود، میتوانید با Ctrl-> C
کانتینر در حال اجرا را متوقف کنید.
اکنون که تصویر طبق برنامه کار میکند، میتوانید آن را به Google Container Registry فشار دهید، یک مخزن خصوصی برای تصاویر Docker شما که از هر پروژه Google Cloud (و همچنین از خارج از Google Cloud Platform) قابل دسترسی است:
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1
اگر همه چیز خوب پیش رفت و پس از مدتی، باید بتوانید تصویر کانتینر فهرست شده در بخش رجیستری کانتینر را مشاهده کنید. در این مرحله، اکنون یک تصویر Docker در سراسر پروژه در دسترس دارید که Kubernetes می تواند به آن دسترسی داشته باشد و همانطور که در عرض چند دقیقه خواهید دید، آن را هماهنگ کند.
اگر کنجکاو هستید، میتوانید تصاویر کانتینر را که در Google Cloud Storage ذخیره میشوند، با دنبال کردن این پیوند پیمایش کنید: https://console.cloud.google.com/storage/browser/ (لینک کامل حاصل باید از این فرم: https://console.cloud.google.com/project/ PROJECT_ID /storage/browser/).
6. یک خوشه 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 قابل مشاهده خواهد بود.
برای این کد لبه، Istio را از istio.io دانلود و نصب می کنیم. گزینه های نصب دیگری نیز وجود دارد، از جمله افزونه Istio برای GKE و Anthos Service Mesh . مراحل برنامه بعد از این مرحله روی هر نصب Istio کار می کند.
بیایید ابتدا کلاینت و نمونه های ایستیو را دانلود کنیم. صفحه انتشار Istio آرتیفکت های دانلودی را برای چندین سیستم عامل ارائه می دهد. در مورد ما، میتوانیم از یک دستور راحت برای دانلود و استخراج آخرین نسخه برای پلتفرم فعلی خود استفاده کنیم:
curl -L https://istio.io/downloadIstio | sh -
اسکریپت نسخه ایستیو را که دانلود شده است به شما می گوید:
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، نیازی به ایجاد هیچ تغییری در برنامه ندارید. هنگامی که سرویس ها را پیکربندی و اجرا می کنید، Envoy sidecars به طور خودکار به هر پاد برای سرویس تزریق می شود.
برای اینکه این کار انجام شود، باید تزریق car sidecar را برای فضای نام ("پیشفرض") که برای میکروسرویسهای خود استفاده میکنید، فعال کنید. شما این کار را با اعمال یک برچسب انجام می دهید:
kubectl label namespace default istio-injection=enabled
برای تأیید اینکه برچسب با موفقیت اعمال شده است، دستور زیر را اجرا کنید:
kubectl get namespace -L istio-injection
خروجی تأیید می کند که تزریق سایدکار برای فضای نام پیش فرض فعال است:
NAME STATUS AGE ISTIO-INJECTION default Active 3m enabled istio-system Active 63s disabled ...
7. نصب را بررسی کنید
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>
دروازه ورودی دارای یک نوع 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
: صفحه کنترل ایستیو. پیکربندی و برنامهنویسی پراکسیهای جانبی، کشف سرویس، توزیع گواهینامه و تزریق خودروی جانبی را کنترل میکند. -
ingress gateway
: درخواست های دریافتی از خارج از خوشه شما را مدیریت می کند. -
egress gateway
: درخواست های خروجی را به نقاط پایانی خارج از خوشه شما رسیدگی می کند.
8. برنامه را مستقر کنید
اکنون تأیید کردهاید که Istio نصب و اجرا شده است، میتوانید برنامه ASP.NET Core را مستقر کنید.
استقرار و خدمات
ابتدا یک فایل aspnetcore.yaml
با استفاده از ویرایشگر مورد علاقه خود (ویرایشگر کد vim, nano,emacs
یا Cloud Shell) ایجاد کنید و Kubernetes Deployment and 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 استاندارد برای استقرار برنامه است و حاوی هیچ چیز خاص ایستیو نیست.
سرویس ها را در فضای نام پیش فرض با 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
دروازه و سرویس مجازی
برای اجازه دادن به ترافیک ورودی برای رسیدن به مش، باید یک Gateway و یک VirtualService ایجاد کنید.
یک Gateway یک متعادل کننده بار را برای ترافیک HTTP/TCP پیکربندی می کند، که معمولاً در لبه مش کار می کند تا ترافیک ورودی را برای یک برنامه فعال کند. 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: - "*"
برای تعریف VirtualService یک فایل aspnetcore-virtualservice.yaml
ایجاد کنید:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - route: - destination: host: aspnetcore-service
برای استقرار Gateway دستور kubectl را اجرا کنید:
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 را اجرا کرده اید. بعد، برنامه در حال استفاده را مشاهده می کنید.
9. برنامه را تست کنید
در نهایت می توانید برنامه را در عمل مشاهده کنید. شما باید 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>
بروید تا برنامه را مشاهده کنید:
10. تبریک می گویم!
شما فقط یک برنامه ساده ASP.NET Core را در Kubernetes که در موتور Google Kubernetes (GKE) اجرا میشود مستقر کردهاید و آن را طوری پیکربندی کردهاید که توسط Istio مدیریت شود.
شاید از خود بپرسید "فایده ایستیو چیست؟" این یک سوال عالی است. تاکنون هیچ مزیتی برای مدیریت Istio این برنامه وجود ندارد. در بخش دوم آزمایشگاه، ویژگیهای Istio مانند معیارها، ردیابی، مدیریت ترافیک پویا، تجسم سرویس و تزریق خطا را بیشتر بررسی خواهیم کرد.
مراحل بعدی
- با Istio (قسمت 2) برنامه ASP.NET Core را در 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.yaml
برای تأیید اینکه برنامه از بین رفته است:
kubectl get gateway kubectl get virtualservices 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-istio