אם אתם לא מכירים בכלל עומסי עבודה מבוססי-קונטיינרים, המדריך הזה הוא בשבילכם. בשיעור הזה נסביר על קונטיינרים ותזמור קונטיינרים, ונדגים איך להגדיר אפליקציה פשוטה מקוד מקור לקונטיינר שפועל ב-GKE.
כדי להבין את המדריך הזה, לא נדרש ניסיון קודם עם קונטיינרים או עם Kubernetes. עם זאת, אם אתם רוצים לקרוא סקירה כללית של המינוח הבסיסי ב-Kubernetes לפני שתתחילו את המדריך הזה, תוכלו לעיין במאמר תחילת לימוד Kubernetes (או אם אתם מעדיפים ללמוד על Kubernetes בצורה של קומיקס, תוכלו לעיין בקומיקס על Kubernetes). בקטע השלבים הבאים בסוף המדריך מופיעים מקורות מידע מפורטים יותר.
אם אתם כבר מכירים קונטיינרים ו-Kubernetes, אתם יכולים לדלג על המדריך הזה ולהתחיל ללמוד על GKE.
מטרות
- לגלות אפליקציית hello world פשוטה עם כמה שירותים.
- מריצים את האפליקציה מקוד המקור.
- העברת האפליקציה לקונטיינר.
- יוצרים אשכול Kubernetes.
- פורסים את הקונטיינרים באשכול.
לפני שמתחילים
כדי להפעיל את Kubernetes Engine API:- נכנסים ל דף Kubernetes Engine במסוף Cloud de Confiance .
- יוצרים או בוחרים פרויקט.
- מחכים עד שממשק ה-API והשירותים הקשורים מופעלים. הפעולה הזו עשויה להימשך כמה דקות.
הכנת Cloud Shell
במדריך הזה משתמשים ב-Cloud Shell, שמקצה מכונה וירטואלית (VM) מסוג g1-small Compute Engine שמריצה מערכת הפעלה מבוססת-Debian Linux.
היתרונות של שימוש ב-Cloud Shell:
- סביבת פיתוח של Python 3 (כולל
virtualenv) מוגדרת באופן מלא. - כלי שורת הפקודה
gcloud,docker,gitו-kubectlשמשמשים במדריך הזה כבר מותקנים. אתם יכולים לבחור מבין עורכי הטקסט המובנים:
Cloud Shell Editor, שאליו ניגשים בלחיצה על Open Editor בחלק העליון של חלון Cloud Shell.
Emacs, Vim או Nano, שאפשר לגשת אליהם משורת הפקודה ב-Cloud Shell.
במסוף Cloud de Confiance , מפעילים את Cloud Shell.
בחלק התחתון של Cloud de Confiance המסוף יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.
הורדת קוד לדוגמה
מורידים את קוד המקור של
helloserver:git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samplesעוברים לספרייה של הקוד לדוגמה:
cd anthos-service-mesh-samples/docs/helloserver
הכרת האפליקציה עם כמה שירותים
אפליקציית הדוגמה כתובה ב-Python. הוא כולל את הרכיבים הבאים שמתקשרים באמצעות REST:
-
server: שרת בסיסי עם נקודת קצה אחתGET, /, שמדפיסה 'hello world' בחלון המסוף. -
loadgen: סקריפט ששולח תנועה אלserver, עם מספר בקשות שניתן להגדרה לשנייה (RPS).
הרצת האפליקציה מקוד המקור
כדי להכיר את האפליקציה לדוגמה, מריצים אותה ב-Cloud Shell:
מהספרייה
sample-apps/helloserver, מריצים את הפקודהserver:python3 server/server.pyבזמן ההפעלה, ב-
serverמוצגים הנתונים הבאים:INFO:root:Starting server...
פותחים חלון טרמינל נוסף כדי שאפשר יהיה לשלוח בקשות אל
server. כדי לעשות את זה ב-Cloud Shell, לוחצים על פתיחת כרטיסייה חדשה כדי לפתוח סשן נוסף.בחלון המסוף החדש, שולחים בקשה אל
server:curl http://localhost:8080הפלט מ-
serverהוא:Hello World!
בכרטיסייה הזו, עוברים לספרייה שמכילה את הסקריפט
loadgen:cd anthos-service-mesh-samples/docs/helloserver/loadgen
יוצרים את משתני הסביבה הבאים:
export SERVER_ADDR=http://localhost:8080 export REQUESTS_PER_SECOND=5התחלה
virtualenv:virtualenv --python python3 envמפעילים את הסביבה הווירטואלית:
source env/bin/activateמתקינים את הדרישות ל-
loadgen:pip3 install -r requirements.txtמריצים את אפליקציית
loadgenכדי ליצור תנועה לserver:python3 loadgen.pyבזמן ההפעלה, הפלט של
loadgenאמור להיראות כך:Starting loadgen: 2024-10-11 09:49:51.798028 5 request(s) complete to http://localhost:8080
עכשיו פותחים את חלון הטרמינל שבו פועל
server. אמורות להופיע הודעות דומות לאלה:127.0.0.1 - - [11/Oct/2024 09:51:28] "GET / HTTP/1.1" 200 - INFO:root:GET request, Path: / Headers: Host: localhost:8080 User-Agent: python-requests/2.32.3 Accept-Encoding: gzip, deflate Accept: */* Connection: keep-alive
מבחינת רשת, כל האפליקציה פועלת עכשיו באותו מארח, כך שאפשר להשתמש ב-
localhostכדי לשלוח בקשות אלserver.כדי להפסיק את
loadgenואתserver, לוחצים עלCtrl-cבכל חלון של מסוף.בחלון הטרמינל
loadgen, משביתים את הסביבה הווירטואלית:deactivate
העברת האפליקציה לקונטיינר
כדי להריץ את האפליקציה ב-GKE, צריך לארוז את שני הרכיבים של האפליקציה לדוגמה בקונטיינרים. קונטיינר הוא חבילה שמכילה את כל הרכיבים שנדרשים כדי שהאפליקציה שלכם תפעל בכל סביבה. במדריך הזה משתמשים ב-Docker כדי להכניס את האפליקציה לקונטיינר.
כדי להכניס את האפליקציה לקונטיינר באמצעות Docker, צריך Dockerfile. Dockerfile הוא קובץ טקסט שמגדיר את הפקודות שדרושות כדי להרכיב את קוד המקור של האפליקציה ואת יחסי התלות שלה בקובץ אימג' של קונטיינר. אחרי שיוצרים את קובץ האימג', מעלים אותו למאגר קונטיינרים, כמו Artifact Registry.
קוד המקור של המדריך הזה כולל Dockerfile גם ל-server וגם ל-loadgen עם כל הפקודות שנדרשות כדי ליצור את קובצי האימג'. הנה Dockerfile של server:
בקובץ הזה אפשר לראות את הפרטים הבאים:
- ההוראה
FROM python:3-slim as baseאומרת ל-Docker להשתמש בתמונה העדכנית ביותר של Python 3 כתמונת הבסיס. - ההוראה
COPY . .מעתיקה את קובצי המקור מספריית העבודה הנוכחית (במקרה הזה,server.py) למערכת הקבצים של הקונטיינר. - הפקודה
ENTRYPOINTמגדירה את ההוראה שמשמשת להפעלת הקונטיינר. בדוגמה הזו, ההוראה דומה לזו שבה השתמשתם כדי להריץ אתserver.pyמקוד המקור. - ההוראה
EXPOSEמציינת ש-serverמאזין ביציאה8080. ההוראה הזו לא חושפת יציאות, אבל היא משמשת כתיעוד שצריך לפתוח את יציאה8080כשמריצים את הקונטיינר.
הכנה להעברת האפליקציה לקונטיינר
לפני שמכניסים את האפליקציה לקונטיינר, צריך להגדיר את הכלים והשירותים שבהם תשתמשו:
מגדירים את פרויקט ברירת המחדל Cloud de Confiance ל-Google Cloud CLI.
gcloud config set project PROJECT_ID
מגדירים את האזור שמוגדר כברירת מחדל ב-Google Cloud CLI.
gcloud config set compute/region us-central1
יצירת המאגר
כדי ליצור מאגר חדש לקובצי אימג' של קונטיינרים של Docker ב-Artifact Registry:
מוודאים ששירות Artifact Registry מופעל בCloud de Confiance פרויקט.
gcloud services enable artifactregistry.googleapis.comיוצרים את מאגר Artifact Registry:
gcloud artifacts repositories create container-intro --repository-format=docker \ --location=us-central1 \ --description="My new Docker repository"מגדירים אימות מ-Docker ל-Artifact Registry באמצעות Google Cloud CLI:
gcloud auth configure-docker us-central1-docker.pkg.dev
העברה לקונטיינרים של server
עכשיו הגיע הזמן להעביר את האפליקציה לקונטיינר. קודם צריך להכניס את serverhello world לקונטיינר ולהעביר את האימג' בדחיפה ל-Artifact Registry:
עוברים לספרייה שבה נמצאת הדוגמה
server:cd ~/anthos-service-mesh-samples/docs/helloserver/server/
יוצרים את קובץ האימג' באמצעות
Dockerfile:docker build -t us-central1-docker.pkg.dev/PROJECT_ID/container-intro/helloserver:v0.0.1 .- מחליפים את
PROJECT_IDבמזהה הפרויקט. Cloud de Confiance by S3NS
הדגל
-tמייצג את תג Docker. זה השם של קובץ האימג' שבו משתמשים כשפורסים את הקונטיינר.- מחליפים את
מעבירים את האימג' ל-Artifact Registry:
docker push us-central1-docker.pkg.dev/PROJECT_ID/container-intro/helloserver:v0.0.1
העברה לקונטיינרים של loadgen
לאחר מכן, יוצרים קונטיינר לשירות של מחולל העומסים באותו אופן:
עוברים לספרייה שבה נמצאת הדוגמה
loadgen:cd ../loadgenיוצרים את התמונה:
docker build -t us-central1-docker.pkg.dev/PROJECT_ID/container-intro/loadgen:v0.0.1 .מעבירים את האימג' ל-Artifact Registry:
docker push us-central1-docker.pkg.dev/PROJECT_ID/container-intro/loadgen:v0.0.1
הכנת רשימה של התמונות
כדי לוודא שהתמונות נדחפו, אפשר לקבל רשימה של התמונות במאגר:
gcloud container images list --repository us-central1-docker.pkg.dev/PROJECT_ID/container-intro
הפלט צריך לכלול את שמות התמונות שדחפתם, בדומה לזה:
NAME us-central1-docker.pkg.dev/PROJECT_ID/container-intro/helloserver us-central1-docker.pkg.dev/PROJECT_ID/container-intro/loadgen
יצירת אשכול GKE
בשלב הזה אפשר פשוט להריץ את הקונטיינרים במכונה הווירטואלית של Cloud Shell באמצעות הפקודה docker run. עם זאת, כדי להריץ עומסי עבודה מהימנים בסביבת ייצור, צריך לנהל את הקונטיינרים בצורה אחידה יותר. לדוגמה, צריך לוודא שהקונטיינרים מופעלים מחדש אם הם נכשלים, וצריך דרך להגדיל את מספר המופעים של קונטיינר ולהפעיל מופעים נוספים כדי לטפל בעלייה בתנועה.
GKE יכול לעזור לכם לעמוד בדרישות האלה. GKE היא פלטפורמה לניהול קונטיינרים שפועלת על ידי חיבור מכונות וירטואליות לאשכול. כל מכונה וירטואלית נקראת צומת. אשכולות GKE מופעלים על ידי מערכת ניהול האשכולות של Kubernetes בקוד פתוח. Kubernetes מספקת את המנגנונים שדרכם מתבצעת האינטראקציה עם האשכול.
כדי להריץ את הקונטיינרים ב-GKE, קודם צריך ליצור אשכול ואז להתחבר אליו:
יוצרים את האשכול:
gcloud container clusters create-auto container-intro
הפקודה
gcloudיוצרת אשכול בפרויקט Cloud de Confiance ובאזור ברירת המחדל שהגדרתם קודם.השלמת הפקודה ליצירת האשכול נמשכת כמה דקות. כשהאשכול מוכן, הפלט אמור להיראות כך:
NAME: container-intro LOCATION: us-central1 MASTER_VERSION: 1.30.4-gke.1348000 MASTER_IP: 34.44.14.166 MACHINE_TYPE: e2-small NODE_VERSION: 1.30.4-gke.1348000 NUM_NODES: 3 STATUS: RUNNING
מספקים פרטי כניסה לכלי
kubectlבשורת הפקודה כדי שתוכלו להשתמש בו לניהול האשכול:gcloud container clusters get-credentials container-intro
בדיקת מניפסטים של Kubernetes
כשמריצים את האפליקציה מקוד המקור, משתמשים בפקודה אימפרטיבית: python3 server.py
ציווי הוא פועל שמוביל את המשפט: "תעשה את זה".
לעומת זאת, Kubernetes פועל לפי מודל הצהרתי. כלומר, במקום להגיד ל-Kubernetes בדיוק מה לעשות, אתם מספקים ל-Kubernetes מצב רצוי. לדוגמה, Kubernetes מפעיל ומפסיק את ה-Pods לפי הצורך, כך שהמצב בפועל של המערכת תואם למצב הרצוי.
את המצב הרצוי מציינים בקובץ שנקרא מניפסט. קובצי מניפסט נכתבים בשפות כמו YAML או JSON, והם מכילים את המפרט של אובייקט אחד או יותר של Kubernetes.
הדוגמה מכילה מניפסט לכל אחד מהרכיבים server ו-loadgen. כל מניפסט מציין את המצב הרצוי של אובייקט הפריסה של Kubernetes (שמנהל את הפעלת הקונטיינר, שארוז לניהול כ-Pod של Kubernetes) ואת השירות (שמספק כתובת IP ל-Pod). קבוצת Pod היא יחידת המחשוב הקטנה ביותר שניתן לפרוס, ליצור ולנהל ב-Kubernetes, והיא מכילה קונטיינר אחד או יותר.
בתרשים הבא מוצגת האפליקציה שפועלת ב-GKE:
מידע נוסף על Pods, Deployments ו-Services זמין במאמר תחילת הלימוד על Kubernetes או במשאבים בסוף הדף הזה.
שרת
קודם, נסתכל על קובץ המניפסט של server:
המניפסט הזה מכיל את השדות הבאים:
-
kindמציין את סוג האובייקט. -
metadata.nameמציין את השם של הפריסה. - השדה הראשון
specמכיל תיאור של המצב הרצוי. -
spec.replicasמציין את מספר ה-Pods הרצוי. - בקטע
spec.templateמוגדרת תבנית של Pod. המפרט של ה-Pods כולל את השדהimage, שהוא השם של התמונה שצריך לשלוף מ-Artifact Registry. בשלב הבא, תעדכנו את התמונה הזו לתמונה החדשה שיצרתם.
השירות hellosvc מוגדר באופן הבא:
-
LoadBalancer: לקוחות שולחים בקשות לכתובת ה-IP של מאזן עומסים ברשת, שיש לו כתובת IP יציבה שאפשר להגיע אליה מחוץ לאשכול. -
targetPort: כדאי לזכור שהפקודהEXPOSE 8080ב-Dockerfileלא חושפת אף יציאה. חושפים את הפורט8080כדי שאפשר יהיה להגיע למאגרserverמחוץ לאשכול. במקרה הזה, hellosvc.default.cluster.local:80(שם קצר:hellosvc) ממופה ליציאה8080של כתובת ה-IP של ה-Podhelloserver. -
port: מספר היציאה ששאר השירותים באשכול משתמשים בו כששולחים בקשות.
מחולל עומסים
אובייקט הפריסה ב-loadgen.yaml דומה ל-server.yaml. הבדל בולט אחד הוא שבמפרט של ה-Pod עבור פריסת loadgen יש שדה בשם env. בקטע הזה מוגדרים משתני הסביבה שנדרשים על ידי loadgen, שהגדרתם קודם כשביצעתם את האפליקציה מהמקור.
מכיוון ש-loadgen לא מקבל בקשות נכנסות, השדה type מוגדר ל-ClusterIP. סוג השירות הזה מספק כתובת IP יציבה שישויות באשכול יכולות להשתמש בה, אבל כתובת ה-IP לא חשופה ללקוחות חיצוניים.
פריסת הקונטיינרים ב-GKE
כדי לפרוס את הקונטיינרים, מחילים את המניפסטים שמציינים את המצב הרצוי באמצעות kubectl.
פריסת server
עוברים לספרייה שבה נמצאת הדוגמה
server:cd ~/anthos-service-mesh-samples/docs/helloserver/server/
פותחים את
server.yamlב-Cloud Shell Editor (או בעורך הטקסט המועדף).מחליפים את השם בשדה
imageבשם של קובץ אימג' של Docker.image: us-central1-docker.pkg.dev/PROJECT_ID/container-intro/helloserver:v0.0.1
מחליפים את PROJECT_ID במזהה הפרויקט ב- Cloud de Confiance .
- אם אתם משתמשים ב-Cloud Shell Editor, הקובץ נשמר אוטומטית. כדי לחזור לחלון הטרמינל, לוחצים על Open terminal (פתיחת הטרמינל).
- אם אתם משתמשים בעורך טקסט ב-Cloud Shell, שומרים את הקובץ
server.yamlוסוגרים אותו.
פורסים את המניפסט ב-Kubernetes:
kubectl apply -f server.yamlהפלט אמור להיראות כך:
deployment.apps/helloserver created service/hellosvc created
פריסת loadgen
עוברים לספרייה שבה נמצא הקובץ
loadgen.cd ../loadgenפותחים את
loadgen.yamlבכלי לעריכת טקסט, כמו קודם.שוב, מחליפים את השם בשדה
imageבשם של קובץ אימג' של Docker.image: us-central1-docker.pkg.dev/PROJECT_ID/container-intro/loadgen:v0.0.1
מחליפים את PROJECT_ID במזהה הפרויקט ב- Cloud de Confiance .
- אם אתם משתמשים ב-Cloud Shell Editor, הקובץ נשמר אוטומטית. כדי לחזור לחלון הטרמינל, לוחצים על Open terminal (פתיחת הטרמינל).
- אם אתם משתמשים בעורך טקסט ב-Cloud Shell, שומרים את הקובץ
loadgen.yamlוסוגרים אותו.
פורסים את המניפסט באשכול:
kubectl apply -f loadgen.yamlאם הפקודה מצליחה, היא מחזירה את התגובה הבאה:
deployment.apps/loadgenerator created service/loadgensvc created
אימות הפריסה
אחרי פריסת המניפסטים באשכול, בודקים שהקונטיינרים נפרסו בהצלחה:
בודקים את הסטטוס של ה-Pods באשכול:
kubectl get podsהתגובה של הפקודה תכלול סטטוס שדומה לזה:
NAME READY STATUS RESTARTS AGE helloserver-69b9576d96-mwtcj 1/1 Running 0 58s loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
מקבלים את יומני האפליקציה מ-Pod
loadgen. מחליפים את POD_ID במזהה של ה-Pod של מחולל העומסים מהפלט הקודם.kubectl logs POD_ID
קבלת כתובות ה-IP החיצוניות של
hellosvc:kubectl get service hellosvcהפלט אמור להיראות כך:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hellosvc LoadBalancer 10.81.15.158 192.0.2.1 80:31127/TCP 33m
שליחת בקשה אל
hellosvc. מחליפים את EXTERNAL_IP בכתובת ה-IP החיצונית שלhellosvc.curl http://EXTERNAL_IP
ההודעה "Hello World!" צריכה להופיע מהשרת.
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
אם לא רוצים למחוק את הפרויקט כולו:
מוחקים את אשכול GKE. מחיקת האשכול מוחקת את כל המשאבים שמרכיבים אותו, כמו מכונות, דיסקים ומשאבי רשת של Compute Engine.
gcloud container clusters delete container-introמחיקת מאגר Artifact Registry:
gcloud artifacts repositories delete container-intro --location=us-central1
המאמרים הבאים
מידע נוסף על הטכנולוגיות שבהן נעשה שימוש במדריך הזה:
מידע נוסף על הכלים:
מידע נוסף על מושגים ב-Kubernetes: