במדריך הזה מוסבר איך ליצור נקודת קצה פרטית של HTTP באשכול פרטי של Google Kubernetes Engine (GKE) שמקבלת אירועים של הודעות Pub/Sub באמצעות Eventarc. מידע נוסף על יעד האירועים הזה זמין במאמר ניתוב אירועים לנקודת קצה פנימית של HTTP ברשת VPC.
אשכולות GKE פרטיים הם סוג של אשכולות מקוריים של ענן וירטואלי פרטי (VPC) שבהם לצמתים יש רק כתובות IP פנימיות. המשמעות היא שהצמתים וה-Pods מבודדים מהאינטרנט כברירת מחדל. אתם יכולים לבחור שלא תהיה גישה למישור הבקרה, שתהיה גישה מוגבלת או שתהיה גישה ללא הגבלה. אי אפשר להמיר אשכול קיים שאינו פרטי לאשכול פרטי. מידע נוסף זמין במאמר מידע על אשכולות פרטיים.
אפשר להריץ את הפקודות הבאות באמצעות Google Cloud CLI בטרמינל או ב-Cloud Shell.
מטרות
במדריך הזה תלמדו:
- יוצרים רשת משנה מסוג proxy-only ברשת ה-VPC שמוגדרת כברירת מחדל, ויוצרים כלל חומת אש ב-VPC.
- יצירת אשכול פרטי של GKE Autopilot ללא גישת לקוח לנקודת הקצה הציבורית.
- יצירת מכונה וירטואלית (VM) של Compute Engine ברשת משנה ספציפית של רשת ה-VPC.
- יוצרים חיבור SSH למכונה הווירטואלית ופורסים שירות לקבלת אירועים במכונה הווירטואלית.
- פריסת שער באשכול ומניפסט
HTTPRouteלהגדרת הניתוב של תעבורת נתונים ב-Kubernetes אל קצה העורף של האפליקציה. - יוצרים קובץ מצורף לרשת שמאפשר לרשת VPC של יצרן ליזום חיבורים לרשת VPC של צרכן.
- יוצרים טריגר Eventarc שמנתב אירועים של Pub/Sub למקלט האירועים במכונה הווירטואלית.
- מפרסמים הודעה בנושא Pub/Sub כדי ליצור אירוע, ומציגים את תוכן האירוע ביומני ה-Pod של האפליקציה.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי ליצור הערכת עלויות בהתאם לשימוש החזוי, אתם יכולים להשתמש במחשבון התמחור.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
- נכנסים לחשבון Google Cloud . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים Google Cloud פרויקט.
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
יוצרים Google Cloud פרויקט:
gcloud projects create PROJECT_ID
מחליפים את
PROJECT_IDבשם של פרויקט Google Cloud שיוצרים. -
בוחרים את הפרויקט שיצרתם: Google Cloud
gcloud config set project PROJECT_ID
מחליפים את
PROJECT_IDבשם הפרויקט ב- Google Cloud .
מפעילים את ממשקי ה-API של Cloud Resource Manager, Compute Engine, Eventarc, GKE ו-Pub/Sub, אם אחד מהם עדיין לא מופעל:
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, צריך את ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידיםgcloud services enable compute.googleapis.com
container.googleapis.com cloudresourcemanager.googleapis.com eventarc.googleapis.com pubsub.googleapis.com -
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים Google Cloud פרויקט.
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
יוצרים Google Cloud פרויקט:
gcloud projects create PROJECT_ID
מחליפים את
PROJECT_IDבשם של פרויקט Google Cloud שיוצרים. -
בוחרים את הפרויקט שיצרתם: Google Cloud
gcloud config set project PROJECT_ID
מחליפים את
PROJECT_IDבשם הפרויקט ב- Google Cloud .
מפעילים את ממשקי ה-API של Cloud Resource Manager, Compute Engine, Eventarc, GKE ו-Pub/Sub, אם אחד מהם עדיין לא מופעל:
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, צריך את ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידיםgcloud services enable compute.googleapis.com
container.googleapis.com cloudresourcemanager.googleapis.com eventarc.googleapis.com pubsub.googleapis.com - מעדכנים את הרכיבים של Google Cloud CLI:
gcloud components update
- נכנסים באמצעות החשבון:
gcloud auth login
-
אם אתם יוצרי הפרויקט, מוקצה לכם תפקיד הבעלים הבסיסי (
roles/owner). כברירת מחדל, תפקיד ניהול הזהויות והרשאות הגישה (IAM) הזה כולל את ההרשאות שנדרשות לגישה מלאה לרוב המשאבים Google Cloud, ואפשר לדלג על השלב הזה.אם אתם לא יוצרי הפרויקט, צריך להעניק את ההרשאות הנדרשות בחשבון המשתמש המתאים בפרויקט. לדוגמה, חשבון משתמש יכול להיות חשבון Google (למשתמשי קצה) או חשבון שירות (לאפליקציות ולעומסי עבודה ממוחשבים). מידע נוסף זמין בדף תפקידים והרשאות של יעד האירוע.
ההרשאות הנדרשות
כדי לקבל את ההרשאות שדרושות לביצוע ההפעלה המהירה הזו, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:
- אדמין ברשת Compute (
roles/compute.networkAdmin) - אדמין אבטחה ב-Compute (
roles/compute.securityAdmin) - אדמין ב-Eventarc (
roles/eventarc.admin) - אדמין ב-Kubernetes Engine (
roles/container.admin) - גישה לצפייה ביומנים (
roles/logging.viewAccessor) - אדמין IAM בפרויקט (
roles/resourcemanager.projectIamAdmin) - Pub/Sub Publisher (
roles/pubsub.publisher) - אדמין בחשבון שירות (
roles/iam.serviceAccountAdmin) - משתמש בחשבון שירות (
roles/iam.serviceAccountUser) - אדמין Service Usage (
roles/serviceusage.serviceUsageAdmin)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
- אדמין ברשת Compute (
חשוב לשים לב לחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine, כי תצטרכו לצרף אותו לטריגר של Eventarc כדי לייצג את הזהות של הטריגר למטרות בדיקה. חשבון השירות הזה נוצר באופן אוטומטי אחרי שמפעילים או משתמשים בשירות Google Cloud שמשתמש ב-Compute Engine, והפורמט של כתובת האימייל שלו הוא:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
מחליפים את
PROJECT_NUMBERבמספר הפרויקט ב- Google Cloud. אפשר לראות את מספר הפרויקט בדף Welcome במסוף Google Cloud או על ידי הרצת הפקודה הבאה:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
בסביבות ייצור, מומלץ מאוד ליצור חשבון שירות חדש ולהקצות לו תפקיד IAM אחד או יותר שמכילים את ההרשאות המינימליות הנדרשות, ולפעול לפי העיקרון של הרשאות מינימליות.
- אם הפעלתם את סוכן השירות של Cloud Pub/Sub ב-8 באפריל 2021 או לפני כן, כדי לתמוך בבקשות push מאומתות של Pub/Sub, צריך להקצות לסוכן השירות את התפקיד 'יצירת אסימונים בחשבון שירות' (
roles/iam.serviceAccountTokenCreator). אחרת, התפקיד הזה מוענק כברירת מחדל:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
יצירת תת-רשת לשרת proxy בלבד
אלא אם יוצרים מדיניות ארגונית שאוסרת זאת, פרויקטים חדשים מתחילים עם רשת ברירת מחדל (רשת VPC במצב אוטומטי) שיש לה רשת משנה אחת בכל אזור. כל רשת VPC מורכבת מטווח אחד או יותר של כתובות IP שנקראות תת-רשתות. תת-רשתות הן משאבים אזוריים, ויש להן טווחי כתובות IP שמשויכים אליהן.
משתמשים בפקודה
gcloud compute networks subnets createכדי ליצור רשת משנה עם שרת proxy בלבד ברשת ברירת המחדל.gcloud compute networks subnets create proxy-only-subnet \ --purpose=REGIONAL_MANAGED_PROXY \ --role=ACTIVE \ --region=us-central1 \ --network=default \ --range=10.10.10.0/24שימו לב שתת-רשת עם
purpose=REGIONAL_MANAGED_PROXYשמורה למאזני עומסים מבוססי Envoy, ושהערךrangeצריך לספק 64 כתובות IP או יותר.יוצרים כלל חומת אש שתואם לטווח של תת-הרשת של שרת ה-proxy בלבד, ומאפשר תעבורת נתונים ביציאת TCP 8080.
gcloud compute firewall-rules create allow-proxy-connection \ --allow tcp:8080 \ --source-ranges 10.10.10.0/24 \ --network=default
יצירת אשכול GKE פרטי
משתמשים בפקודה gcloud container clusters create-auto כדי ליצור אשכול GKE פרטי במצב Autopilot עם צמתים פרטיים, ללא גישת לקוח לנקודת הקצה הציבורית.
בדוגמה הבאה נוצר אשכול GKE פרטי בשם private-cluster, ונוצרת גם רשת משנה בשם my-subnet:
gcloud container clusters create-auto private-cluster \
--create-subnetwork name=my-subnet \
--enable-master-authorized-networks \
--enable-private-nodes \
--enable-private-endpoint \
--region=us-central1
שימו לב לנקודות הבאות:
-
--enable-master-authorized-networksמציין שהגישה לנקודת הקצה הציבורית מוגבלת לטווחי כתובות IP שאתם מאשרים. -
--enable-private-nodesמציין שלצמתים באשכול אין כתובות IP חיצוניות. -
--enable-private-endpointמציין שהאשכול מנוהל באמצעות כתובת ה-IP הפנימית של נקודת קצה ל-API של מישור הבקרה.
יכול להיות שיחלפו כמה דקות עד שהאשכול ייווצר. אחרי שהאשכול נוצר, הפלט אמור לציין שהסטטוס של האשכול הוא RUNNING.
יצירת מכונה וירטואלית ברשת משנה ספציפית
מכונה וירטואלית ב-Compute Engine היא מכונה וירטואלית שמארחת בתשתית של Google. המונחים מכונה של Compute Engine (Compute Engine instance), מכונת VM (VM instance) ו-VM הם מילים נרדפות ומשמשים לסירוגין. מכונות וירטואליות כוללות אשכולות GKE, מכונות עם סביבה גמישה של App Engine ומוצרים אחרים Google Cloud שנבנו על מכונות וירטואליות של Compute Engine.
משתמשים בפקודה gcloud compute instances create כדי ליצור מכונת VM של Compute Engine ברשת המשנה שיצרתם קודם. מצרפים חשבון שירות ומגדירים את היקף הגישה של המכונה הווירטואלית ל-cloud-platform.
gcloud compute instances create my-vm \
--service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com \
--scopes=https://www.googleapis.com/auth/cloud-platform \
--zone=us-central1-a \
--subnet=my-subnet
מידע נוסף זמין במאמר יצירה והפעלה של מכונה וירטואלית.
פריסת מקלט אירועים במכונה הווירטואלית
באמצעות תמונה מוכנה מראש, us-docker.pkg.dev/cloudrun/container/hello, פורסים שירות במכונה הווירטואלית שמקשיב ליציאה 80 ומקבל ומנהל רישום של אירועים.
מריצים את הפקודה הבאה כדי ליצור חיבור SSH למכונת ה-VM:
gcloud compute ssh my-vm --project=PROJECT_ID --zone=us-central1-aאחרי שנוצר חיבור לשרת ה-SSH, מריצים את הפקודות שנותרו במכונת ה-VM.
במידת הצורך, מתקינים את
kubectlופלאגינים נדרשים.במכונה הווירטואלית, משתמשים בפקודה
get-credentialsכדי להפעיל אתkubectlלעבודה עם האשכול שיצרתם.gcloud container clusters get-credentials private-cluster \ --region=us-central1 \ --internal-ipמשתמשים בפקודת Kubernetes,
kubectl create deployment, כדי לפרוס אפליקציה באשכול.kubectl create deployment hello-app \ --image=us-docker.pkg.dev/cloudrun/container/helloכך נוצר פריסה בשם
hello-app. ה-Pod של הפריסה מפעיל את קובץ האימג' של הקונטיינרhello.אחרי פריסת האפליקציה, אפשר לחשוף אותה לתנועת גולשים על ידי יצירת שירות Kubernetes. מריצים את הפקודה הבאה:
kubectl exposekubectl expose deployment hello-app \ --type ClusterIP \ --port 80 \ --target-port 8080הפלט אמור להיראות כך:
service/hello-app exposedאפשר להתעלם מהודעות דומות להודעות הבאות:
E0418 14:15:33.970933 1129 memcache.go:287] couldn't get resource list for metrics.k8s.io/v1beta1: the server is currently unable to handle the request
הגדרת ניתוב תנועה ב-Kubernetes
מקור מידע מסוג Gateway מייצג מישור נתונים שמנתב תעבורה ב-Kubernetes. שער יכול לייצג סוגים שונים של איזון עומסים וניתוב, בהתאם ל-GatewayClass שממנו הוא נגזר. מידע נוסף זמין במאמר בנושא פריסת שערים.
HTTPRoute מניפסט נפרס כדי ליצור נתיבים ולשלוח תנועה לשרתי קצה עורפיים של אפליקציות.
פורסים שער באשכול.
kubectl apply -f - <<EOF kind: Gateway apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: internal-http spec: gatewayClassName: gke-l7-rilb listeners: - name: http protocol: HTTP port: 80 EOFשימו לב לנקודות הבאות:
-
gatewayClassName: gke-l7-rilbמציין את GatewayClass שממנו נגזר Gateway הזה. gke-l7-rilbמתאים למאזן עומסים של אפליקציות פנימי. -
port: 80מציין ששער הגישה חושף רק את יציאה 80 להאזנה לתנועת HTTP.
-
מוודאים שהשער נפרס בצורה נכונה. יכול להיות שיעברו כמה דקות עד שכל המשאבים יופעלו.
kubectl describe gateways.gateway.networking.k8s.io internal-httpהפלט אמור להיראות כך:
Name: internal-http Namespace: default ... API Version: gateway.networking.k8s.io/v1beta1 Kind: Gateway ... Spec: Gateway Class Name: gke-l7-rilb Listeners: Allowed Routes: Namespaces: From: Same Name: http Port: 80 Protocol: HTTP Status: Addresses: Type: IPAddress Value: 10.36.172.5 ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ADD 80s sc-gateway-controller default/internal-http Normal UPDATE 20s (x3 over 80s) sc-gateway-controller default/internal-http Normal SYNC 20s sc-gateway-controller SYNC on default/internal-http was a successפורסים מניפסט
HTTPRouteכדי לנתב תנועת HTTP לשירותhello-appביציאה 80.kubectl apply -f - <<EOF kind: HTTPRoute apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: hello-app-route spec: parentRefs: - kind: Gateway name: internal-http rules: - backendRefs: - name: hello-app port: 80 EOF
יצירת קובץ מצורף לרשת
צירוף רשת הוא משאב שמאפשר לרשת VPC של יצרן ליזום חיבורים לרשת VPC של צרכן דרך ממשק Private Service Connect.
כדי לפרסם אירועים, Eventarc משתמש בחיבור לרשת כדי ליצור חיבור לנקודת קצה פנימית של HTTP שמארחת ברשת VPC.
אתם יכולים ליצור מחבר רשת שיקבל באופן אוטומטי חיבורים מכל ממשק Private Service Connect שמפנה למחבר הרשת. יוצרים את מחבר הרשת באותה רשת ובאותו אזור שמכילים את שירות היעד של HTTP.
gcloud compute network-attachments create my-network-attachment \ --region=us-central1 \ --subnets=my-subnet\ --connection-preference=ACCEPT_AUTOMATIC
מידע נוסף זמין במאמר בנושא קובצי רשת מצורפים.
יצירת טריגר Eventarc
יוצרים טריגר Eventarc שיוצר נושא חדש ב-Pub/Sub ומנתב אירועים אל מקבל האירועים שנפרס במכונה הווירטואלית כשמתפרסמת הודעה בנושא ב-Pub/Sub.
מאחזרים את כתובת השער.
GATEWAY_ADDRESS=$(kubectl get gateways.gateway.networking.k8s.io internal-http -o=jsonpath="{.status.addresses[0].value}")יוצרים טריגר.
gcloud eventarc triggers create my-trigger \ --location=us-central1 \ --destination-http-endpoint-uri="http://$GATEWAY_ADDRESS:80/" \ --network-attachment="projects/PROJECT_ID/regions/us-central1/networkAttachments/my-network-attachment" \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.comמחליפים את
PROJECT_NUMBERבמספר הפרויקט ב- Google Cloud. אפשר לראות את מספר הפרויקט בדף Welcome במסוף Google Cloud או על ידי הרצת הפקודה הבאה:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
מידע נוסף על הגדרת הטריגר זמין במאמר בנושא ניתוב אירועים לנקודת קצה פנימית של HTTP ברשת VPC.
יצירה והצגה של אירוע בנושא Pub/Sub
אפשר ליצור אירוע על ידי פרסום הודעה בנושא Pub/Sub.
מאתרים את נושא ה-Pub/Sub ומגדירים אותו כמשתנה סביבה.
export MY_TOPIC=$(gcloud eventarc triggers describe my-trigger \ --location=us-central1 \ --format='value(transport.pubsub.topic)')מפרסמים הודעה בנושא Pub/Sub כדי ליצור אירוע.
gcloud pubsub topics publish $MY_TOPIC --message "Hello World"הטריגר של Eventarc מעביר את האירוע לנקודת הקצה הפנימית של HTTP באשכול הפרטי של GKE.
בודקים את היומנים של ה-Pod של האפליקציה ומוודאים שהאירוע נמסר.
POD_NAME=$(kubectl get pod --selector app=hello-app --output=name) kubectl logs $POD_NAMEגוף האירוע צריך להיראות כך:
2024/04/18 20:31:43 Hello from Cloud Run! The container started successfully and is listening for HTTP requests on $PORT {"severity":"INFO","eventType":"google.cloud.pubsub.topic.v1.messagePublished","message":"Received event of type google.cloud.pubsub.topic.v1.messagePublished. Event data: Hello World","event":{"specversion":"1.0","id":"10935738681111260","source":"//pubsub.googleapis.com/projects/my-project/topics/eventarc-us-central1-my-trigger-224","type":"google.cloud.pubsub.topic.v1.messagePublished","datacontenttype":"application/json","time":"2024-04-18T20:40:03Z","data": {"message":{"data":"SGVsbG8gV29ybGQ=","messageId":"10935738681111260","publishTime":"2024-04-18T20:40:03Z"}}}}
הצלחתם לפרוס שירות לקבלת אירועים לנקודת קצה (endpoint) פנימית של HTTP באשכול GKE פרטי, ליצור טריגר Eventarc, ליצור אירוע מ-Pub/Sub ולאשר שהאירוע הופנה כמצופה על ידי הטריגר לנקודת היעד.
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
מחיקת הפרויקט
כדי למחוק Google Cloud פרויקט:
gcloud projects delete PROJECT_ID
מחיקת משאבים בודדים
- מוחקים את הטריגר של Eventarc:
gcloud eventarc triggers delete my-trigger --location=us-central1
- יוצאים מהמכונה הווירטואלית ואז מוחקים אותה:
gcloud compute instances delete my-vm --zone=us-central1-a
- מוחקים את הקובץ המצורף לרשת:
gcloud compute network-attachments delete my-network-attachment --region=us-central1
- מוחקים את כלל חומת האש:
gcloud compute firewall-rules delete allow-proxy-connection
- מחיקת האשכול:
gcloud container clusters delete private-cluster --region=us-central1
- Delete the subnet:
gcloud compute networks subnets delete proxy-only-subnet --region=us-central1