אם אתם לא מכירים בכלל עומסי עבודה מבוססי-קונטיינרים, המדריך הזה מיועד לכם. במדריך הזה נסביר על קונטיינרים ותזמור קונטיינרים, ונדגים איך להגדיר אפליקציה פשוטה מקוד מקור לקונטיינר שפועל ב-GKE.
כדי להבין את המדריך הזה, לא נדרש ניסיון קודם עם קונטיינרים או עם Kubernetes. עם זאת, אם אתם רוצים לקרוא סקירה כללית של המינוח הבסיסי של Kubernetes לפני שתתחילו את המדריך הזה, תוכלו לעיין במאמר תחילת לימוד Kubernetes (או אם אתם מעדיפים ללמוד על Kubernetes בצורה של קומיקס, תוכלו לעיין בקומיקס על Kubernetes). בקטע השלבים הבאים בסוף המדריך מופיעים מקורות מידע מפורטים יותר.
אם אתם כבר מכירים את הנושאים האלה, אתם יכולים לדלג על המדריך הזה ולהתחיל ללמוד על GKE.
מטרות
- לגלות אפליקציית hello world פשוטה עם כמה שירותים.
- מריצים את האפליקציה מקוד המקור.
- העברת האפליקציה לקונטיינר.
- יוצרים אשכול Kubernetes.
- פורסים את הקונטיינרים באשכול.
לפני שמתחילים
כדי להפעיל את Kubernetes Engine API:- נכנסים ל דף Kubernetes Engine במסוף Google Cloud .
- יוצרים או בוחרים פרויקט.
- מחכים עד שממשק ה-API והשירותים הקשורים מופעלים. הפעולה יכולה להימשך כמה דקות.
-
Verify that billing is enabled for your Google Cloud project.
הכנת Cloud Shell
במדריך הזה נעשה שימוש ב-Cloud Shell, שמקצה מכונה וירטואלית (VM) מסוג g1-small Compute Engine שמריצה מערכת הפעלה Linux מבוססת Debian.
היתרונות של שימוש ב-Cloud Shell:
- סביבת פיתוח של Python 3 (כולל
virtualenv) מוגדרת באופן מלא. - כלי שורת הפקודה
gcloud,docker,gitו-kubectlשבהם נעשה שימוש במדריך הזה כבר מותקנים. יש לכם אפשרות לבחור מבין עורכי הטקסט המובנים:
Cloud Shell Editor, שאליו ניגשים בלחיצה על Open Editor בחלק העליון של חלון Cloud Shell.
Emacs, Vim או Nano, שאפשר לגשת אליהם משורת הפקודה ב-Cloud Shell.
In the Google Cloud console, activate Cloud Shell.
הורדת קוד לדוגמה
מורידים את קוד המקור של
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כשמריצים את הקונטיינר.
הכנה להעברת האפליקציה לקונטיינר
לפני שמכניסים את האפליקציה לקונטיינר, צריך להגדיר את הכלים והשירותים שבהם תשתמשו:
מגדירים את פרויקט ברירת המחדל Google Cloud ל-Google Cloud CLI.
gcloud config set project PROJECT_ID
מגדירים את אזור ברירת המחדל ל-Google Cloud CLI.
gcloud config set compute/region us-central1
יצירת המאגר
כדי ליצור מאגר חדש של קובצי אימג' של קונטיינרים של Docker ב-Artifact Registry:
מוודאים ששירות Artifact Registry מופעל בGoogle Cloud פרויקט.
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
עכשיו הגיע הזמן להוסיף את האפליקציה למאגר. קודם צריך להכניס את server hello 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במזהה הפרויקט ב- Google Cloud .
הדגל
-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יוצרת אשכול בפרויקט Google Cloud ובאזור ברירת המחדל שהגדרתם קודם.השלמת הפקודה ליצירת האשכול נמשכת כמה דקות. כשהאשכול מוכן, הפלט אמור להיראות כך:
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 במזהה הפרויקט ב- Google Cloud .
- אם אתם משתמשים ב-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 במזהה הפרויקט ב- Google Cloud .
- אם אתם משתמשים ב-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: