۱. مرور کلی
ASP.NET Core یک چارچوب متنباز و چندسکویی جدید برای ساخت برنامههای مدرن مبتنی بر ابر و متصل به اینترنت با استفاده از زبان برنامهنویسی C# است.
کوبرنتیز یک پروژه متنباز است که میتواند در محیطهای مختلفی اجرا شود، از لپتاپها گرفته تا کلاسترهای چندگرهای با دسترسی بالا، از ابرهای عمومی گرفته تا استقرارهای درون سازمانی، و از ماشینهای مجازی گرفته تا سیستمهای فیزیکی ساده.
در این آزمایش، شما یک برنامه ساده ASP.NET Core را روی Kubernetes که روی Kubernetes Engine اجرا میشود، مستقر میکنید. این آزمایشگاه کد بر اساس ساخت و راهاندازی برنامه ASP.NET Core از آزمایشگاه کد Google Cloud Shell ساخته شده است. بهتر است قبل از انجام این آزمایش، ابتدا آن آزمایش را انجام دهید.
هدف این آزمایشگاه کد این است که شما کد خود (یک برنامه ساده Hello World ASP.NET Core در اینجا) را به یک برنامه تکثیر شده که روی Kubernetes اجرا میشود، تبدیل کنید. شما کدی را که روی دستگاه خود توسعه دادهاید، به یک تصویر کانتینر Docker تبدیل میکنید و سپس آن تصویر را روی Google Kubernetes Engine اجرا میکنید.
در اینجا نموداری از بخشهای مختلف این آزمایشگاه کد آمده است تا به شما در درک نحوهی کنار هم قرار گرفتن قطعات کمک کند. در حین پیشرفت در آزمایشگاه کد، از این به عنوان مرجع استفاده کنید؛ وقتی به پایان میرسید، همه چیز باید منطقی به نظر برسد (اما فعلاً میتوانید از این مورد صرف نظر کنید).

برای هدف این آزمایشگاه کد، استفاده از یک محیط مدیریتشده مانند Kubernetes Engine (نسخهای از Kubernetes که توسط گوگل میزبانی میشود و روی Compute Engine اجرا میشود) به شما این امکان را میدهد که بیشتر بر روی تجربه Kubernetes تمرکز کنید تا راهاندازی زیرساختهای اساسی.
اگر به اجرای Kubernetes روی دستگاه محلی خود، مانند یک لپتاپ توسعه، علاقهمند هستید، احتمالاً باید Minikube را بررسی کنید. این ابزار، راهاندازی سادهای از یک کلاستر kubernetes تک گرهای را برای اهداف توسعه و آزمایش ارائه میدهد. در صورت تمایل میتوانید از Minikube برای بررسی این آزمایشگاه کد استفاده کنید.
آنچه یاد خواهید گرفت
- چگونه یک برنامه ساده ASP.NET Core را به عنوان یک کانتینر داکر بستهبندی کنیم؟
- چگونه خوشه Kubernetes خود را در Google Kubernetes Engine (GKE) ایجاد کنیم.
- چگونه برنامه ASP.NET Core خود را روی یک پاد (pod) مستقر کنیم؟
- چگونه به ترافیک خارجی اجازه ورود به پاد خود را بدهیم.
- چگونه سرویس خود را گسترش داده و ارتقاء دهید.
- نحوه اجرای داشبورد گرافیکی Kubernetes.
آنچه نیاز دارید
چگونه از این آموزش استفاده خواهید کرد؟
تجربه خود را با پلتفرم ابری گوگل چگونه ارزیابی میکنید؟
۲. تنظیمات و الزامات
تنظیم محیط خودتنظیم
- وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .



