פריסת אפליקציית ASP.NET Core ב-Kubernetes ב-Google Kubernetes Engine

1. סקירה כללית

ASP.NET Core היא מסגרת חדשה בקוד פתוח ובפלטפורמות שונות ליצירת אפליקציות מודרניות מבוססות-ענן ומחוברות לאינטרנט באמצעות שפת התכנות C#.

Kubernetes הוא פרויקט קוד פתוח שיכול לפעול בסביבות שונות, ממחשבים ניידים ועד אשכולות מרובי צמתים עם זמינות גבוהה, מעננים ציבוריים ועד פריסות מקומיות, ממכונות וירטואליות ועד bare metal.

במעבדה הזו תפרסו אפליקציית ASP.NET Core פשוטה ב-Kubernetes שפועל ב-Kubernetes Engine. ה-codelab הזה מבוסס על ה-codelab Build and launch ASP.NET Core app from Google Cloud Shell (פיתוח והשקה של אפליקציית ASP.NET Core מ-Google Cloud Shell). כדאי לבצע את ה-Lab הזה לפני שמנסים את ה-Lab הזה.

המטרה של ה-codelab הזה היא להפוך את הקוד (אפליקציית Hello World פשוטה של ASP.NET Core) לאפליקציה משוכפלת שפועלת ב-Kubernetes. אתם לוקחים קוד שפיתחתם במחשב, הופכים אותו לקובץ אימג' של קונטיינר של Docker, ואז מריצים את הקובץ אימג' הזה ב-Google Kubernetes Engine.

הנה דיאגרמה של החלקים השונים שמוצגים ב-codelab הזה, כדי לעזור לכם להבין איך הם משתלבים זה בזה. אפשר להשתמש בזה כנקודת התייחסות במהלך ה-Codelab; הכול יהיה ברור עד שתגיעו לסוף (אבל אפשר להתעלם מזה כרגע).

7dbdc973aceef1af.jpeg

לצורך ה-codelab הזה, שימוש בסביבה מנוהלת כמו Kubernetes Engine (גרסה של Kubernetes שמתארחת ב-Google ופועלת ב-Compute Engine) מאפשר לכם להתמקד יותר בהתנסות ב-Kubernetes ולא בהגדרת התשתית הבסיסית.

אם אתם רוצים להריץ Kubernetes במחשב המקומי שלכם, למשל במחשב נייד לפיתוח, כדאי לכם לבדוק את Minikube. האפשרות הזו מאפשרת הגדרה פשוטה של אשכול Kubernetes עם צומת יחיד למטרות פיתוח ובדיקה. אם רוצים, אפשר להשתמש ב-Minikube כדי לעבור על ה-codelab הזה.

מה תלמדו

  • איך לארוז אפליקציית ASP.NET Core פשוטה כקובץ Docker.
  • איך ליצור אשכול Kubernetes ב-Google Kubernetes Engine‏ (GKE).
  • איך פורסים את אפליקציית ASP.NET Core לפוד.
  • איך מאפשרים תנועה חיצונית ל-Pod.
  • איך מרחיבים את השירות ומשיקים שדרוג.
  • איך מריצים לוח בקרה גרפי של Kubernetes.

הדרישות

איך תשתמשו במדריך הזה?

רק לקרוא לקרוא ולבצע את התרגילים

איזה דירוג מגיע לדעתך לחוויה שלך עם Google Cloud Platform?

מתחילים ביניים מומחים

2. הגדרה ודרישות

הגדרת סביבה בקצב אישי

  1. נכנסים ל-מסוף Google Cloud ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או Google Workspace, אתם צריכים ליצור חשבון.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • שם הפרויקט הוא השם המוצג של הפרויקט הזה למשתתפים. זו מחרוזת תווים שלא נמצאת בשימוש ב-Google APIs. אפשר לעדכן את המיקום הזה בכל שלב.
  • מזהה הפרויקט חייב להיות ייחודי בכל הפרויקטים ב-Google Cloud, והוא קבוע (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית, ובדרך כלל לא צריך לדעת מה היא. ברוב ה-Codelabs, תצטרכו להפנות למזהה הפרויקט (בדרך כלל הוא מסומן כ-PROJECT_ID). אם אתם לא אוהבים את המזהה שנוצר, אתם יכולים ליצור מזהה אקראי אחר. אפשר גם לנסות שם משתמש משלכם ולבדוק אם הוא זמין. אי אפשר לשנות את ההגדרה הזו אחרי השלב הזה, והיא תישאר כזו למשך הפרויקט.
  • לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. במאמרי העזרה מפורט מידע נוסף על שלושת הערכים האלה.
  1. בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API של Cloud. העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי אפילו לא תצטרכו לשלם בכלל. כדי להשבית את המשאבים ולא לחייב אתכם מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את כל הפרויקט. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.

מפעילים את Cloud Shell

אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל ב-codelab הזה תשתמשו ב-Google Cloud Shell, סביבת שורת פקודה שפועלת בענן.

הפעלת Cloud Shell

  1. ב-Cloud Console, לוחצים על Activate Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

אם זו הפעם הראשונה שאתם מפעילים את Cloud Shell, יוצג לכם מסך ביניים (מתחת לקו הקיפול) עם תיאור של הכלי. במקרה כזה, לוחצים על המשך (והמסך הזה לא יוצג לכם יותר). כך נראה המסך החד-פעמי:

9c92662c6a846a5c.png

הקצאת המשאבים והחיבור ל-Cloud Shell נמשכים רק כמה רגעים.

9f0e51b578fecce5.png

המכונה הווירטואלית הזו כוללת את כל הכלים שדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. אפשר לבצע את רוב העבודה ב-codelab הזה, אם לא את כולה, באמצעות דפדפן או Chromebook.

אחרי שמתחברים ל-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].

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

