פריסה של אפליקציה עם שמירת מצב

בדף הזה מוסבר איך לפרוס אפליקציה עם שמירת מצב באמצעות 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, מבצעים את השלבים הבאים:

  1. נכנסים לדף Workloads במסוף Google Cloud .

    כניסה לדף Workloads

  2. ברשימת עומסי העבודה, לוחצים על השם של StatefulSet שרוצים לבדוק.

  3. בדף 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, מבצעים את השלבים הבאים:

  1. נכנסים לדף Workloads במסוף Google Cloud .

    כניסה לדף Workloads

  2. ברשימת עומסי העבודה, לוחצים על השם של StatefulSet שרוצים לשנות.

  3. לוחצים על עריכה.

  4. משנים את קובץ ה-YAML של ההגדרות לפי הצורך.

  5. לוחצים על 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, מבצעים את השלבים הבאים:

  1. נכנסים לדף Workloads במסוף Google Cloud .

    כניסה לדף Workloads

  2. ברשימת עומסי העבודה, לוחצים על השם של StatefulSet שרוצים לשנות.

  3. לוחצים על פעולות > שינוי גודל > עריכת העותקים.

  4. מזינים את המספר החדש של עותקים עבור StatefulSet.

  5. לוחצים על קנה מידה.

מחיקת StatefulSet

kubectl

כדי למחוק StatefulSet, מריצים את הפקודה הבאה:

kubectl delete statefulset STATEFULSET_NAME

המסוף

כדי למחוק StatefulSet, מבצעים את השלבים הבאים:

  1. נכנסים לדף Workloads במסוף Google Cloud .

    כניסה לדף Workloads

  2. ברשימת עומסי העבודה, בוחרים StatefulSet אחד או יותר שרוצים למחוק.

  3. לוחצים על מחיקה.

  4. כשמופיעה בקשה לאישור, לוחצים על מחיקה.

המאמרים הבאים