- نام پروژه ، نام نمایشی برای شرکتکنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمیشود. میتوانید آن را در هر زمانی بهروزرسانی کنید.
- شناسه پروژه باید در تمام پروژههای گوگل کلود منحصر به فرد باشد و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید میکند؛ معمولاً برای شما مهم نیست که چیست. در اکثر آزمایشگاههای کد، باید شناسه پروژه را ارجاع دهید (که معمولاً با عنوان
PROJECT_IDشناخته میشود). اگر شناسه تولید شده را دوست ندارید، میتوانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، میتوانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی خواهد ماند. - برای اطلاع شما، یک مقدار سوم هم وجود دارد، شماره پروژه که برخی از APIها از آن استفاده میکنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
- در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد، اگر اصلاً هزینهای نداشته باشد، هزینه زیادی نخواهد داشت. برای خاموش کردن منابع به طوری که پس از این آموزش متحمل پرداخت صورتحساب نشوید، میتوانید منابعی را که ایجاد کردهاید یا کل پروژه را حذف کنید. کاربران جدید 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: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 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 خود هستید، اما قبل از آن، به بخش Google Kubernetes Engine در کنسول وب بروید و منتظر بمانید تا سیستم راهاندازی شود (فقط چند ثانیه طول میکشد).

یک کلاستر شامل یک سرور API اصلی Kubernetes است که توسط گوگل مدیریت میشود و مجموعهای از گرههای کارگر. گرههای کارگر، ماشینهای مجازی Compute Engine هستند.
بیایید از رابط خط فرمان gcloud از جلسه 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 پشتیبانی میشود:

اکنون زمان آن رسیده است که برنامه کانتینر شده خود را در کلاستر Kubernetes مستقر کنید! از این پس از خط فرمان kubectl (که از قبل در محیط Cloud Shell شما تنظیم شده است) استفاده خواهید کرد. ادامه این آزمایشگاه کد نیاز دارد که نسخه کلاینت و سرور kubernetes 1.2 یا بالاتر باشد. kubectl version نسخه فعلی دستور را به شما نشان میدهد.
۷. ایجاد استقرار
یک kubernetes pod گروهی از کانتینرها است که برای اهداف مدیریت و شبکه به هم متصل شدهاند. میتواند شامل یک یا چند کانتینر باشد. در اینجا شما به سادگی از یک کانتینر ساخته شده با تصویر ASP.NET Core خود که در رجیستری کانتینر خصوصی شما ذخیره شده است، استفاده خواهید کرد. این کانتینر محتوا را روی پورت ۸۰۸۰ ارائه میدهد.
با استفاده از ویرایشگر مورد علاقه خود ( vim, nano,emacs یا ویرایشگر کد Cloud Shell) یک فایل hello-dotnet.yaml ایجاد کنید و Kubernetes Deployment را برای پاد تعریف کنید:
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
همانطور که میبینید، شما یک شیء deployment ایجاد کردهاید. Deployments روش پیشنهادی برای ایجاد و مقیاسبندی podها است. در اینجا، یک deployment جدید، یک کپی pod واحد را که image مربوط به hello-dotnet:v1 را اجرا میکند، مدیریت میکند.
برای مشاهدهی استقراری که ایجاد کردهاید، کافیست دستور زیر را اجرا کنید:
kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-dotnet 1 1 1 1 37s
برای مشاهده پاد ایجاد شده توسط استقرار، این دستور را اجرا کنید:
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 در حال اجرا باشد، اما هنوز باید آن را برای دنیای خارج قابل دسترسی کنید.
۸. اجازه دادن به ترافیک خارجی
به طور پیشفرض، پاد فقط از طریق IP داخلی خود در داخل کلاستر قابل دسترسی است. برای اینکه کانتینر hello-dotnet از خارج از شبکه مجازی kubernetes قابل دسترسی باشد، باید پاد را به عنوان یک سرویس kubernetes در معرض نمایش قرار دهید.
از طریق Cloud Shell میتوانید با استفاده از دستور kubectl expose به همراه فلگ --type="LoadBalancer" پاد را در معرض اینترنت عمومی قرار دهید. این فلگ برای ایجاد یک IP با دسترسی خارجی مورد نیاز است:
kubectl expose deployment hello-dotnet --type="LoadBalancer" --port=8080
پرچم استفاده شده در این دستور مشخص میکند که شما از متعادلکننده بار ارائه شده توسط زیرساخت اصلی (در این مورد متعادلکننده بار Compute Engine ) استفاده خواهید کرد. توجه داشته باشید که شما استقرار را در معرض دید قرار میدهید، نه مستقیماً پاد را. این باعث میشود سرویس حاصل، ترافیک را در تمام پادهای مدیریت شده توسط استقرار متعادل کند (در این مورد فقط ۱ پاد، اما بعداً کپیهای بیشتری اضافه خواهید کرد).
Kubernetes master، متعادلکننده بار و قوانین مربوط به ارسال موتور محاسباتی، مخازن هدف و قوانین فایروال را ایجاد میکند تا سرویس را از خارج از پلتفرم ابری گوگل کاملاً در دسترس قرار دهد.
برای یافتن آدرس 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
توجه داشته باشید که دو آدرس IP برای سرویس شما فهرست شده است که هر دو به پورت 8080 سرویس میدهند. یکی IP داخلی است که فقط در داخل شبکه مجازی ابری شما قابل مشاهده است؛ دیگری IP خارجی با بارگذاری متعادل است. در این مثال، آدرس IP خارجی 104.155.20.69 است.
اکنون باید بتوانید با قرار دادن مرورگر خود روی این آدرس به سرویس دسترسی پیدا کنید: http://<EXTERNAL_IP> :8080