מוסיפים את הקוד הבא ל-Dockerfile באמצעות העורך המועדף (vim, nano,emacs או עורך הקוד של Cloud Shell).

# 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"]

אחת מההגדרות החשובות שכלולות ב-קובץ Docker הוא הפורט שבו האפליקציה מאזינה לתעבורה נכנסת (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

ושוב, אפשר להשתמש בתכונה 'תצוגה מקדימה באינטרנט' של Cloud Shell :

Screenshot from 2015-11-03 17:20:22.png

דף האינטרנט של ASP.NET Core שמוגדר כברירת מחדל אמור להופיע בכרטיסייה חדשה.

f42271880ce4d572.png

אחרי שמוודאים שהאפליקציה פועלת בצורה תקינה באופן מקומי בקונטיינר Docker, אפשר לעצור את הקונטיינר הפועל באמצעות Ctrl-> C.

עכשיו, אחרי שקובץ האימג' פועל כמו שרציתם, אתם יכולים להעביר אותו בדחיפה אל Google Container Registry, מאגר פרטי של קובצי Docker שאפשר לגשת אליו מכל פרויקט בענן (אבל גם מחוץ ל-Google Cloud Platform) :

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

אם הכול ילך כשורה, אחרי כמה דקות קובץ אימג' של קונטיינר יופיע בקטע Container Registry. בשלב הזה, יש לכם קובץ אימג' של 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 מהסשן שלכם ב-Cloud Shell כדי ליצור אשכול. משנים את האזור למקום שקרוב אליכם ( רשימת האזורים). הפעולה תימשך כמה דקות:

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). בשאר ה-codelab הזה נדרשת גרסת לקוח ושרת של kubernetes בגרסה 1.2 ומעלה. ‫kubectl version יציג את הגרסה הנוכחית של הפקודה.

7. יצירת פריסה

פוד ב-Kubernetes הוא קבוצה של קונטיינרים שמקושרים יחד למטרות ניהול ורשת. הוא יכול להכיל מאגר תגים אחד או כמה מאגרי תגים. במקרה הזה, פשוט משתמשים בקונטיינר אחד שנבנה באמצעות קובץ האימג' של ASP.NET Core שמאוחסן במאגר הפרטי של קונטיינרים. הוא יציג תוכן ביציאה 8080.

יוצרים קובץ hello-dotnet.yaml באמצעות העורך המועדף (vim, nano,emacs או עורך הקוד של Cloud Shell) ומגדירים את פריסת Kubernetes עבור ה-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

כפי שאפשר לראות, יצרתם אובייקט פריסה. פריסות הן הדרך המומלצת ליצור פודים ולהתאים אותם לעומס (scale). בדוגמה הזו, פריסה חדשה מנהלת העתק יחיד של Pod שמופעלת בו תמונת hello-dotnet:v1.

כדי לראות את הפריסה שיצרתם, פשוט מריצים את הפקודה:

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

כדי להציג את ה-pod שנוצר על ידי הפריסה, מריצים את הפקודה הבאה:

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. התרת תנועה חיצונית

כברירת מחדל, אפשר לגשת ל-Pod רק באמצעות כתובת ה-IP הפנימית שלו בתוך האשכול. כדי לאפשר גישה למאגר hello-dotnet מחוץ לרשת הווירטואלית של Kubernetes, צריך לחשוף את ה-Pod כשירות של Kubernetes.

מ-Cloud Shell אפשר לחשוף את ה-Pod לאינטרנט הציבורי באמצעות הפקודה kubectl expose בשילוב עם הדגל --type="LoadBalancer". חובה להשתמש בדגל הזה כדי ליצור כתובת IP עם גישה חיצונית :

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

הדגל שמשמש בפקודה הזו מציין שתשתמשו במאזן העומסים שסופק על ידי התשתית הבסיסית (במקרה הזה, מאזן העומסים של Compute Engine). שימו לב שאתם חושפים את הפריסה ולא את ה-Pod ישירות. כתוצאה מכך, השירות שנוצר יבצע איזון עומסים של התנועה בכל הפודים שמנוהלים על ידי הפריסה (במקרה הזה רק פוד אחד, אבל בהמשך תוסיפו עוד רפליקות).

