גם Cloud Run וגם Kubernetes משתמשים בקובצי אימג' סטנדרטיים של קונטיינרים כפריטי מידע שנוצרו בתהליך הפיתוח (artifacts) לפריסה, ושניהם משתמשים במודל API הצהרתי עם משאבים שאפשר לייצג בקובצי YAML עם אותו מבנה סטנדרטי.
מבוא
גרסה 1 של Cloud Run Admin API נועדה למקסם את הניידות עם Kubernetes. לדוגמה, המשאבים של Cloud Run Admin API חולקים את אותן מוסכמות מבנה ושמות מאפיינים כמו המשאבים של Kubernetes. הפניית YAML לשירות Cloud Run
גרסה 1 של Cloud Run Admin API מטמיעה את מפרט 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 אם אתם צריכים להריץ קוד לא ידוע או לא מהימן.
רשתות
כדי לגשת למשאבים אחרים ב-VPC, צריך להשתמש ב-Cloud Run עם חיבור לרשת VPC. עומסי העבודה של GKE נמצאים ישירות ב-VPC ולא נדרש מחבר.
תכונות שלא נתמכות ב-Google Kubernetes Engine
התכונות הבאות של Cloud Run לא זמינות ב-GKE:
- ניהול גרסאות של הגדרות אישיות באמצעות גרסאות
- חלוקת תנועה להשקות הדרגתיות והחזרות למצב קודם של גרסאות
- חיוב לפי בקשות
- שיפור ביצועי המעבד (CPU)
- זיקה לסשן (session affinity)
- תוויות בעומסי עבודה ב-GKE הן לא תוויות Google Cloud
- תגים בעומסי עבודה (workloads)
העברת משאבים של 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.
אחרי שיוצרים את פריסת 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.
אחר כך אפשר ליצור Horizontal Pod Autoscaler (HPA) ב-Kubernetes כדי לבצע התאמה אוטומטית לעומס של מספר ה-Pods.
כדי ליצור HorizontalPodAutoscaler, פועלים לפי ההוראות במאמר התאמה אופקית של קבוצות Pod לעומס של Kubernetes.
משתמשים בערכים של מינימום מכונות (autoscaling.knative.dev/minScale) ומקסימום מכונות (autoscaling.knative.dev/maxScale) של שירות Cloud Run כערכים של המאפיינים minReplicas ו-maxReplicas HorizontalPodAutoscaler.
העברת מאגרי Worker ב-Cloud Run
אתם יכולים להעביר מאגר וורקרים של Cloud Run לפריסת Kubernetes ב-GKE.
הדוגמאות הבאות מראות את ההבדל המבני בין מאגר Worker ב-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>.
אסטרטגיית העברה
אחרי שיוצרים את המשאבים המקבילים, חשיפת נקודות קצה (endpoint) חיצוניות מאחורי מאזן עומסים של אפליקציות (ALB) גלובלי חיצוני מאפשרת להעביר בהדרגה את התנועה בין Cloud Run לבין Google Kubernetes Engine (GKE).