در این مرحله، شما حداقل چندین ویژگی را از انتقال به کانتینرها و Kubernetes به دست آوردهاید - نیازی به مشخص کردن میزبان برای اجرای بار کاری خود ندارید و همچنین از نظارت و راهاندازی مجدد سرویس بهرهمند میشوید. بیایید ببینیم چه چیزهای دیگری میتوانید از زیرساخت جدید Kubernetes خود به دست آورید.
۹. خدمات خود را گسترش دهید
یکی از ویژگیهای قدرتمند ارائه شده توسط 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 شما را خلاصه میکند:

همچنین میتوانید به راحتی سرویس خود را کوچک کنید. در اینجا نحوهی کوچک کردن سرویس از ۴ پاد به ۲ پاد آورده شده است.
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
۱۰. تست تابآوری
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
۱۱. خدمات خود را ارتقا دهید
در برههای از زمان، برنامهای که به محیط عملیاتی منتقل کردهاید، نیاز به رفع اشکالات یا افزودن ویژگیهای جدید خواهد داشت. بیایید ببینیم این فرآیند چگونه خواهد بود.
ابتدا، بیایید برنامه را تغییر دهیم. ویرایشگر کد را از Cloud Shell باز کنید.

به مسیر HelloWorldAspNetCore > Views > Home در Index.cshtml بروید و یکی از پیامهای carousel را بهروزرسانی کنید.
خط زیر را پیدا کنید:
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 تغییر دهید.
برای انجام این کار، از دستور kubectl edit استفاده خواهید کرد. این دستور یک ویرایشگر متن را باز میکند که پیکربندی کامل yaml مربوط به deployment را نمایش میدهد. در حال حاضر نیازی به درک کامل پیکربندی yaml نیست، بلکه فقط کافی است بدانید که با بهروزرسانی فیلد spec.template.spec.containers.image در پیکربندی، به deployment میگویید که podها را برای استفاده از تصویر جدید بهروزرسانی کند.
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
در حین انجام این کار، کاربران سرویسها نباید هیچ وقفهای ببینند. پس از مدتی، آنها به نسخه جدید برنامه شما دسترسی پیدا خواهند کرد.

میتوانید جزئیات بیشتر در مورد بهروزرسانیهای چرخشی را در مستندات Kubernetes بیابید.
امیدوارم با این ویژگیهای استقرار، مقیاسبندی و بهروزرسانی، موافق باشید که پس از راهاندازی محیط خود (کلاستر GKE/Kubernetes شما در اینجا)، Kubernetes میتواند به شما کمک کند تا به جای مدیریت زیرساخت، روی برنامه خود تمرکز کنید.
۱۲. ساخت ابری
تاکنون، ما کانتینرها را با دستورات معمول داکر (docker build ...) ساختهایم و سپس تصویر را به صورت دستی در رجیستری کانتینر پلتفرم ابری گوگل قرار دادهایم. همچنین میتوان هر دو مرحله را به Cloud Build سمت سرور موکول کرد، که میتواند تصویر کانتینر را بدون نیاز به نصب محلی داکر بسازد و قرار دهد.
ابتدا، Cloud Build API را در API Manager > Library فعال کنید. عبارت Cloud Build را جستجو کنید، روی Cloud Build API کلیک کنید:

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