ה-master של Kubernetes יוצר את מאזן העומסים ואת כללי ההעברה, מאגרי היעדים וכללי חומת האש שקשורים ל-Compute Engine, כדי שהשירות יהיה נגיש באופן מלא מחוץ ל-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 היא הקלות שבה אפשר להרחיב את האפליקציה. נניח שאתם צריכים פתאום יותר קיבולת לאפליקציה שלכם. אתם יכולים פשוט להגיד לבקר השכפול לנהל מספר חדש של רפליקות בשביל ה-Pod שלכם:

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) עוקב אחרי הפודים, ואם משהו לא בסדר בפוד והוא מושבת, הוא יוצר פוד חדש באופן מיידי. בואו נבדוק את זה ונראה איך זה עובד.

קודם מקבלים את רשימת ה-Pods:

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

כדי למחוק אחד מה-pods, מעבירים את שם ה-pod:

kubectl delete pod hello-dotnet-714049816-g4azy

אם תסתכלו שוב על רשימת ה-pods, תראו שנוצר pod חדש והוא מופעל שוב באופן מיידי:

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:

docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 . 

ומבצעים push ל-Container Registry:

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 המלאה של הפריסה. לא צריך להבין את כל הגדרות ה-yaml בשלב הזה, אלא רק להבין שעדכון השדה spec.template.spec.containers.image בהגדרות אומר לפריסה לעדכן את ה-pods כדי להשתמש בתמונה החדשה.

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. Cloud Build

עד עכשיו, יצרנו קונטיינרים באמצעות פקודות Docker רגילות (docker build ...), ואז העברנו את קובץ האימג' באופן ידני אל Container Registry של Google Cloud Platform. אפשר גם להעביר את שני השלבים לצד השרת Cloud Build, שיכול ליצור ולדחוף את קובץ האימג' של הקונטיינר בלי להתקין את Docker באופן מקומי.

קודם צריך להפעיל את Cloud Build API בAPI Manager > Library. מחפשים את Cloud Build ולוחצים על Cloud Build API:

f8b0239fa7719f29.png

לוחצים על Enable API אם ה-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 כדי לעצור את ה-proxy. סיור במרכז הבקרה

14. רישום ביומן

אפשר להשתמש בפקודה kubectl logs כדי לאחזר את היומנים של קונטיינר שפועל בתוך Kubernetes. כשמשתמשים ב-Google Kubernetes Engine כדי להריץ אשכולות מנוהלים של Kubernetes, כל היומנים מועברים אוטומטית ומאוחסנים ב-Google Cloud Logging. כדי לראות את כל פלט היומן מה-pods, עוברים אל StackdriverLogging → Logs במסוף Google Cloud:

b63159b959ba5010.png

אחרי שנכנסים למסוף הרישום ביומן, אפשר לעבור אל GKE Container כדי לראות את כל היומנים שנאספו מ-STDOUT:

43e9aab3e02358d5.png

מכאן אפשר לייצא את היומנים ל-Google BigQuery כדי להמשיך לנתח אותם, או להגדיר התראות שמבוססות על יומנים. לא נספיק לעשות את זה במהלך שיעור ה-Lab היום.

15. מעולה!

כאן מסתיים ה-codelab הפשוט הזה בנושא התחלת העבודה עם ASP.NET Core ו-Kubernetes. הצגנו כאן רק חלק קטן מהיכולות של הטכנולוגיה הזו, ואנחנו ממליצים לכם להמשיך לחקור אותה בעזרת Podים, בקרי רפליקציה ושירותים משלכם, וגם לבדוק את בקשות לבדיקת תקינות (בדיקות תקינות) ולשקול להשתמש ישירות ב-Kubernetes API.

הסרת המשאבים

זהו! הגיע הזמן לנקות את המשאבים שבהם נעשה שימוש (כדי לחסוך בעלויות ולשמור על סביבת ענן נקייה).

מוחקים את הפריסה (שמוחקת גם את הפודים הפועלים) ואת השירות (שמוחק גם את מאזן העומסים החיצוני):

קודם צריך למחוק את השירות ואת הפריסה, מה שיגרום גם למחיקה של מאזן העומסים החיצוני:

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 שמריצים את האשכול.

לבסוף, מוחקים את קטגוריית האחסון של Docker registry שמארחת את קובצי האימג' שלכם:

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 לפוד.
  • איך מאפשרים תנועה חיצונית ל-Pod.
  • איך מרחיבים את השירות ומשיקים שדרוג.
  • איך מריצים לוח בקרה גרפי של Kubernetes.

השלבים הבאים

רישיון

עבודה זו מורשית תחת רישיון Creative Commons שמותנה בייחוס 2.0 כללי.