גם Cloud Run וגם Kubernetes משתמשים בתמונות קונטיינר רגילות כארטיפקטים של פריסה, ושניהם משתמשים במודל API הצהרתי עם משאבים שאפשר לייצג בקובצי YAML עם אותה מבנה סטנדרטי.
מבוא
Cloud Run Admin API v1 נועד למקסם את הניידות עם Kubernetes. לדוגמה, למשאבים של Cloud Run Admin API יש את אותן מוסכמות מבנה ושמות מאפיינים כמו למשאבים של Kubernetes. מידע נוסף זמין במאמר הפניה ל-YAML של שירות Cloud Run.
Cloud Run Admin API v1 מטמיע את מפרט Knative Serving API, אבל לא צריך לבצע מיגרציה ל-Knative כדי להעביר את עומסי העבודה של Cloud Run לאשכול Kubernetes כמו GKE.
מדריך למתחילים
המדריך למתחילים הזה הוא דוגמה להעברה פשוטה.
השוואה פשוטה בין משאבים
משווים בין שירות פשוט של Cloud Run בשם my-app לבין פריסה מקבילה של Kubernetes.
שימו לב שקובצי ה-YAML כמעט זהים.
עם זאת, החלקים ב-blue
שונים וצריך לשנות אותם.
צריך להוסיף את החלקים בgreen.
| שירות Cloud Run | פריסת Kubernetes |
|---|---|
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-app namespace: 'PROJECT_NUMBER' spec: template: spec: containers: - image: gcr.io/cloudrun/hello env: - name: HELLO value: world |
apiVersion: apps/v1 kind: Deployment metadata: name: my-app namespace: default labels: app: my-app spec: template: metadata: labels: app: my-app spec: containers: - image: gcr.io/cloudrun/hello env: - name: HELLO value: world replicas: 3 selector: matchLabels: app: my-app |
העברת שירות Cloud Run ל-GKE
מורידים את קובץ ה-YAML של השירות לספרייה הנוכחית:
gcloud run services describe my-app --format export > my-app.yaml
משנים את קובץ ה-YAML כך שיתאים לפריסת Kubernetes:
- במאפיין '
kind': מחליפים את הערך 'Service' בערך 'Deployment' - במאפיין '
apiVersion': מחליפים את הערך 'serving.knative.dev/v1' בערך 'apps/v1' - מחליפים את
metadata.namespaceבמרחב השמות של אשכול GKE שרוצים לפרוס בו, לדוגמהdefault. - מוסיפים תווית חדשה מתחת ל
metadataולspec.template.metadata. - מגדירים מספר קבוע של מופעים ("עותקים") באמצעות
spec.template.spec.replicasומגדירים בורר תוויות ב-spec.template.spec.selector.
- במאפיין '
מתקינים את כלי שורת הפקודה
kubectlומשתמשים בו כדי לפרוס את קובץmy-app.yamlבאשכול GKE:kubectl apply -f ./my-app.yaml
חשיפת הפריסה כשירות:
kubectl expose deployment my-app --type LoadBalancer --port 80 --target-port 8080
שיקולים כשמעבירים מ-Cloud Run ל-GKE
אשכול:
Cloud Run היא פלטפורמה מנוהלת, בעוד ש-GKE דורשת יותר ניהול פלטפורמה. אם עדיין לא יצרתם אשכול GKE, כדאי להשתמש ב-GKE Autopilot.
יכולת המדרגיות של עומסי עבודה ב-GKE מוגבלת על ידי גודל האשכול. אם אתם לא משתמשים באשכול Autopilot, כדאי להשתמש בהקצאת צמתים אוטומטית (NAP) ובמידרוג אוטומטי של אשכולות כדי לשנות את גודל האשכול.
ל-Cloud Run יש יתירות מובנית באזור, לכן כדאי להעביר את הנתונים לאשכול אזורי ולהקצות מספיק רפליקות כדי לוודא שהשירות עמיד בפני הפסקה זמנית בשירות באזור שנבחר Google Cloud .
Pricing
ב-Cloud Run מחויבים על משאבים בשימוש, וב-GKE מחויבים על משאבים שהוקצו.
אבטחה:
בניגוד ל-Cloud Run, הפעלה של שירות GKE לא כפופה להרשאת הפעלה ב-IAM.
מכיוון ש-GKE לא מספק בידוד חזק בין קונטיינרים, כדאי להשתמש ב-GKE Sandbox אם אתם צריכים להריץ קוד לא ידוע או לא מהימן.
Networking
כדי לגשת למשאבים אחרים ב-VPC, צריך מחבר של חיבור לרשת (VPC) מאפליקציית serverless ב-Cloud Run. עומסי עבודה ב-GKE נמצאים ישירות ב-VPC ולא צריך מחבר.
תכונות שלא נתמכות ב-Google Kubernetes Engine
התכונות הבאות של Cloud Run לא זמינות ב-GKE:
- ניהול גרסאות של הגדרות באמצעות שינויים
- פיצול תנועה להשקות הדרגתיות ולביטול שינויים בגרסאות
- חיוב לפי בקשה
- CPU boost
- זיקה לסשן
- תוויות בעומסי עבודה ב-GKE הן לא Google Cloud תוויות
- תגים בעומסי עבודה
העברת משאבים ב-Cloud Run
בקטעים הבאים מתואר תהליך העברת המשאבים שנעשה בהם שימוש ב-Cloud Run, כמו שירותים, משימות וסודות של Cloud Run.
העברת שירותים של Cloud Run
אתם יכולים להעביר שירות של Cloud Run למשאבים הבאים ב-GKE:
- פריסת Kubernetes כדי ליצור מופעים (שנקראים 'pods' ב-Kubernetes).
- שירותי Kubernetes כדי לחשוף את הפריסה בנקודת קצה ספציפית.
- Kubernetes Horizontal Pod Autoscaler: כדי לשנות את גודל הפריסה באופן אוטומטי.
המאפיינים של פריסת Kubernetes הם קבוצת-על של המאפיינים של שירותי Cloud Run.
כמו שמוצג במדריך למתחילים, אחרי שמשנים את המאפיינים apiVersion ו-kind למאפיינים apps/v1 ו-Deployment, צריך לשנות גם את הדברים הבאים:
- מחליפים את
namespaceבמרחב השמות של אשכול GKE שרוצים לפרוס אליו, לדוגמהdefault. -
serviceAccountNameצריך להפנות לחשבון שירות של Kubernetes, שיכול לשמש גם כחשבון שירות של IAM באמצעות איחוד שירותי אימות הזהות של עומסי עבודה ב-GKE. - מוסיפים LABEL ב-
metadata.labelsוב-spec.template.metadata.labelsשישמשו לבחירת הפריסה וה-pods. לדוגמה:app: NAME - בקטע
spec.template:- מוסיפים מאפיין
replicasכדי לציין מספר של 'מופעים'. - מוסיפים מאפיין
selector.matchLabelsשבוחר לפי התווית LABEL.
- מוסיפים מאפיין
- אם שירות Cloud Run שלכם מטמיע סודות, כדאי לעיין במאמר בנושא העברת סודות.
- אם שירות Cloud Run שהועבר ניגש למשאבים בענן וירטואלי פרטי (VPC), לא צריך להשתמש במחבר Serverless VPC Access.
אחרי שיוצרים את הפריסה של Kubernetes, יוצרים שירות Kubernetes כדי לחשוף אותה:
apiVersion: v1
kind: Service
metadata:
name: NAME
spec:
selector:
LABEL
ports:
- protocol: TCP
port: 80
targetPort: PORT
מחליפים את:
- NAME: עם השם של השירות.
- LABEL: עם התווית שמוגדרת בפריסה. לדוגמה
app: NAME. - PORT: מחליפים ב
containerPortשל הקונטיינר שמקבל בקשות בשירות Cloud Run, שערך ברירת המחדל שלו הוא8080.
אחר כך אפשר ליצור Kubernetes Horizontal Pod Autoscaler כדי לשנות באופן אוטומטי את מספר הפודים.
פועלים לפי ההוראות בתיעוד של Kubernetes בנושא Horizontal Pod Autoscaling כדי ליצור HorizontalPodAutoscaler.
משתמשים בערכים של minimum instances (autoscaling.knative.dev/minScale) ושל maximum instances (autoscaling.knative.dev/maxScale) בשירות Cloud Run בתור ערכים למאפיינים minReplicas ו-maxReplicas HorizontalPodAutoscaler.
העברה של מאגרי עובדים ב-Cloud Run
אפשר להעביר מאגר עובדים של Cloud Run אל פריסת Kubernetes ב-GKE.
בדוגמאות הבאות מוצג ההבדל המבני בין מאגר עובדים של Cloud Run לבין פריסת Kubernetes.
| מאגרי עובדים ב-Cloud Run | פריסת Kubernetes |
|---|---|
apiVersion: run.googleapis.com/v1 kind: WorkerPool metadata: name: my-app annotations: run.googleapis.com/manualInstanceCount: '1' spec: template: metadata: labels: app: my-app spec: containers: - image: gcr.io/cloudrun/hello env: - name: HELLO value: world |
apiVersion: apps/v1 kind: Deployment metadata: name: my-app namespace: default labels: app: my-app spec: template: metadata: labels: app: my-app spec: containers: - image: gcr.io/cloudrun/hello env: - name: HELLO value: world replicas: 3 selector: matchLabels: app: my-app |
העברת משימות ב-Cloud Run
אפשר להעביר משימה ב-Cloud Run למשימה ב-Kubernetes ב-GKE.
בניגוד למשימות ב-Cloud Run, משימות ב-Kubernetes מבוצעות כשהן נוצרות. כדי להריץ את העבודה שוב, צריך ליצור עבודה חדשה.
בדוגמאות הבאות אפשר לראות את ההבדל המבני בין משימת Cloud Run לבין משימת Kubernetes:
| משימה ב-Cloud Run | משימת Kubernetes |
|---|---|
apiVersion: run.googleapis.com/v1
kind: Job
metadata:
name: my-job
spec:
template:
spec:
template:
spec:
containers:
- image: us-docker.pkg.dev/cloudrun/container/job
|
apiVersion: batch/v1
kind: Job
metadata:
name: my-job
spec:
template:
spec:
containers:
- image: us-docker.pkg.dev/cloudrun/container/job
|
העברת סודות
אתם יכולים לשמור את הסודות הקיימים ב-Secret Manager או להעביר אותם לסודות של Kubernetes.
אם תבחרו לשמור סודות ב-Secret Manager, תצטרכו לעדכן את אופן השימוש בהם ב-GKE.
אם בוחרים להעביר מ-Secret Manager לסודות של Kubernetes, כדאי לשים לב להבדלים הבאים בין סודות של Secret Manager לבין סודות של Kubernetes:
- תווים מותרים בשמות:
- סודות ב-Kubernetes:
[a-z0-9-.]{1,253} - סודות ב-Secret Manager:
[a-zA-Z0-9_-]{1,255}
- סודות ב-Kubernetes:
- ניהול גרסאות: הסודות מ-Secret Manager הם בעלי גרסאות, בעוד שהסודות של Kubernetes לא.
- המטען הייעודי (Payload): סודות מ-Secret Manager מכילים
[]byteאחד, בעוד שסודות Kubernetes מכיליםmap<string, string>.
אסטרטגיית העברה
אחרי יצירת המשאבים המקבילים, חשיפת נקודות קצה חיצוניות מאחורי מאזן עומסים של אפליקציות (ALB) חיצוני גלובלי מאפשרת להעביר תנועה בהדרגה בין Cloud Run לבין Google Kubernetes Engine (GKE).