پس از فعال شدن Cloud Build API، میتوانید دستور زیر را برای ساخت و ارسال ایمیج خود از سرویس Container Builder اجرا کنید:
$ gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v3
تصویر به طور خودکار در رجیستری کانتینر ذخیره میشود.
۱۳. داشبورد گرافیکی 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 برای رفتن به پورت ۸۰۸۱ استفاده کنید:

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

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


وقتی کارتان با داشبورد تمام شد، میتوانید با فشردن کلیدهای Control + C پروکسی را متوقف کنید. با شرکت در تور داشبورد ، درباره داشبورد Kubernetes بیشتر بدانید.
۱۴. ثبت وقایع
شما میتوانید از دستور kubectl logs برای بازیابی گزارشهای یک کانتینر که درون Kubernetes در حال اجرا است استفاده کنید. وقتی از Google Kubernetes Engine برای اجرای خوشههای مدیریتشده Kubernetes استفاده میکنید، تمام گزارشها بهطور خودکار ارسال و در Google Cloud Logging ذخیره میشوند. میتوانید تمام خروجی گزارشها را از podها با رفتن به Stackdriver → Logging → Logs در کنسول Google Cloud مشاهده کنید:

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

از اینجا، میتوانید به صورت اختیاری، لاگها را برای تجزیه و تحلیل بیشتر لاگ یا تنظیم هشدار مبتنی بر لاگ ، به Google BigQuery صادر کنید. امروز در طول تمرین به این کار نخواهیم پرداخت.
۱۵. تبریک میگویم!
این پایان این آزمایشگاه کدنویسی ساده برای شروع کار با ASP.NET Core و Kubernetes است. ما فقط به طور سطحی به این فناوری پرداختهایم و شما را تشویق میکنیم که با پادها، کنترلکنندههای تکثیر و سرویسهای خودتان بیشتر کاوش کنید، همچنین بررسیهای زنده بودن (بررسیهای سلامت) را بررسی کنید و استفاده مستقیم از API Kubernetes را در نظر بگیرید.
تمیز کردن
همین! وقت آن است که منابع استفاده شده را پاکسازی کنیم (برای صرفهجویی در هزینه و شهروند ابری خوبی بودن).
Deployment (که pod های در حال اجرا را نیز حذف میکند) و 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 Compute Engine که در حال اجرای کلاستر هستند را حذف میکند.
در نهایت، مخزن ذخیرهسازی رجیستری داکر که میزبان ایمیجهای شماست را حذف کنید:
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 را به عنوان یک کانتینر داکر بستهبندی کنیم؟
- چگونه خوشه Kubernetes خود را در Google Kubernetes Engine ایجاد کنیم.
- چگونه برنامه ASP.NET Core خود را روی یک پاد (pod) مستقر کنیم؟
- چگونه به ترافیک خارجی اجازه ورود به پاد خود را بدهیم.
- چگونه سرویس خود را گسترش داده و ارتقاء دهید.
- نحوه اجرای داشبورد گرافیکی Kubernetes.
مراحل بعدی
- برای کسب اطلاعات بیشتر در مورد Kubernetes به آدرس http://kubernetes.io/ مراجعه کنید.
- درباره ویندوز روی پلتفرم ابری گوگل بیشتر بدانید.
- درباره .NET در پلتفرم ابری گوگل بیشتر بدانید.
- درباره SQL Server در پلتفرم ابری گوگل بیشتر بدانید.
- درباره ابزارهای ابری برای ویژوال استودیو بیشتر بدانید.
- درباره ابزارهای ابری برای PowerShell بیشتر بدانید.
مجوز
این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.