برنامه ASP.NET Core را روی Kubernetes در Google Kubernetes Engine قرار دهید

1. بررسی اجمالی

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

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

در این آزمایشگاه، یک برنامه ساده ASP.NET Core را روی Kubernetes که روی Kubernetes Engine اجرا می شود، مستقر می کنید. این Codelab بر روی ساخت و راه اندازی برنامه ASP.NET Core از Google Cloud Shell Codelab ساخته شده است. ممکن است بخواهید قبل از اقدام به این آزمایشگاه ابتدا آن آزمایشگاه را انجام دهید.

هدف این برنامه کد این است که شما کد خود را (یک برنامه ساده Hello World ASP.NET Core در اینجا) به یک برنامه تکراری در حال اجرا در Kubernetes تبدیل کنید. کدی را که بر روی دستگاه خود توسعه داده‌اید، می‌گیرید، آن را به یک تصویر ظرف Docker تبدیل می‌کنید و سپس آن تصویر را در Google Kubernetes Engine اجرا می‌کنید.

در اینجا نموداری از قسمت های مختلف در حال بازی در این کد لبه وجود دارد تا به شما کمک کند تا بفهمید که چگونه قطعات با هم قرار می گیرند. از این به عنوان یک مرجع در حین پیشرفت در نرم افزار کد استفاده کنید. تا زمانی که به انتها برسید، همه چیز باید منطقی باشد (اما فعلاً این را نادیده بگیرید).

7dbdc973aceef1af.jpeg

برای اهداف این نرم افزار کد، استفاده از یک محیط مدیریت شده مانند Kubernetes Engine (نسخه میزبان گوگل Kubernetes که بر روی Compute Engine اجرا می شود) به شما این امکان را می دهد که به جای راه اندازی زیرساخت های زیربنایی، بر روی تجربه Kubernetes تمرکز کنید.

اگر علاقه مند به اجرای Kubernetes بر روی دستگاه محلی خود، مانند یک لپ تاپ توسعه، هستید، احتمالاً باید Minikube را بررسی کنید. این یک راه اندازی ساده از یک خوشه kubernetes تک گره را برای اهداف توسعه و آزمایش ارائه می دهد. در صورت تمایل می توانید از Minikube برای مرور این کدها استفاده کنید.

چیزی که یاد خواهید گرفت

  • چگونه یک برنامه ساده ASP.NET Core را به عنوان یک ظرف Docker بسته بندی کنیم.
  • نحوه ایجاد خوشه Kubernetes خود در Google Kubernetes Engine (GKE).
  • نحوه استقرار برنامه ASP.NET Core در یک پاد.
  • نحوه اجازه دادن به ترافیک خارجی به پاد خود
  • چگونه خدمات خود را افزایش دهید و ارتقا دهید.
  • نحوه اجرای داشبورد گرافیکی Kubernetes

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

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

فقط از طریق آن را بخوانید آن را بخوانید و تمرینات را کامل کنید

تجربه خود را با Google Cloud Platform چگونه ارزیابی می کنید؟

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

