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

۱. مرور کلی

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 اجرا می‌کنید.

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

7dbdc973aceef1af.jpeg

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

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

آنچه یاد خواهید گرفت

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

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

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

فقط تا انتها بخوانید آن را بخوانید و تمرین‌ها را انجام دهید

تجربه خود را با پلتفرم ابری گوگل چگونه ارزیابی می‌کنید؟

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

۲. تنظیمات و الزامات

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

شروع پوسته ابری

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

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید 853e55310c205094.png .

55efc1aaa7a4d3ad.png

اگر قبلاً Cloud Shell را شروع نکرده‌اید، یک صفحه میانی (در پایین صفحه) به شما نمایش داده می‌شود که توضیح می‌دهد چیست. در این صورت، روی ادامه کلیک کنید (و دیگر هرگز آن را نخواهید دید). آن صفحه یکبار مصرف به این شکل است:

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

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

پس از اتصال به Cloud Shell، باید ببینید که از قبل احراز هویت شده‌اید و پروژه از قبل روی شناسه پروژه شما تنظیم شده است.

  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].

۳. یک برنامه 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.

برای تأیید اجرای برنامه، روی دکمه پیش‌نمایش وب در بالا سمت راست کلیک کنید و «پیش‌نمایش روی پورت ۸۰۸۰» را انتخاب کنید.

ضبط.PNG

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

f42271880ce4d572.png

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

تصویر از 2015-11-03 17:20:22.png

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

f42271880ce4d572.png

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

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

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

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

۵۷۶۳۷۴۶۰۲b۵۲f۴e۴.png

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

۶. ایجاد خوشه Kubernetes

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

d5f6e3c267feea1a.png

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

eefb8d9b7f39598b.png

اکنون زمان آن رسیده است که برنامه کانتینر شده خود را در کلاستر 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

6b053874002827fe.png

در این مرحله، شما حداقل چندین ویژگی را از انتقال به کانتینرها و 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 شما را خلاصه می‌کند:

6af0243662464ca9.png

همچنین می‌توانید به راحتی سرویس خود را کوچک کنید. در اینجا نحوه‌ی کوچک کردن سرویس از ۴ پاد به ۲ پاد آورده شده است.

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 باز کنید.

f487389b8b1cc105.png

به مسیر 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

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

fb9f41e814dda653.png

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

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

۱۲. ساخت ابری

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

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

f8b0239fa7719f29.png

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

ea6053f9603613b5.png

پس از فعال شدن 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 برای رفتن به پورت ۸۰۸۱ استفاده کنید:

پورت8081.png

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

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

۱۷۷۷۸۹۵۲۷b۶۵۰f۶b.png

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

da1ccc707dd6647.png

a51c7160e237f32f.png

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

۱۴. ثبت وقایع

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

b63159b959ba5010.png

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

43e9aab3e02358d5.png

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

مراحل بعدی

مجوز

این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.