במדריך הזה נסביר איך לפרוס שירות gRPC פשוט באמצעות Extensible Service Proxy V2 (ESPv2) ב-Google Kubernetes Engine (GKE). במדריך הזה נעשה שימוש בגרסת Python של הדוגמה bookstore-grpc. דוגמאות ל-gRPC בשפות אחרות מופיעות בקטע מה השלב הבא.
במדריך נעשה שימוש בקובצי אימג' של קונטיינרים שנבנו מראש של קוד לדוגמה ושל ESPv2, שמאוחסנים ב-Artifact Registry. אם אתם לא מכירים את המושג 'מאגרי תגים', תוכלו לקרוא מידע נוסף במאמרים הבאים:
סקירה כללית של Cloud Endpoints זמינה במאמרים מידע על Endpoints וארכיטקטורת Endpoints.
מטרות
במהלך העבודה עם המדריך, תוכלו להשתמש ברשימת המשימות הכללית הבאה. כדי לשלוח בקשות ל-API, צריך לבצע את כל המשימות.
- מגדירים Google Cloud פרויקט ומורידים את התוכנה הנדרשת. לפני שמתחילים
- העתקה והגדרה של קבצים מהדוגמה
bookstore-grpc. איך מגדירים נקודות קצה - פורסים את ההגדרה של Endpoints כדי ליצור שירות Endpoints. איך פורסים את ההגדרה של Endpoints
- יוצרים קצה עורפי להצגת ה-API ופורסים את ה-API. מידע נוסף מופיע במאמר בנושא פריסת בק-אנד של API.
- קבלת כתובת ה-IP החיצונית של השירות. איך מקבלים את כתובת ה-IP החיצונית של השירות
- שליחת בקשה ל-API. שליחת בקשה ל-API
- כדי להימנע מחיובים בחשבון Google Cloud , מידע נוסף זמין במאמר בנושא הסרת המשאבים.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
- רושמים בצד את Google Cloud מזהה הפרויקט כי תצטרכו אותו בהמשך.
- מתקינים ומפעילים את Google Cloud CLI.
- מעדכנים את ה-CLI של gcloud ומתקינים את רכיבי Endpoints.
gcloud components update
- מוודאים ש-Google Cloud CLI (
gcloud) מורשה לגשת לנתונים ולשירותים שלכם ב- Google Cloud: נפתחת כרטיסייה חדשה בדפדפן ומוצגת בקשה לבחירת חשבון.gcloud auth login
- מגדירים את פרויקט ברירת המחדל למזהה הפרויקט.
gcloud config set project YOUR_PROJECT_ID
מחליפים את YOUR_PROJECT_ID במזהה הפרויקט.
אם יש לכם פרויקטים אחרים ב- Google Cloud ואתם רוצים להשתמש ב-
gcloudכדי לנהל אותם, תוכלו לקרוא את המאמר בנושא ניהול הגדרות אישיות ב-CLI של gcloud. - התקנה של
kubectl:gcloud components install kubectl
- קבלת פרטי כניסה חדשים של משתמשים לשימוש כפרטי הכניסה שמוגדרים כברירת מחדל באפליקציה. צריך את פרטי הכניסה של המשתמש כדי לתת הרשאה ל-
kubectl. בכרטיסייה החדשה בדפדפן שנפתחת, בוחרים חשבון.gcloud auth application-default login
- כדי להתקין את gRPC ואת כלי gRPC, פועלים לפי השלבים שמפורטים ב מדריך למתחילים של gRPC Python.
הגדרת נקודות קצה
הדוגמה bookstore-grpc
כוללת את הקבצים שצריך להעתיק באופן מקומי ולהגדיר.
- Create a self-contained protobuf descriptor file from your service
.protofile:- Save a copy of
bookstore.protofrom the example repository. This file defines the Bookstore service's API. - Create the following directory:
mkdir generated_pb2 - Create the descriptor file,
api_descriptor.pb, by using theprotocprotocol buffers compiler. Run the following command in the directory where you savedbookstore.proto:python -m grpc_tools.protoc \ --include_imports \ --include_source_info \ --proto_path=. \ --descriptor_set_out=api_descriptor.pb \ --python_out=generated_pb2 \ --grpc_python_out=generated_pb2 \ bookstore.proto
In the preceding command,
--proto_pathis set to the current working directory. In your gRPC build environment, if you use a different directory for.protoinput files, change--proto_pathso the compiler searches the directory where you savedbookstore.proto.
- Save a copy of
- Create a gRPC API configuration YAML file:
- Save a copy of the
api_config.yamlfile. This file defines the gRPC API configuration for the Bookstore service. - Replace MY_PROJECT_ID in your
api_config.yamlfile with your Google Cloud project ID. For example:# # Name of the service configuration. # name: bookstore.endpoints.example-project-12345.cloud.goog
Note that the
apis.namefield value in this file exactly matches the fully-qualified API name from the.protofile; otherwise deployment won't work. The Bookstore service is defined inbookstore.protoinside packageendpoints.examples.bookstore. Its fully-qualified API name isendpoints.examples.bookstore.Bookstore, just as it appears in theapi_config.yamlfile.apis: - name: endpoints.examples.bookstore.Bookstore
- Save a copy of the
מידע נוסף מופיע במאמר הגדרת נקודות קצה.
פריסת ההגדרה של נקודות הקצה
כדי לפרוס את ההגדרה של Endpoints, משתמשים בפקודה gcloud endpoints services deploy. הפקודה הזו משתמשת בService Management כדי ליצור שירות מנוהל.
- Make sure you are in the directory where the
api_descriptor.pbandapi_config.yamlfiles are located. - Confirm that the default project that the
gcloudcommand-line tool is currently using is the Google Cloud project that you want to deploy the Endpoints configuration to. Validate the project ID returned from the following command to make sure that the service doesn't get created in the wrong project.gcloud config list project
If you need to change the default project, run the following command:
gcloud config set project YOUR_PROJECT_ID
- Deploy the
proto descriptorfile and the configuration file by using the Google Cloud CLI:gcloud endpoints services deploy api_descriptor.pb api_config.yaml
As it is creating and configuring the service, Service Management outputs information to the terminal. When the deployment completes, a message similar to the following is displayed:
Service Configuration [CONFIG_ID] uploaded for service [bookstore.endpoints.example-project.cloud.goog]
CONFIG_ID is the unique Endpoints service configuration ID created by the deployment. For example:
Service Configuration [2017-02-13r0] uploaded for service [bookstore.endpoints.example-project.cloud.goog]
In the previous example,
2017-02-13r0is the service configuration ID andbookstore.endpoints.example-project.cloud.googis the service name. The service configuration ID consists of a date stamp followed by a revision number. If you deploy the Endpoints configuration again on the same day, the revision number is incremented in the service configuration ID.
בדיקת השירותים הנדרשים
לפחות השירותים הבאים של Google צריכים להיות מופעלים ב-Endpoints וב-ESP:| שם | כותרת |
|---|---|
servicemanagement.googleapis.com |
Service Management API |
servicecontrol.googleapis.com |
Service Control API |
ברוב המקרים, הפקודה gcloud endpoints services deploy מפעילה את השירותים הנדרשים האלה. עם זאת, הפקודה gcloud מסתיימת בהצלחה אבל לא מפעילה את השירותים הנדרשים בנסיבות הבאות:
אם השתמשתם באפליקציה של צד שלישי כמו Terraform ולא כללתם את השירותים האלה.
הפריסה של הגדרת ה-Endpoints בוצעה בפרויקטGoogle Cloud קיים שבו השירותים האלה הושבתו באופן מפורש.
כדי לוודא שהשירותים הנדרשים מופעלים, משתמשים בפקודה הבאה:
gcloud services list
אם השירותים הנדרשים לא מופיעים ברשימה, צריך להפעיל אותם:
gcloud services enable servicemanagement.googleapis.com
gcloud services enable servicecontrol.googleapis.comצריך גם להפעיל את שירות Endpoints:
gcloud services enable ENDPOINTS_SERVICE_NAME
כדי לדעת מהו ENDPOINTS_SERVICE_NAME, אפשר:
אחרי פריסת ההגדרה של Endpoints, נכנסים לדף Endpoints במסוף Cloud. רשימת האפשרויות האפשריות של ENDPOINTS_SERVICE_NAME מוצגת בעמודה שם השירות.
ב-OpenAPI, ENDPOINTS_SERVICE_NAME הוא הערך שציינתם בשדה
hostבמפרט OpenAPI. ב-gRPC, ENDPOINTS_SERVICE_NAME הוא הערך שציינתם בשדהnameבהגדרות של נקודות הקצה של gRPC.
מידע נוסף על פקודות gcloud זמין במאמר שירותי gcloud.
אם מופיעה הודעת שגיאה, אפשר להיעזר במאמר בנושא פתרון בעיות בהטמעה של הגדרות Endpoints.
מידע נוסף זמין במאמר פריסת ההגדרה של Endpoints.
פריסת ה-API backend
עד עכשיו פרסתם את הגדרת השירות ב-Service Management, אבל עדיין לא פרסתם את הקוד שמשרת את העורף של ה-API. בקטע הזה מוסבר איך ליצור אשכול GKE לאירוח הקצה העורפי של ה-API ולפריסת ה-API.
יצירת אשכול של מאגרי תגים
כדי להשתמש באיזון עומסים שמקורו בקונטיינר, צריך להגדיר ל-cluster כינוי לכתובת IP. כדי ליצור אשכול מאגדים עם כינוי לכתובת IP בדוגמה שלנו:
gcloud container clusters create espv2-demo-cluster \
--enable-ip-alias \
--create-subnetwork="" \
--network=default \
--zone=us-central1-a
הפקודה שלמעלה יוצרת אשכול, espv2-demo-cluster, עם רשת משנה שהוקצתה אוטומטית באזור us-central1-a.
אימות kubectl לאשכול המכילים
כדי להשתמש ב-kubectl כדי ליצור ולנהל משאבי אשכול, צריך לקבל פרטי כניסה לאשכול ולהפוך אותם לזמינים ל-kubectl. כדי לעשות את זה, מריצים את הפקודה הבאה ומחליפים את NAME בשם החדש של האשכול ואת ZONE באזור של האשכול.
gcloud container clusters get-credentials NAME --zone ZONE
בדיקת ההרשאות הנדרשות
ESP ו-ESPv2 קוראים לשירותי Google שמשתמשים ב-IAM כדי לוודא שלזהות שקוראת יש מספיק הרשאות לגשת למשאבי ה-IAM שנעשה בהם שימוש. הזהות של הקריאה היא חשבון השירות המצורף שפורסו בו ESP ו-ESPv2.
כשפורסים את האפליקציה בתרמיל GKE, חשבון השירות המצורף הוא חשבון השירות של הצומת. בדרך כלל זה חשבון השירות שמוגדר כברירת מחדל ב-Compute Engine. כדי לבחור חשבון שירות מתאים לצומת, צריך לפעול לפי ההמלצה בנושא הרשאות.
אם נעשה שימוש ב- Workload Identity, אפשר להשתמש בחשבון שירות נפרד, שאינו חשבון השירות של הצומת, כדי לתקשר עם שירותי Google. אפשר ליצור חשבון שירות של Kubernetes בשביל הפוד כדי להריץ את ESP ו-ESPv2, ליצור חשבון שירות של Google ולקשר את חשבון השירות של Kubernetes לחשבון השירות של Google.
כדי לשייך חשבון שירות של Kubernetes לחשבון שירות של Google, פועלים לפי השלבים האלה. חשבון השירות הזה של Google הוא חשבון השירות המצורף.
אם חשבון השירות המצורף הוא חשבון השירות שמוגדר כברירת מחדל ב-Compute Engine של הפרויקט, וההגדרה של שירות נקודת הקצה נפרסת באותו הפרויקט, לחשבון השירות אמורות להיות מספיק הרשאות כדי לגשת למשאבי IAM, ולכן אפשר לדלג על שלב ההגדרה של תפקידי IAM. אחרת, צריך להוסיף את התפקידים הבאים ב-IAM לחשבון השירות המצורף.
מוסיפים את התפקידים הנדרשים ב-IAM:
בקטע הזה מתוארים משאבי ה-IAM שמשמשים את ESP ו-ESPv2, ותפקידי ה-IAM שנדרשים לחשבון השירות המצורף כדי לגשת למשאבים האלה.
הגדרת שירות נקודות קצה
ESP ו-ESPv2 קוראים ל-Service Control API, שמשתמש בהגדרות השירות של נקודת הקצה. הגדרת שירות נקודת הקצה היא משאב IAM, ו-ESP ו-ESPv2 צריכים את התפקיד Service Controller כדי לגשת אליו.
תפקיד ה-IAM מוגדר בהגדרות של שירות נקודת הקצה, ולא בפרויקט. יכול להיות שלפרויקט יש כמה הגדרות של שירות נקודות קצה.
משתמשים בפקודה הבאה ב-gcloud כדי להוסיף את התפקיד לחשבון השירות המצורף להגדרת שירות נקודת הקצה.
gcloud endpoints services add-iam-policy-binding SERVICE_NAME \ --member serviceAccount:SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com \ --role roles/servicemanagement.serviceController
כאשר
* SERVICE_NAME הוא שם שירות נקודת הקצה
* SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com
הוא חשבון השירות המצורף.
Cloud Trace
ESP ו-ESPv2 קוראים לשירות
Cloud Trace כדי לייצא את הנתונים של Trace לפרויקט. הפרויקט הזה נקרא פרויקט המעקב. ב-ESP, פרויקט המעקב והפרויקט שבבעלותו הגדרות השירות של נקודת הקצה הם אותו פרויקט. ב-ESPv2, אפשר לציין את פרויקט המעקב באמצעות הדגל --tracing_project_id, ופרויקט הפריסה מוגדר כברירת מחדל.
כדי להפעיל את Cloud Trace, צריך להקצות ל-ESP ול-ESPv2 את התפקיד Cloud Trace Agent.
משתמשים בפקודה הבאה ב-gcloud כדי להוסיף את התפקיד לחשבון השירות המצורף:
gcloud projects add-iam-policy-binding TRACING_PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudtrace.agent
כאשר
* TRACING_PROJECT_ID הוא מזהה פרויקט המעקב
* SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com
הוא חשבון השירות המצורף.
מידע נוסף זמין במאמר
מהם תפקידים והרשאות?
הגדרת מפתחות ואישורים של SSL
איזון עומסים מקורי של מאגרי תגים משתמש באיזון עומסים של HTTP2 שחייב להיות מוצפן באמצעות TLS. לשם כך היה צריך לפרוס אישור TLS ל-GKE ingress ול-ESPv2. אתם יכולים להשתמש באישור משלכם או באישור עם חתימה עצמית.
יוצרים אישור ומפתח בחתימה עצמית באמצעות openssl. מוודאים שהזנתם את אותו FQDN
bookstore.endpoints.MY_PROJECT_ID.cloud.googכשנשאלתם לגבי "שם נפוץ(CN)". השם הזה משמש את הלקוחות לאימות אישור השרת.openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout ./server.key -out ./server.crt
יוצרים סוד ב-Kubernetes עם מפתח ואישור SSL. שימו לב שהאישור מועתק לשני מקומות,
server.crtו-tls.crt, כי הסוד מסופק גם ל-GKE ingress וגם ל-ESPv2. GKE Ingress מחפש את נתיב האישורtls.crtו-ESPv2 מחפש את נתיב האישורserver.crt.kubectl create secret generic esp-ssl \ --from-file=server.crt=./server.crt --from-file=server.key=./server.key \ --from-file=tls.crt=./server.crt --from-file=tls.key=./server.key
פריסת ה-API לדוגמה ו-ESPv2 באשכול
כדי לפרוס את שירות ה-gRPC לדוגמה באשכול כדי שהלקוחות יוכלו להשתמש בו:
-
git cloneהמאגר הזה ופותחים אותו כדי לערוך את קובץ המניפסט של הפריסה grpc-bookstore.yaml. - מחליפים את SERVICE_NAME בשם של שירות Endpoints לכניסה וקונטיינר ESPv2.
זהו אותו שם שהגדרתם בשדה
nameבקובץapi_config.yaml.האפשרות
--rollout_strategy=managedמגדירה את ESPv2 כך שישתמש בהגדרת השירות העדכנית ביותר שפריסתה הושלמה. כשמציינים את האפשרות הזו, תוך דקה אחרי פריסת הגדרת שירות חדשה, ESPv2 מזהה את השינוי ומתחיל להשתמש בה באופן אוטומטי. אנחנו ממליצים לציין את האפשרות הזו במקום לספק מזהה הגדרה ספציפי לשימוש ב-ESPv2. פרטים נוספים על הארגומנטים של ESPv2 מופיעים במאמר בנושא אפשרויות ההפעלה של ESPv2.לדוגמה:
spec: containers: - name: esp image: gcr.io/endpoints-release/endpoints-runtime:2 args: [ "--listener_port=9000", "--service=bookstore.endpoints.example-project-12345.cloud.goog", "--rollout_strategy=managed", "--backend=grpc://127.0.0.1:8000" ]פריסת הגדרות שירות לנקודות קצה
אם אתם מפעילים מספר גדול של נקודות קצה (יותר מ-100) באותו פרויקט ב-Google Cloud, מומלץ לטעון את הגדרת השירות עבור הקונטיינר במקום להשתמש בדגל
--rollout_strategy=managedכדי לשלוף את הגדרת השירות מ-Service Management API.ל-Service Management API יש מכסה שמוגדרת כברירת מחדל. אם צי גדול של שרתי proxy של ESPv2 משתמש ב-
כדי לטעון את קובץ ההגדרות של השירות:--rollout_strategy=managed, כולם יבצעו סקר כדי לקבל את הגדרת השירות העדכנית ביותר. יכול להיות שמספר המכשירים חורג מהמכסה, ולכן העדכון של הגדרות השירות נכשל.- מורידים את קובץ ההגדרות של שירות בפורמט JSON.
- יוצרים משאב של מפת הגדרות של Kubernetes מהגדרות ה-JSON.
- מטמיעים את משאב מפת ההגדרות בקונטיינר ומשתמשים בדגל
--service_config_pathכדי לציין את הנתיב של קובץ ההגדרות.
curl -o "/tmp/service_config.json" -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://servicemanagement.googleapis.com/v1/services/SERVICE/configs/CONFIG_ID?view=FULL"
kubectl create configmap service-config-configmap \ --from-file=service_config.json:/tmp/service_config.json
לדוגמה:
containers: - args: - --listener_port=8081 - --backend=http://127.0.0.1:8080 - --service_json_path=/etc/espv2_config/service_config.json - --healthz=/healthz image: gcr.io/endpoints-release/endpoints-runtime:2 name: esp ports: - containerPort: 8081 protocol: TCP volumeMounts: - mountPath: /etc/espv2_config name: service-config-volume volumes: - configMap: defaultMode: 420 name: service-config-configmap name: service-config-volume - מפעילים את השירות:
kubectl create -f grpc-bookstore.yaml
אם מופיעה הודעת שגיאה, אפשר לעיין במאמר בנושא פתרון בעיות בנקודות קצה ב-GKE.
קבלת כתובת ה-IP החיצונית של השירות
כדי לשלוח בקשות ל-API לדוגמה, צריך את כתובת ה-IP החיצונית של השירות. יכול להיות שיעברו כמה דקות אחרי שתפעילו את השירות במאגר לפני שכתובת ה-IP החיצונית תהיה מוכנה.
צפייה בכתובת ה-IP החיצונית:
kubectl get ingress
רושמים את הערך של
EXTERNAL-IPושומרים אותו במשתנה סביבה SERVER_IP. כתובת ה-IP החיצונית משמשת לשליחת בקשות ל-API לדוגמה.export SERVER_IP=YOUR_EXTERNAL_IP
שליחת בקשה ל-API
To send requests to the sample API, you can use a sample gRPC client written in Python.
Clone the git repo where the gRPC client code is hosted:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Change your working directory:
cd python-docs-samples/endpoints/bookstore-grpc/
Install dependencies:
pip install virtualenvvirtualenv envsource env/bin/activatepython -m pip install -r requirements.txtCreate a root CA for the self-signed certificate
openssl x509 -in server.crt -out client.pem -outform PEM
Send a request to the sample API:
python bookstore_client.py --host SERVER_IP --port 443 \ --servername bookstore.endpoints.MY_PROJECT_ID.cloud.goog --use_tls true --ca_path=client.pem
Look at the activity graphs for your API in the Endpoints > Services page.
Go to the Endpoints Services page
It may take a few moments for the request to be reflected in the graphs.
Look at the request logs for your API in the Logs Explorer page.
אם לא מקבלים תגובה, אפשר להיעזר במאמר בנושא פתרון בעיות שקשורות לתגובות.
הרגע פרסתם ובדקתם API ב-Endpoints!
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
מחיקת ה-API:
gcloud endpoints services delete SERVICE_NAME
מחליפים את SERVICE_NAME בשם ה-API.
מחיקת אשכול GKE:
gcloud container clusters delete NAME --zone ZONE