רקע
באופן טבעי, תרמילי Pod הם זמניים. המשמעות היא ש-GKE משמיד את המצב והערך שמאוחסנים ב-Pod כשהוא נמחק, מפונה או מתוזמן מחדש.
מפעילים של אפליקציות יכולים לרצות לשמור על עומסי עבודה עם שמירת מצב. דוגמאות לעומסי עבודה כאלה כוללות אפליקציות שמעבדות מאמרים ב-WordPress, אפליקציות להעברת הודעות ואפליקציות שמעבדות פעולות של למידת מכונה.
באמצעות Filestore ב-GKE, אפשר לבצע את הפעולות הבאות:
- לפרוס עומסי עבודה עם שמירת מצב שניתנים להרחבה.
- להפעיל את האפשרות של כמה Pods להשתמש ב-
ReadWriteManyבתורaccessMode, כדי שכמה Pods יוכלו לקרוא ולכתוב בו-זמנית לאותו אחסון. - מגדירים את GKE כך שיצור נפחים (volumes) לכמה Pods בו-זמנית.
- שמירת נתונים באחסון כשמסירים Pods.
- הפעלת שיתוף נתונים בין Pods והרחבה קלה של הקיבולת.
מטרות
המדריך הזה מיועד למפעילים של אפליקציות ולמשתמשים אחרים שרוצים להגדיר עומס עבודה ניתן להרחבה עם שמירת מצב ב-GKE באמצעות PVC ו-NFS.
במדריך הזה מוסבר איך:
- יוצרים אשכול GKE.
- מגדירים את האחסון המנוהל של קבצים באמצעות Filestore באמצעות CSI.
- יוצרים Pod לקריאה ולכתיבה.
- חשיפה של ה-Pod של הקורא למאזן עומסים של שירות וגישה אליו.
- להגדיל את מספר הכותבים.
- גישה לנתונים מ-Pod הכתיבה.
עלויות
במדריך הזה השתמשנו ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:השתמשו במחשבון עלויות כדי ליצור הערכת עלות על סמך השימוש החזוי.
כדי להימנע מחיובים נוספים אחרי שסיימתם את המדריך, תוכלו למחוק את המשאבים שיצרתם. מידע נוסף זמין במאמר בנושא הסרת המשאבים.
לחצו על תראו לי איך כדי לקרוא הסבר מפורט על המשימה ישירות במסוף Google Cloud :
לפני שמתחילים
הגדרת הפרויקט
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
Roles required to 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.
Enable the Compute Engine, GKE, and Filestore APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
Roles required to 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.
Enable the Compute Engine, GKE, and Filestore APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
הגדרת ברירות מחדל ל-Google Cloud CLI
במסוף Google Cloud , מפעילים מכונת Cloud Shell:
פתיחת Cloud Shellמורידים את קוד המקור של האפליקציה לדוגמה:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/databases/stateful-workload-filestoreמגדירים את משתני הסביבה שמוגדרים כברירת מחדל:
gcloud config set project PROJECT_ID gcloud config set compute/region COMPUTE_REGION gcloud config set compute/zone COMPUTE_ZONE gcloud config set filestore/zone COMPUTE_ZONE gcloud config set filestore/region COMPUTE_REGIONמחליפים את הערכים הבאים:
- PROJECT_ID: מזהה הפרויקט ב-Google Cloud.
- COMPUTE_REGION: האזור של Compute Engine.
- COMPUTE_ZONE: אזור Compute Engine.
יצירת אשכול GKE
יוצרים אשכול GKE:
gcloud container clusters create-auto CLUSTER_NAME --location CONTROL_PLANE_LOCATIONמחליפים את הערך הבא:
- CLUSTER_NAME: שם האשכול.
- CONTROL_PLANE_LOCATION: המיקום של Compute Engine במישור הבקרה של האשכול. מציינים אזור לאשכולות אזוריים או אזור זמין לאשכולות אזוריים.
אחרי שיוצרים את האשכול, התוצאה אמורה להיראות כך:
gcloud container clusters describe CLUSTER_NAME NAME: CLUSTER_NAME LOCATION: northamerica-northeast2 MASTER_VERSION: 1.21.11-gke.1100 MASTER_IP: 34.130.255.70 MACHINE_TYPE: e2-medium NODE_VERSION: 1.21.11-gke.1100 NUM_NODES: 3 STATUS: RUNNINGכאשר הערך של
STATUSהואRUNNING.
הגדרת אחסון קבצים מנוהל באמצעות Filestore באמצעות CSI
GKE מספק דרך לפרוס ולנהל אוטומטית את מנהל ההתקן של ה-CSI של Kubernetes Filestore באשכולות.
שימוש ב-Filestore CSI מאפשר ליצור או למחוק באופן דינמי מופעים של Filestore ולהשתמש בהם בעומסי עבודה של Kubernetes עם StorageClass או Deployment.
אתם יכולים ליצור מופע חדש של Filestore על ידי יצירת PVC שמקצה באופן דינמי מופע של Filestore ואת ה-PV, או לגשת למופעים של Filestore שהוקצו מראש בעומסי עבודה של Kubernetes.
מופע חדש
יצירת מחלקת אחסון
- הערך של
volumeBindingModeמוגדר ל-WaitForFirstConsumer, מה שגורם לעיכוב בהקצאת נפח האחסון עד ש-Pod ישתמש בו. ההגדרה הזו מאפשרת למישור הבקרה לדעת את המיקום של עוצמת הקול (ב-Kubernetes זה נקרא טופולוגיה), ומאפשרת לדוגמה הזו לפעול באשכולות חדשים ללא צמתים, שבהם עדיין אין טופולוגיה. - הערך של
tierמוגדר ל-standardכדי לקצר את זמן היצירה של מופע Filestore. אם אתם צריכים אחסון NFS עם זמינות גבוהה יותר, תמונות מצב לגיבוי נתונים, שכפול נתונים בכמה אזורים ותכונות אחרות ברמת הארגון, כדאי להגדיר אתtierל-enterprise. הערה: מדיניות השחזור של PV שנוצר באופן דינמי היאDeleteכברירת מחדל, אם לא מוגדרreclaimPolicyב-StorageClass.
יוצרים את משאב
StorageClass:kubectl create -f filestore-storageclass.yamlמוודאים שנוצר Storage Class:
kubectl get scהפלט אמור להיראות כך:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE filestore-sc filestore.csi.storage.gke.io Delete Immediate true 94m
מופע שהוקצה מראש
יצירת מחלקת אחסון
כשהערך של volumeBindingMode מוגדר כ-Immediate, אפשר להתחיל מיד את הקצאת נפח האחסון.
יוצרים את משאב
StorageClass:kubectl create -f preprov-storageclass.yamlמוודאים שנוצר Storage Class:
kubectl get scהפלט אמור להיראות כך:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE filestore-sc filestore.csi.storage.gke.io Delete Immediate true 94m
יצירת נפח אחסון מתמיד (Persistent Volume) למופע Filestore
מוודאים שמופע Filestore הקיים מוכן:
gcloud filestore instances listהפלט אמור להיראות כך, כאשר הערך
STATEהואREADY:INSTANCE_NAME: stateful-filestore LOCATION: us-central1-a TIER: ENTERPRISE CAPACITY_GB: 1024 FILE_SHARE_NAME: statefulpath IP_ADDRESS: 10.109.38.98 STATE: READY CREATE_TIME: 2022-04-05T18:58:28שימו לב לערכים
INSTANCE_NAME,LOCATION,FILE_SHARE_NAMEו-IP_ADDRESSשל מופע Filestore.מאכלסים את משתני המסוף של מכונת Filestore:
INSTANCE_NAME=INSTANCE_NAME LOCATION=LOCATION FILE_SHARE_NAME=FILE_SHARE_NAME IP_ADDRESS=IP_ADDRESSמחליפים את משתני הפלייסהולדר במשתני המסוף שקיבלתם למעלה בקובץ
preprov-pv.yaml:sed "s/<INSTANCE_NAME>/$INSTANCE_NAME/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yaml sed "s/<LOCATION>/$LOCATION/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yaml sed "s/<FILE_SHARE_NAME>/$FILE_SHARE_NAME/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yaml sed "s/<IP_ADDRESS>/$IP_ADDRESS/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yamlיצירת PV
kubectl apply -f preprov-pv.yamlמוודאים ש-
STATUSשל ה-PV מוגדר ל-Bound:kubectl get pvהפלט אמור להיראות כך:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE fileserver 1Ti RWX Delete Bound default/fileserver filestore-sc 46m
שימוש ב-PersistentVolumeClaim כדי לגשת לנפח האחסון
במניפסט pvc.yaml הבא יש הפניה ל-CSI driver של Filestore StorageClass שנקרא filestore-sc.
כדי שכמה פודים יוכלו לקרוא ולכתוב את הווליום,
הערך של accessMode מוגדר ל-ReadWriteMany.
פורסים את ה-PVC:
kubectl create -f pvc.yamlמוודאים שה-PVC נוצר:
kubectl get pvcהפלט אמור להיראות כך:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE fileserver Bound pvc-aadc7546-78dd-4f12-a909-7f02aaedf0c3 1Ti RWX filestore-sc 92m
יצירת Pod עם הרשאות קריאה וכתיבה
בקטע הזה יוצרים Pod לקריאה ו-Pod לכתיבה. במדריך הזה משתמשים ב-Kubernetes Deployments כדי ליצור את ה-Pods. פריסה היא אובייקט Kubernetes API שמאפשר להפעיל כמה רפליקות של Pods שמפוזרות בין הצמתים באשכול.
יצירת פודקאסט הקריאה
ה-Pod של הקורא יקרא את הקובץ שנכתב על ידי ה-Pods של הכותבים. ה-Pods של הקוראים יראו באיזו שעה ובאיזה עותק משוכפל של ה-Pod של הכותב נכתב הקובץ.
ה-Pod של הקורא יקרא מהנתיב /usr/share/nginx/html שמשותף לכל ה-Pods.
פורסים את ה-Pod של הקורא:
kubectl apply -f reader-fs.yamlבודקים שהמופע החדש של Filestore מוכן:
gcloud filestore instances listהפלט אמור להיראות כך:
INSTANCE_NAME: pvc-5bc55493-9e58-4ca5-8cd2-0739e0a7b68c LOCATION: northamerica-northeast2-a TIER: STANDARD CAPACITY_GB: 1024 FILE_SHARE_NAME: vol1 IP_ADDRESS: 10.29.174.90 STATE: READY CREATE_TIME: 2022-06-24T18:29:19כדי לוודא שהרפליקות לקריאה פועלות, מריצים שאילתה על רשימת ה-Pods:
kubectl get podsהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 3m30s
יצירת תרמיל סופר
ה-Pod של הכותב יכתוב מעת לעת לקובץ משותף ש-Pods אחרים של כותבים וקוראים יכולים לגשת אליו. ה-Pod של הכותב מתעד את הנוכחות שלו על ידי כתיבת שם המארח שלו בקובץ המשותף.
התמונה שמשמשת ל-Pod של הכותב היא תמונה מותאמת אישית של Alpine Linux, שמשמשת לכלי עזר ולאפליקציות לייצור. הוא כולל סקריפט indexInfo.html שיקבל את המטא-נתונים של הכותב האחרון, ויספור את כל הכותבים הייחודיים ואת סך הכתיבות.
במדריך הזה, ה-Pod של הכותב כותב כל 30 שניות לנתיב /html/index.html. משנים את הערך של המספר sleep כדי להגדיר תדירות כתיבה שונה.
פורסים את ה-Pod של הכותב:
kubectl apply -f writer-fs.yamlכדי לוודא ש-Pods של כתיבה פועלים, שולחים שאילתה לרשימת ה-Pods:
kubectl get podsהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 3m30s writer-855565fbc6-8gh2k 1/1 Running 0 2m31s writer-855565fbc6-lls4r 1/1 Running 0 2m31s
חשיפה של עומס העבודה של הקורא למאזן עומסים של שירות וגישה אליו
כדי לחשוף עומס עבודה מחוץ לאשכול, יוצרים שירות מסוג LoadBalancer. סוג השירות הזה יוצר מאזן עומסים חיצוני עם כתובת IP שאפשר להגיע אליה דרך האינטרנט.
יוצרים שירות מסוג
LoadBalancerבשםreader-lb:kubectl create -f loadbalancer.yamlצופים בפריסה כדי לוודא ש-GKE מקצה
EXTERNAL-IPלשירותreader-lb:kubectl get svc --watchכשה-
Serviceמוכן, בעמודהEXTERNAL-IPמוצגת כתובת ה-IP הציבורית של מאזן העומסים:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.8.128.1 <none> 443/TCP 2d21h reader-lb LoadBalancer 10.8.131.79 34.71.232.122 80:32672/TCP 2d20hמקישים על Ctrl+C כדי להפסיק את תהליך הצפייה.
בדפדפן אינטרנט, עוברים אל
EXTERNAL-IPשהוקצה למאזן העומסים. הדף מתעדכן כל 30 שניות. ככל שהתדירות קצרה יותר והפודים של הכותבים רבים יותר, כך יוצגו יותר ערכים.
פרטים נוספים על שירות איזון העומסים זמינים במאמר loadbalancer.yaml.
הגדלת היקף הכתיבה
מכיוון שה-PV accessMode הוגדר ל-ReadWriteMany, GKE יכול להגדיל את מספר ה-Pods כדי שיותר Pods של כתיבה יוכלו לכתוב לנפח המשותף הזה (או שיותר קוראים יוכלו לקרוא אותם).
הגדלת מספר הרפליקות של
writerלחמש:kubectl scale deployment writer --replicas=5הפלט אמור להיראות כך:
deployment.extensions/writer scaledבודקים את מספר הרפליקות הפועלות:
kubectl get podsהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 11m writer-855565fbc6-8dfkj 1/1 Running 0 4m writer-855565fbc6-8gh2k 1/1 Running 0 10m writer-855565fbc6-gv5rs 1/1 Running 0 4m writer-855565fbc6-lls4r 1/1 Running 0 10m writer-855565fbc6-tqwxc 1/1 Running 0 4mמשתמשים בדפדפן אינטרנט כדי לנווט שוב אל
EXTERNAL-IPשהוקצה למאזן העומסים.
בשלב הזה הגדרתם את האשכול והרחבתם אותו כדי לתמוך בחמישה Pods של כתיבה עם שמירת מצב. כמה תרמילי כתיבה כותבים לאותו קובץ בו-זמנית. אפשר גם להגדיל בקלות את מספר קוראי ה-Pods.
אופציונלי: גישה לנתונים מ-Pod הכתיבה
בקטע הזה נדגים איך משתמשים בממשק שורת פקודה כדי לגשת ל-Pod של קורא או כותב. אתם יכולים לראות את הרכיב המשותף שהכותב כותב בו והקורא קורא ממנו.
משיגים את שם ה-Pod של הכותב:
kubectl get podsהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE writer-5465d65b46-7hxv4 1/1 Running 0 20dשימו לב לשם המארח של Pod של כותב (לדוגמה:
writer-5465d65b46-7hxv4).מריצים את הפקודה הבאה כדי לגשת ל-Pod של הכותב:
kubectl exec -it WRITER_HOSTNAME -- /bin/shהנה הרכיב המשותף בקובץ
indexData.html:cd /html cat indexData.htmlמנקים את הקובץ
indexData.html:echo '' > indexData.htmlכדי לראות את השינוי, צריך לרענן את דפדפן האינטרנט שבו מתארחת הכתובת
EXTERNAL-IP.כדי לצאת מהסביבה:
exit
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
מחיקת הפרויקט
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
מחיקת המשאבים הבודדים
מוחקים את שירות מאזן העומסים:
kubectl delete service reader-lbממתינים עד שמקצים את מאזן העומסים לשירות הקורא
מוודאים שהרשימה מחזירה
Listed 0 items:gcloud compute forwarding-rules listמחיקת הפריסות
kubectl delete deployment writer kubectl delete deployment readerמוודאים שה-Pods נמחקו ומוחזרת התוצאה
No resources found in default namespace.kubectl get podsמוחקים את ה-PVC. הפעולה הזו תמחק גם את ה-PV ואת מופע Filestore, כי מדיניות שמירת הנתונים מוגדרת ל-
deletekubectl delete pvc fileserverמחיקת אשכול GKE:
gcloud container clusters delete CLUSTER_NAME --location=CONTROL_PLANE_LOCATIONהפעולה הזו תמחק את המשאבים שמרכיבים את אשכול GKE, כולל ה-Pods של הקורא והכותב.
המאמרים הבאים
- איך פורסים את Cloud SQL עם GKE
- מצבי גישה ל-PV ול-PVC
- מידע נוסף על GKE ו-Filestore
- מידע נוסף על Filestore CSI Driver
- איך יוצרים מופע Filestore
- איך ניגשים למופעי Filestore מאשכולות GKE
- אפשר לעיין במדריכים נוספים בנושא Kubernetes Engine.
- מידע נוסף על חשיפת אפליקציות באמצעות שירותים ב-GKE חשיפת אפליקציות באמצעות שירותים