אם אתם לא מכירים בכלל עומסי עבודה בקונטיינרים, המדריך הזה בשבילכם. במדריך הזה נסביר על קונטיינרים ועל תזמור קונטיינרים, ונדגים איך להגדיר אפליקציה פשוטה מקוד המקור ועד לקונטיינר שפועל ב-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 Shell במסוף Cloud de Confiance .
בחלק התחתון של מסוף 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: שרת בסיסי עם נקודת קצה (endpoint) אחת שלGET, /, שמדפיס את הטקסט "hello world" בחלון הטרמינל. -
loadgen: סקריפט ששולח תנועה אלserver, עם מספר בקשות לשנייה (RPS) שאפשר להגדיר.
הפעלת האפליקציה מקוד המקור
כדי להכיר את האפליקציה לדוגמה, מריצים אותה ב-Cloud Shell:
מהספרייה
sample-apps/helloserver, מריצים אתserver:python3 server/server.pyבזמן ההפעלה, ב-
serverמוצגים הנתונים הבאים:INFO:root:Starting server...
פותחים חלון טרמינל נוסף כדי לשלוח בקשות אל
server. כדי לעשות את זה ב-Cloud Shell, לוחצים על Open a new tab כדי לפתוח סשן נוסף.בחלון הטרמינל החדש, שולחים בקשה אל
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 הוא קובץ טקסט שמגדיר את הפקודות שדרושות כדי להרכיב את קוד המקור של האפליקציה ואת יחסי התלות שלה בקובץ אימג' של קונטיינר. אחרי שיוצרים את קובץ האימג', מעלים אותו ל-Container Registry, כמו 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 לקונטיינר
עכשיו הגיע הזמן להכיל את האפליקציה בקונטיינר. קודם צריך להכניס את התוכנה hello
world server לקונטיינר ולהעביר את קובץ האימג' בדחיפה אל 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. עם זאת, כדי להריץ עומסי עבודה מהימנים בסביבת הייצור, צריך לנהל את הקונטיינרים בצורה אחידה יותר. לדוגמה, צריך לוודא שהקונטיינרים מופעלים מחדש אם הם נכשלים, וצריך דרך להרחיב אנכית בהתאם לעומס (scale up) ולהפעיל מכונות נוספות של קונטיינר כדי לטפל בעלייה בתנועה.
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 או במקורות המידע שבסוף הדף הזה.
שרת
קודם כול, בודקים את קובץ המניפסט של Hello World server:
המניפסט הזה מכיל את השדות הבאים:
-
kindמציין את סוג האובייקט. -
metadata.nameמציין את שם הפריסה. - השדה הראשון
specמכיל תיאור של המצב הרצוי. -
spec.replicasמציין את מספר ה-Pods הרצוי. - בקטע
spec.templateמוגדרת תבנית של Pod. השדהimageכלול במפרט של ה-Pods, והוא השם של התמונה שצריך לשלוף מ-Artifact Registry. בשלב הבא, תעדכנו את התמונה לתמונה החדשה שיצרתם.
השירות hellosvc מוגדר באופן הבא:
-
LoadBalancer: לקוחות שולחים בקשות לכתובת ה-IP של מאזן עומסי רשת, שיש לו כתובת IP יציבה וניתן להגיע אליו מחוץ לאשכול. -
targetPort: זכרו שהפקודהEXPOSE 8080ב-Dockerfileלא באמת חושפת יציאות. אתם חושפים את יציאה8080כדי שתוכלו להגיע למאגרserverמחוץ לאשכול. במקרה הזה,hellosvc.default.cluster.local:80(שם מקוצר:hellosvc) ממפה ליציאה8080של כתובת ה-IP של Podhelloserver. -
port: זהו מספר היציאה שבו משתמשים שירותים אחרים באשכול כששולחים בקשות.
מחולל עומסים
האובייקט Deployment ב-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, הקובץ נשמר באופן אוטומטי. כדי לחזור לחלון הטרמינל, לוחצים על 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: