בדף הזה מוסבר איך לפרוס אפליקציה עם שמירת מצב באמצעות Google Kubernetes Engine (GKE).
סקירה כללית
אפליקציות עם שמירת מצב שומרות נתונים בדיסק אחסון מתמיד (persistent disk) לשימוש השרת, הלקוחות ואפליקציות אחרות. דוגמה לאפליקציה עם מצב היא מסד נתונים או מאגר של זוגות מפתח/ערך שבהם אפליקציות אחרות שומרות נתונים ומאחזרות אותם.
אפשר להקצות באופן דינמי אחסון קבוע, כך שהנפחים הבסיסיים נוצרים לפי דרישה. ב-Kubernetes, מגדירים הקצאה דינמית על ידי יצירת StorageClass. ב-GKE, מחלקת אחסון (StorageClass) שמוגדרת כברירת מחדל מאפשרת הקצאה דינמית של אחסון מתמיד (persistent disk) ב-Compute Engine.
Kubernetes משתמש בבקר StatefulSet כדי לפרוס אפליקציות עם שמירת מצב כאובייקטים של StatefulSet. אי אפשר להחליף בין פודים ב-StatefulSets: לכל פוד יש מזהה ייחודי שנשמר לא משנה איפה הוא מתוזמן.
אפליקציות עם שמירת מצב שונות מאפליקציות ללא שמירת מצב, שבהן נתוני הלקוח לא נשמרים בשרת בין הפעלות.
מידע נוסף על אחסון מתמיד באשכולות אזוריים ורב-אזוריים
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק Google Kubernetes Engine API. הפעלת Google Kubernetes Engine API
- אם רוצים להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
- מוודאים שהאפליקציה שמופעלת בקונטיינר מאוחסנת במאגר תמונות, כמו Artifact Registry.
אתם יכולים לעקוב אחרי המדריך לתחילת העבודה כדי להפעיל את GKE API, ליצור אשכול ולקבל מידע נוסף על GKE.
בקשה לאחסון מתמיד ב-StatefulSet
אפליקציות יכולות לבקש אחסון מתמיד באמצעות PersistentVolumeClaim.
בדרך כלל, צריך ליצור אובייקטים של PersistentVolumeClaim בנוסף ליצירת ה-Pod. עם זאת, אובייקטים מסוג StatefulSet כוללים מערך volumeClaimTemplates, שיוצר באופן אוטומטי את האובייקטים PersistentVolumeClaim. כל רפליקה של StatefulSet מקבלת אובייקט PersistentVolumeClaim משלה.
אפשר גם להשתמש בדיסק קיים ב-StatefulSet.
יצירת StatefulSet
כדי ליצור משאב StatefulSet, משתמשים בפקודה kubectl apply.
הפקודה kubectl apply משתמשת בקובצי מניפסט כדי ליצור, לעדכן ולמחוק משאבים באשכול. זוהי שיטה הצהרתית להגדרת אובייקטים. בשיטה הזו, הכתיבה לאובייקטים פעילים נשמרת בלי למזג את השינויים בחזרה לקובצי ההגדרות של האובייקט.
Linux
קובץ המניפסט הבא הוא דוגמה פשוטה ל-StatefulSet שמנוהל על ידי Service שנוצר בנפרד:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: STATEFULSET_NAME
spec:
selector:
matchLabels:
# Selects Pods with this label.
app: APP_NAME
# Headless Service for network identity.
serviceName: "SERVICE_NAME"
replicas: 3
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: APP_NAME
spec:
containers:
- name: CONTAINER_NAME
image: IMAGE
ports:
- containerPort: 80
name: PORT_NAME
volumeMounts:
- name: PVC_NAME
mountPath: MOUNT_PATH
volumeClaimTemplates:
- metadata:
name: PVC_NAME
annotations:
KEY: VALUE
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
מחליפים את מה שכתוב בשדות הבאים:
-
STATEFULSET_NAME: השם של StatefulSet, לדוגמה,web. -
SERVICE_NAME: השם של השירות, למשלnginx. -
APP_NAME: השם של האפליקציה שפועלת ב-Pods, למשלnginx. -
CONTAINER_NAME: השם של הקונטיינרים ב-Pods, לדוגמה,nginx. -
IMAGE: קובץ האימג' של הקונטיינר, לדוגמה,registry.k8s.io/nginx-slim:0.8. -
PORT_NAME: השם של היציאה שנפתחה על ידי StatefulSet, לדוגמה,web. -
PVC_NAME: השם של PersistentVolumeClaim, לדוגמה,www. -
MOUNT_PATH: הנתיב בקונטיינר שבו האחסון מותקן, לדוגמה,/usr/share/nginx/html. -
KEYו-VALUE: צמד מפתח/ערך של הערה להחלה על המטא-נתונים של PersistentVolumeClaim. אתם יכולים להשתמש בהערות כדי לצרף מטא-נתונים שרירותיים שלא מזהים אובייקטים, שאפשר לאחזר על ידי לקוחות כמו כלים וספריות. מידע נוסף זמין במאמר בנושא הערות.
בשדה kind בקובץ הזה מצוין שאובייקט StatefulSet צריך להיווצר עם המפרטים שמוגדרים בקובץ. בדוגמה הזו של StatefulSet נוצרים שלושה עותקים של Pod, ונפתח פורט 80 כדי לחשוף את ה-StatefulSet לאינטרנט.
Windows
כשמשתמשים באשכולות עם מאגרי צמתים של Windows Server, צריך ליצור StorageClass כי ה-StorageClass שמוגדר כברירת מחדל משתמש ב-ext4 כסוג מערכת הקבצים, וזה עובד רק עם קונטיינרים של Linux. אם אתם משתמשים בדיסק אחסון מתמיד (persistent disk) של Compute Engine, אתם צריכים להשתמש ב-NTFS כסוג אחסון הקבצים, כמו בדוגמה הבאה:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
# Defines a name for this StorageClass.
name: STORAGECLASS_NAME
parameters:
# Specifies the type of Google Compute Engine persistent disk.
type: pd-standard
# Uses NTFS file system, which is crucial for Windows nodes
fstype: NTFS
# The provisioner for Google Compute Engine persistent disks.
provisioner: kubernetes.io/gce-pd
# Specifies that the PersistentVolume will be deleted if the PersistentVolumeClaim is deleted.
reclaimPolicy: Delete
# Delays volume binding until a Pod using the PVC is scheduled.
volumeBindingMode: WaitForFirstConsumer
מניפסט ה-StatefulSet הבא משתמש ב-StorageClass שהוגדר למעלה. הוא יוצר ארבעה זוגות של PersistentVolume ו-PersistentVolumeClaim כדי לייצג ארבעה דיסקים של אחסון מתמיד (persistent disks) ב-Compute Engine. כל Pod ב-StatefulSet צורך דיסק אחסון מתמיד אחד.
כדי לוודא שה-Pods מתוזמנים בצורה נכונה לצמתים של Windows Server, צריך להוסיף בורר צמתים למפרט ה-Pod.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: STATEFULSET_NAME
spec:
replicas: 4
selector:
matchLabels:
# Selects Pods with this label.
app: APP_NAME
template:
metadata:
labels:
# Labels applied to the Pods created by the StatefulSet.
app: APP_NAME
name: CONTAINER_NAME
spec:
nodeSelector:
# Ensures Pods are scheduled on Windows nodes.
kubernetes.io/os: windows
containers:
- name: CONTAINER_NAME
image: IMAGE
ports:
- containerPort: 80
name: PORT_NAME
volumeMounts:
- name: PVC_NAME
mountPath: MOUNT_PATH
volumeClaimTemplates:
- metadata:
name: PVC_NAME
spec:
# Specifies the StorageClass to use, which is crucial for Windows nodes.
storageClassName: STORAGECLASS_NAME
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
מחליפים את מה שכתוב בשדות הבאים:
-
STATEFULSET_NAME: השם של StatefulSet, לדוגמה,web-windows. -
APP_NAME: השם של האפליקציה שפועלת ב-Pods, למשלiis. -
CONTAINER_NAME: השם של הקונטיינרים ב-Pods, לדוגמה,iis. -
IMAGE: קובץ האימג' של הקונטיינר, לדוגמה,mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019. -
PORT_NAME: השם של היציאה שנפתחה על ידי StatefulSet, לדוגמה,http. -
PVC_NAME: השם של PersistentVolumeClaim, לדוגמה,iis-state. -
MOUNT_PATH: הנתיב בקונטיינר שבו האחסון מותקן, לדוגמה,C:\mnt\state. -
STORAGECLASS_NAME: השם של StorageClass, למשלmy-storage-class.
כדי ליצור משאב StatefulSet, מריצים את הפקודה הבאה ומחליפים את STATEFULSET_FILE בשם קובץ המניפסט:
kubectl apply -f STATEFULSET_FILE
אפשר גם להשתמש ב-kubectl apply -f DIRECTORY/ כדי ליצור את כל האובייקטים (חוץ מאובייקטים קיימים) שמוגדרים בקובצי תצורה שמאוחסנים בספרייה.
בדיקת StatefulSet
kubectl
כדי לבדוק את ה-StatefulSet, מריצים את הפקודה הבאה:
kubectl get statefulset STATEFULSET_NAME -o yaml
הפקודה הזו מציגה את ההגדרה הפעילה של משאב StatefulSet בפורמט YAML.
כדי להציג את רשימת ה-Pods שנוצרו על ידי StatefulSet, מריצים את הפקודה הבאה:
kubectl get pods -l app=APP_NAME
בפקודה הזו, הדגל -l מורה ל-kubectl לקבל את כל ה-Pods שמסומנים בתווית עבור APP_NAME.
הפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE
pod-name 1/1 Running 0 1m
pod-name 1/1 Running 0 1m
כדי לקבל מידע מפורט על StatefulSet, מריצים את הפקודה הבאה:
kubectl describe statefulset STATEFULSET_NAME
כדי לקבל מידע על Pod ספציפי, מריצים את הפקודה הבאה:
kubectl describe pod POD_NAME
כדי לראות את האובייקטים של PersistentVolumeClaim שנוצרו, מריצים את הפקודה הבאה:
kubectl get pvc
הפלט אמור להיראות כך:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
STATEFULSET_NAME-PVC_NAME-0 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800002 1G RWO standard 9s
STATEFULSET_NAME-PVC_NAME-1 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800003 1G RWO standard 9s
STATEFULSET_NAME-PVC_NAME-2 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800004 1G RWO standard 9s
כדי לקבל מידע על PersistentVolumeClaim ספציפי, מריצים את הפקודה הבאה:
kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0
כדי לקבל מידע על PersistentVolume ספציפי, מריצים את הפקודה הבאה:
kubectl describe pv PV_NAME
המסוף
כדי לבדוק StatefulSet, מבצעים את השלבים הבאים:
נכנסים לדף Workloads במסוף Google Cloud .
ברשימת עומסי העבודה, לוחצים על השם של StatefulSet שרוצים לבדוק.
בדף Stateful Set details, מבצעים אחת מהפעולות הבאות:
- לוחצים על הכרטיסייה היסטוריית גרסאות כדי לראות את היסטוריית הגרסאות של StatefulSet.
- לוחצים על הכרטיסייה אירועים כדי לראות את כל האירועים שקשורים ל-StatefulSet.
- לוחצים על הכרטיסייה Logs (יומנים) כדי לראות את יומני המכולות של StatefulSet.
- לוחצים על הכרטיסייה YAML כדי לראות, להעתיק או להוריד את ה-YAML של ההגדרה של StatefulSet.
עדכון של StatefulSet
יש כמה דרכים לעדכן StatefulSets. השיטה הנפוצה וההצהרתית היא kubectl apply. כדי לעדכן את StatefulSet ישירות מהמעטפת או בעורך המועדף, אפשר להשתמש ב-kubectl edit. אפשר גם להשתמש בכלי לעריכת YAML בתפריט GKE Workloads במסוף Google Cloud .
אפשר להפיץ עדכונים למפרט של Pods עבור משאב StatefulSet, כמו התמונה, השימוש במשאבים, הבקשות או ההגדרה.
kubectl apply
אפשר לעדכן את ה-StatefulSet על ידי החלה של קובץ מניפסט חדש או מעודכן. האפשרות הזו שימושית לביצוע שינויים שונים ב-StatefulSet, למשל כשמבצעים שינוי גודל או כשמציינים גרסה חדשה של האפליקציה.
כדי לעדכן StatefulSet, מריצים את הפקודה הבאה:
kubectl apply -f STATEFULSET_FILE
מחליפים את STATEFULSET_FILE בקובץ המניפסט המעודכן.
הפקודה kubectl apply מחילה קובץ מניפסט על משאב. אם המשאב שצוין לא קיים, הפקודה יוצרת אותו.
מידע נוסף על kubectl apply זמין במסמכי העזרה של kubectl.
המסוף
כדי לערוך את התצורה הפעילה של StatefulSet, מבצעים את השלבים הבאים:
נכנסים לדף Workloads במסוף Google Cloud .
ברשימת עומסי העבודה, לוחצים על השם של StatefulSet שרוצים לשנות.
לוחצים על edit עריכה.
משנים את קובץ ה-YAML של ההגדרות לפי הצורך.
לוחצים על Save.
בדיקת השקת העדכון
כדי לבדוק את הפריסה של StatefulSet, מריצים את הפקודה הבאה:
kubectl rollout status statefulset STATEFULSET_NAME
כדי לראות את היסטור הפריסה של StatefulSet, מריצים את הפקודה הבאה:
kubectl rollout history statefulset STATEFULSET_NAME
כדי לבטל את ההשקה, מריצים את הפקודה הבאה:
kubectl rollout undo statefulset STATEFULSET_NAME
עדכון של שיטות הבידינג
השדה updateStrategy של StatefulSet מאפשר לכם להגדיר ולהשבית עדכונים אוטומטיים של קונטיינרים, תוויות, בקשות למשאבים, מגבלות והערות עבור ה-Pods ב-StatefulSet.
במסמכי התיעוד של Kubernetes אפשר לקרוא מידע נוסף על שיטות עדכון ל-StatefulSets.
שינוי קנה מידה של StatefulSet
kubectl
אפשר להשתמש בפקודה kubectl scale בכל שלב כדי לשנות את גודל ה-StatefulSet.
כדי לשנות את קנה המידה של StatefulSet באופן ידני, מריצים את הפקודה הבאה:
kubectl scale statefulset STATEFULSET_NAME --replicas NUMBER_OF_REPLICAS
מחליפים את NUMBER_OF_REPLICAS במספר הרצוי של רכיבי Pod משוכפלים.
המסוף
כדי לשנות את גודל ה-StatefulSet, מבצעים את השלבים הבאים:
נכנסים לדף Workloads במסוף Google Cloud .
ברשימת עומסי העבודה, לוחצים על השם של StatefulSet שרוצים לשנות.
לוחצים על list פעולות > שינוי גודל > עריכת העותקים.
מזינים את המספר החדש של עותקים עבור StatefulSet.
לוחצים על קנה מידה.
מחיקת StatefulSet
kubectl
כדי למחוק StatefulSet, מריצים את הפקודה הבאה:
kubectl delete statefulset STATEFULSET_NAME
המסוף
כדי למחוק StatefulSet, מבצעים את השלבים הבאים:
נכנסים לדף Workloads במסוף Google Cloud .
ברשימת עומסי העבודה, בוחרים StatefulSet אחד או יותר שרוצים למחוק.
לוחצים על delete מחיקה.
כשמופיעה בקשה לאישור, לוחצים על מחיקה.
המאמרים הבאים
- איך פורסים אשכול MySQL ב-GKE לזמינות גבוהה
- מידע נוסף על פריסת אפליקציות ללא שמירת מצב
- הדרכה בנושא שדרוג אשכול שמריץ עומס עבודה עם שמירת מצב