2. راه اندازی و الزامات

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. شما می توانید آن را در هر زمان به روز کنید.
  • شناسه پروژه باید در تمام پروژه‌های Google Cloud منحصربه‌فرد باشد و تغییرناپذیر باشد (پس از تنظیم نمی‌توان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید به شناسه پروژه ارجاع دهید (معمولاً به عنوان PROJECT_ID شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، می‌توانید خودتان را امتحان کنید و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند.
  • برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
  1. در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. برای اینکه منابع را خاموش کنید تا بیش از این آموزش متحمل صورتحساب نشوید، می توانید منابعی را که ایجاد کرده اید حذف کنید یا کل پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.

Cloud Shell را راه اندازی کنید

در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.

Cloud Shell را فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell کلیک کنید 853e55310c205094.png .

55efc1aaa7a4d3ad.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.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 را خواهید دید:

f42271880ce4d572.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:6.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:6.0-alpine-amd64 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 را در یک تب جدید ببینید.

f42271880ce4d572.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 می تواند به آن دسترسی داشته باشد و همانطور که در عرض چند دقیقه خواهید دید، آن را هماهنگ کند.

576374602b52f4e4.png

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

6. خوشه Kubernetes ایجاد کنید

خوب، شما اکنون آماده ایجاد کلاستر GKE خود هستید، اما قبل از آن، به بخش Google Kubernetes Engine در کنسول وب بروید و منتظر بمانید تا سیستم مقداردهی اولیه شود (فقط چند ثانیه طول می کشد).

d5f6e3c267feea1a.png

یک خوشه از یک سرور API اصلی Kubernetes که توسط Google مدیریت می شود و مجموعه ای از گره های کارگر تشکیل شده است. گره های کارگر ماشین های مجازی Compute Engine هستند.

بیایید از gcloud CLI از جلسه CloudShell خود برای ایجاد یک خوشه استفاده کنیم. منطقه خود را در جایی نزدیک به خود تنظیم کنید ( لیست مناطق ). چند دقیقه طول می کشد تا کامل شود:

gcloud container clusters create hello-dotnet-cluster --cluster-version=latest --num-nodes 4 --zone europe-west1-b

در پایان باید خوشه ایجاد شده را مشاهده کنید.

Creating cluster hello-dotnet-cluster...done.
Created [https://container.googleapis.com/v1/projects/dotnet-atamel/zones/europe-west1-b/clusters/hello-dotnet-cluster].
kubeconfig entry generated for hello-dotnet-cluster.
NAME                  ZONE            MASTER_VERSION  
hello-dotnet-cluster  europe-west1-b  1.10.7-gke.6

اکنون باید یک خوشه Kubernetes کاملاً عملکردی داشته باشید که توسط Google Kubernetes Engine طراحی شده است:

eefb8d9b7f39598b.png

اکنون زمان آن است که برنامه کانتینری خود را در خوشه Kubernetes مستقر کنید! از این پس از خط فرمان kubectl (که قبلاً در محیط Cloud Shell شما راه اندازی شده است) استفاده خواهید کرد. بقیه این کد لبه نیاز دارد که هم نسخه سرویس گیرنده و هم نسخه سرور kubernetes 1.2 یا بالاتر باشد. kubectl version نسخه فعلی دستور را به شما نشان می دهد.

7. ایجاد استقرار

غلاف kubernetes گروهی از ظروف است که به منظور مدیریت و شبکه سازی به هم گره خورده اند. این می تواند شامل یک ظرف یا چند ظرف باشد. در اینجا شما به سادگی از یک ظرف ساخته شده با تصویر هسته ASP.NET خود که در رجیستری کانتینر خصوصی شما ذخیره شده است استفاده می کنید. این محتوا در پورت 8080 ارائه می شود.

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

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: hello-dotnet
  name: hello-dotnet
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: hello-dotnet
  template:
    metadata:
      labels:
        run: hello-dotnet
    spec:
      containers:
      - name: hello-dotnet
        image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

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

kubectl apply -f hello-dotnet.yaml
deployment.apps/hello-dotnet created

همانطور که می بینید، یک شیء استقرار ایجاد کرده اید. استقرارها روش توصیه شده برای ایجاد و مقیاس‌بندی پادها هستند. در اینجا، یک استقرار جدید یک ماکت غلاف واحد را مدیریت می کند که تصویر hello-dotnet:v1 اجرا می کند.

برای مشاهده استقراری که ایجاد کرده اید، به سادگی اجرا کنید:

kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   1         1         1            1           37s

برای مشاهده پاد ایجاد شده توسط Deployment، این دستور را اجرا کنید:

kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-ztzrb   1/1       Running   0          57s

اکنون زمان خوبی برای اجرای برخی از دستورات جالب kubectl است (هیچ یک از اینها وضعیت خوشه را تغییر نمی دهد، اسناد کامل در اینجا موجود است):

kubectl get pods
kubectl cluster-info
kubectl config view
kubectl get events
kubectl logs <pod-name>

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

8. اجازه ترافیک خارجی را بدهید

به طور پیش‌فرض، غلاف تنها با IP داخلی آن در خوشه قابل دسترسی است. برای اینکه کانتینر hello-dotnet از خارج از شبکه مجازی kubernetes قابل دسترسی باشد، باید pod را به عنوان یک سرویس kubernetes در معرض دید قرار دهید.

از Cloud Shell می‌توانید با دستور kubectl expose همراه با پرچم --type="LoadBalancer" غلاف را در اینترنت عمومی قرار دهید. این پرچم برای ایجاد یک IP قابل دسترسی خارجی مورد نیاز است:

kubectl expose deployment hello-dotnet --type="LoadBalancer" --port=8080

پرچم استفاده شده در این دستور مشخص می‌کند که شما از بار متعادل کننده ارائه شده توسط زیرساخت اصلی (در این مورد Compute Engine load balancer ) استفاده می‌کنید. توجه داشته باشید که استقرار را در معرض نمایش می گذارید، نه پاد را مستقیما. این باعث می‌شود که سرویس به‌دست‌آمده، ترافیک تعادلی را در تمام پادهای مدیریت شده توسط استقرار بارگیری کند (در این مورد فقط 1 پاد، اما بعداً کپی‌های بیشتری اضافه خواهید کرد).

استاد Kubernetes متعادل کننده بار و قوانین حمل و نقل موتور محاسباتی مرتبط، استخرهای هدف و قوانین فایروال را ایجاد می کند تا سرویس را به طور کامل از خارج از Google Cloud Platform در دسترس قرار دهد.

برای یافتن آدرس IP قابل دسترسی عمومی سرویس، به سادگی از kubectl درخواست کنید تا تمام خدمات خوشه را فهرست کند:

kubectl get services
NAME         CLUSTER-IP     EXTERNAL-IP      PORT(S)    AGE
hello-dotnet 10.3.253.62   104.155.20.69   8080/TCP    1m
kubernetes   10.3.240.1     <none>           443/TCP    5m

توجه داشته باشید که 2 آدرس IP برای سرویس شما فهرست شده است که هر دو درگاه 8080 را ارائه می دهند. یکی IP داخلی است که فقط در داخل شبکه مجازی ابری شما قابل مشاهده است. دیگری IP خارجی با بار متعادل است. در این مثال، آدرس IP خارجی 104.155.20.69 است.

اکنون باید بتوانید با اشاره مرورگر خود به این آدرس به سرویس دسترسی پیدا کنید: http://<EXTERNAL_IP> :8080

6b053874002827fe.png

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

9. خدمات خود را مقیاس کنید

یکی از ویژگی های قدرتمند ارائه شده توسط Kubernetes این است که مقیاس کردن برنامه شما چقدر آسان است. فرض کنید به طور ناگهانی به ظرفیت بیشتری برای برنامه خود نیاز دارید. شما به سادگی می توانید به کنترل کننده تکرار بگویید که تعداد جدیدی از ماکت ها را برای غلاف شما مدیریت کند:

kubectl scale deployment hello-dotnet --replicas=4
kubectl get deployment
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   4         4         4            3           16m
kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m
hello-dotnet-714049816-sh812   1/1       Running   0          1m
hello-dotnet-714049816-ztzrb   1/1       Running   0          16m

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

در اینجا نموداری است که وضعیت خوشه Kubernetes شما را خلاصه می کند:

6af0243662464ca9.png

شما همچنین می توانید خدمات خود را به راحتی کاهش دهید. در اینجا نحوه کاهش مقیاس از 4 غلاف به 2 غلاف آمده است.

kubectl scale deployment hello-dotnet --replicas=2
kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m

10. آزمون انعطاف پذیری

Kubernetes (یا به طور خاص ReplicaSet) پادهای شما را تماشا می‌کند و اگر مشکلی در پاد وجود داشته باشد و پایین بیاید، فوراً یک غلاف جدید ایجاد می‌کند. بیایید این را آزمایش کنیم و ببینیم چگونه کار می کند.

ابتدا لیست غلاف ها را دریافت کنید:

kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m

با وارد کردن نام غلاف یکی از پادها را حذف کنید:

kubectl delete pod hello-dotnet-714049816-g4azy

اگر دوباره به لیست پادها نگاه کنید، می‌بینید که یک پاد جدید ایجاد شده و بلافاصله دوباره اجرا می‌شود:

kubectl get pods
NAME                         READY     STATUS           RESTARTS   AGE
hello-dotnet-714049816-abczy   1/1    ContainerCreating  0          1m
hello-dotnet-714049816-rk0u6   1/1    Running            0          1m

11. سرویس خود را ارتقا دهید

در برخی موارد، برنامه‌ای که برای تولید به کار گرفته‌اید به رفع اشکال یا ویژگی‌های اضافی نیاز دارد. بیایید ببینیم که این روند چگونه به نظر می رسد.

ابتدا بیایید برنامه را اصلاح کنیم. ویرایشگر کد را از Cloud Shell باز کنید.

f487389b8b1cc105.png

به Index.cshtml زیر HelloWorldAspNetCore > Views > Home بروید و یکی از پیام های چرخ فلک را به روز کنید.

خط زیر را پیدا کنید:

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 آماده‌اید تا به‌راحتی کنترلر تکرار شما را به نسخه جدید برنامه به‌روزرسانی کند. به منظور تغییر برچسب تصویر برای ظرف در حال اجرا خود، باید hello-dotnet deployment موجود را ویرایش کنید و تصویر را از gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1 به gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 تغییر دهید. gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 .

برای این کار از دستور kubectl edit استفاده می کنید. با این کار یک ویرایشگر متن باز می شود که پیکربندی کامل یامل استقرار را نمایش می دهد. در حال حاضر نیازی به درک کامل پیکربندی yaml نیست، در عوض فقط درک کنید که با به‌روزرسانی فیلد spec.template.spec.containers.image در پیکربندی، به Deployment می‌گویید که پادها را برای استفاده از تصویر جدید به‌روزرسانی کند.

kubectl edit deployment hello-dotnet
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: 2017-01-06T10:05:28Z
  generation: 3
  labels:
    run: hello-dotnet
  name: hello-dotnet
  namespace: default
  resourceVersion: "151017"
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/hello-dotnet
  uid: 981fe302-f1e9-11e5-9a78-42010af00005
spec:
  replicas: 4
  selector:
    matchLabels:
      run: hello-dotnet
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: hello-dotnet
    spec:
      containers:
      - image: gcr.io/PROJECT_ID/hello-dotnet:v1 # Update this line
        imagePullPolicy: IfNotPresent
        name: hello-dotnet
        ports:
        - containerPort: 8080
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      securityContext: {}
      terminationGracePeriodSeconds: 30

پس از انجام تغییر، فایل را ذخیره کرده و ببندید (این از vi استفاده می کند، بنابراین Esc را فشار دهید، سپس عبارت :wq تایپ کنید و کلید Enter را فشار دهید).

deployment "hello-dotnet" edited

این استقرار را با تصویر جدید به روز می کند و باعث می شود که پادهای جدید با تصویر جدید ایجاد شوند و پادهای قدیمی حذف شوند.

kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   4         5         4            3           1h

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

fb9f41e814dda653.png

می‌توانید جزئیات بیشتری در مورد به‌روزرسانی‌های متحرک در اسناد Kubernetes بیابید.

امیدواریم با این ویژگی‌های استقرار، مقیاس‌گذاری و به‌روزرسانی موافقت کنید که وقتی محیط خود را راه‌اندازی کردید (خوشه GKE/Kubernetes در اینجا)، Kubernetes می‌تواند به شما کمک کند به جای مدیریت زیرساخت، روی برنامه خود تمرکز کنید.

12. ساخت ابر

تا کنون، ما در حال ساخت کانتینرهایی با دستورات Docker معمولی بوده‌ایم (docker build ...)، و سپس به صورت دستی تصویر را در رجیستری کانتینر Google Cloud Platform قرار داده‌ایم. همچنین می‌توان هر دو مرحله را به سمت سرور Cloud Build موکول کرد، که می‌تواند تصویر کانتینر را بدون نصب محلی Docker بسازد و فشار دهد.

ابتدا، Cloud Build API را در API Manager > Library فعال کنید. Cloud Build را جستجو کنید، روی Cloud Build API کلیک کنید:

f8b0239fa7719f29.png

اگر قبلاً فعال نشده است، روی Enable API کلیک کنید. در پایان، باید API را به صورت زیر فعال کنید:

ea6053f9603613b5.png

هنگامی که Cloud Build API فعال شد، می‌توانید دستور زیر را برای ساخت و فشار دادن تصویر خود از سرویس Container Builder اجرا کنید:

$ gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v3

تصویر به طور خودکار در Container Registry ذخیره می شود.

13. داشبورد گرافیکی Kubernetes را اجرا کنید

با نسخه های اخیر Kubernetes، یک رابط کاربری گرافیکی وب (داشبورد) معرفی شده است. این رابط کاربری به شما اجازه می دهد تا به سرعت شروع کنید و برخی از عملکردهای موجود در CLI را به عنوان روشی قابل دسترسی تر و قابل کشف تر برای تعامل با سیستم فعال می کند.

برای پیکربندی دسترسی به داشبورد خوشه Kubernetes، از پنجره Cloud Shell، این دستورات را تایپ کنید:

gcloud container clusters get-credentials hello-dotnet-cluster \
    --zone europe-west1-b --project ${GOOGLE_CLOUD_PROJECT}
kubectl proxy --port 8081

و سپس یک بار دیگر از ویژگی پیش نمایش Cloud Shell برای رفتن به پورت 8081 استفاده کنید:

port8081.png

این باید شما را به نقطه پایانی API بفرستد. ممکن است یک صفحه "غیر مجاز" دریافت کنید اما نگران آن نباشید. برای رسیدن به داشبورد، "?authuser=3" را حذف کرده و " /ui " را جایگزین آن کنید.

از داشبورد گرافیکی Kubernetes لذت ببرید و از آن برای استقرار برنامه های کانتینری و همچنین برای نظارت و مدیریت خوشه های خود استفاده کنید!

177789527b650f6b.png

همچنین می‌توانید با استفاده از دستورالعمل‌های مشابهی که از کنسول وب، دکمه «اتصال» را برای خوشه‌ای که می‌خواهید نظارت کنید، فشار دهید، از یک برنامه‌نویس یا ماشین محلی به داشبورد دسترسی پیدا کنید.

da1ccc707dd6647.png

a51c7160e237f32f.png

پس از اتمام کار با داشبورد، می توانید برای متوقف کردن پروکسی، Control + C را انجام دهید. با شرکت در تور داشبورد درباره داشبورد Kubernetes بیشتر بدانید.

14. ورود به سیستم

شما می توانید از دستور kubectl logs برای بازیابی گزارش های یک کانتینر در حال اجرا در داخل Kubernetes استفاده کنید. وقتی از Google Kubernetes Engine برای اجرای خوشه های Kubernetes مدیریت شده استفاده می کنید، همه گزارش ها به طور خودکار در Google Cloud Logging ارسال و ذخیره می شوند. با رفتن به StackdriverLogging → Logs در کنسول Google Cloud می توانید تمام خروجی گزارش از پادها را مشاهده کنید:

b63159b959ba5010.png

پس از ورود به کنسول گزارش، می توانید به GKE Container بروید تا همه گزارش های جمع آوری شده از STDOUT را ببینید:

43e9aab3e02358d5.png

از اینجا، می‌توانید به‌صورت اختیاری گزارش‌ها را برای تجزیه و تحلیل گزارش بیشتر یا تنظیم هشدار مبتنی بر گزارش به Google BigQuery صادر کنید. امروز در طول آزمایشگاه این کار را نخواهیم کرد.

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

با این کار شروع ساده کد لبه با ASP.NET Core و Kubernetes به پایان می رسد. ما فقط سطح این فناوری را خراشیده‌ایم و شما را تشویق می‌کنیم که با غلاف‌ها، کنترل‌کننده‌های تکرار و سرویس‌های خود بیشتر کاوش کنید، اما همچنین کاوشگرهای زنده بودن (بررسی سلامت) را بررسی کنید و مستقیماً از Kubernetes API استفاده کنید.

پاک کن

همین! زمان برای تمیز کردن منابع مورد استفاده (برای صرفه جویی در هزینه و تبدیل شدن به یک شهروند ابری خوب).

Deployment (که پادهای در حال اجرا را نیز حذف می کند) و Service (که متعادل کننده بار خارجی شما را نیز حذف می کند) را حذف کنید:

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

kubectl delete service,deployment hello-dotnet
service "hello-dotnet" deleted
deployment "hello-dotnet" deleted

در مرحله بعد، خوشه خود را حذف کنید:

gcloud container clusters delete hello-dotnet-cluster --zone=europe-west1-b
The following clusters will be deleted.
 - [hello-dotnet-cluster] in [europe-west1-b]
Do you want to continue (Y/n)?  Y
Deleting cluster hello-dotnet-cluster...done.                                                                                                                                                                                            
Deleted [https://container.googleapis.com/v1/projects/<PROJECT_ID>/zones/europe-west1-b/clusters/hello-dotnet-cluster].

با این کار تمام نمونه‌های موتور محاسباتی Google که کلاستر را اجرا می‌کنند، حذف می‌شود.

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

gsutil ls
gs://artifacts.<PROJECT_ID>.appspot.com/
gsutil rm -r gs://artifacts.${GOOGLE_CLOUD_PROJECT}.appspot.com/
Removing gs://artifacts.<PROJECT_ID>.appspot.com/...
Removing gs://artifacts.<PROJECT_ID>.appspot.com/...

البته، می‌توانید کل پروژه را نیز حذف کنید، اما هرگونه تنظیم صورت‌حساب را که انجام داده‌اید از دست می‌دهید (اول باید صورتحساب پروژه را غیرفعال کنید). علاوه بر این، حذف یک پروژه تنها پس از پایان چرخه صورت‌حساب فعلی، تمام صورت‌حساب‌ها را متوقف می‌کند.

آنچه را پوشش داده ایم

  • چگونه یک برنامه ساده ASP.NET Core را به عنوان یک ظرف Docker بسته بندی کنیم.
  • چگونه خوشه Kubernetes خود را در Google Kubernetes Engine ایجاد کنیم.
  • نحوه استقرار برنامه ASP.NET Core در یک پاد.
  • نحوه اجازه دادن به ترافیک خارجی به پاد خود
  • چگونه خدمات خود را افزایش دهید و ارتقا دهید.
  • نحوه اجرای داشبورد گرافیکی Kubernetes

مراحل بعدی

مجوز

این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.