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

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. راه اندازی و الزامات

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

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه های 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 کلیک کنید 4292cbf4971c9786.png .

bce75f34b2c53987.png

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

70f315d7b402b476.png

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

fbe3a0674c982259.png

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز شما بارگذاری شده است. این دایرکتوری اصلی 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`
  1. دستور زیر را در 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» را انتخاب کنید.

Capture.PNG

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

f579a9baedc108a9.png

هنگامی که تأیید کردید که برنامه در حال اجرا است، 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 استفاده کنید:

اسکرین شات از 03/11/2015 17:20:22.png

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

f579a9baedc108a9.png

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

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

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

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

73558f3a54ce1c0c.png

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

e46fd9c6ee82bcc4.png

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

f579a9baedc108a9.png

10. تبریک می گویم!

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

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

مراحل بعدی

مجوز

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