הגדלת הזמינות של אפליקציה עם שמירת מצב באמצעות Stateful HA Operator

אופרטור Stateful High Availability (זמינות גבוהה עם שמירת מצב) מאפשר לכם להשתמש באינטגרציה המובנית של GKE עם Persistent Disk אזורי כדי לבצע אוטומציה של יתירות כשל של פודים מסוג StatefulSet ולשלוט במהירות שלו. במהלך יתירות כשל, האופרטור מטפל אוטומטית בזיהוי כשל בצומת, ניתוק אמצעי אחסון מצומת שנכשל ובחיבור בטוח של אמצעי האחסון לצומת הגיבוי.

למה כדאי להשתמש ב-Stateful HA Operator

ארכיטקטורה נפוצה עם שמירת מצב להשגת זמינות גבוהה משתמשת בדיסקים קשיחים אזוריים כשכבת האחסון. הדיסקים האלה מספקים שכפול סינכרוני של נתונים בין שני אזורים באזור. במהלך כשלים ברשת של צומת או של אזור, הארכיטקטורה הזו מאפשרת לעומסי העבודה שלכם לבצע יתירות כשל (על ידי צירוף בכפייה) של רפליקות לאחסון בצומת אחר באזור אחר.

ה-Operator של HA עם שמירת מצב מאפשר לכם לבצע את האופטימיזציות הבאות:

  • שיפור זמן השחזור של אפליקציות עם רפליקה יחידה: אם משתמשים רק ברפליקה אחת, אפשר להשתמש ב-Stateful HA Operator ולהחליף את האחסון האזורי באחסון אזורי, כשמקצים את האפליקציה, כדי להגדיל את עמידות הנתונים והזמינות שלהם במקרה של כשל בצומת.
  • צמצום עלויות של רשתות בין אזורים: שכפול נתונים בכמה אזורים יכול להיות יקר עבור אפליקציות עם תפוקה גבוהה. אתם יכולים להשתמש ב-Stateful HA Operator כדי להפעיל את האפליקציה באזור יחיד, תוך שמירה על נתיב יתירות כשל לאזור חלופי שמתאים ל-SLA של האפליקציה.

מגבלות

  • אין תמיכה בסוג הנפח gcePersistentDisk. להשתמש ב-PersistentVolume שמשתמש במנהל התקן CSI של דיסק אחסון מתמיד.
  • בארכיטקטורה של Stateful HA Operator עם עותק יחיד, GKE שומר את הנתונים שלכם בשני אזורים באמצעות Persistent Disk אזורי, אבל הגישה לנתונים אפשרית רק בזמן שהעותק של האפליקציה תקין. במהלך מעבר לגיבוי, האפליקציה לא תהיה זמינה באופן זמני בזמן שהרפליקה מתוזמנת מחדש לצומת חדש תקין. אם לאפליקציה שלכם יש יעד זמן שחזור (RTO) נמוך מאוד, מומלץ להשתמש בגישה של כמה רפליקות.

לפני שמתחילים

לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:

  • מפעילים את ממשק ה-API של Google Kubernetes Engine.
  • הפעלת Google Kubernetes Engine API
  • אם רוצים להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.

דרישות

  • כשמשתמשים ב-Stateful HA Operator, הוא מגדיר באופן אוטומטי את ה-StatefulSet המקושר לשימוש בדיסקים קשיחים אזוריים. עם זאת, אתם אחראים לוודא שרכיבי ה-Pods מוגדרים לשימוש בדיסקים האלה, ושיש להם יכולת לפעול בכל האזורים שמשויכים לאחסון הבסיסי.
  • מוודאים שהאפליקציה פועלת בצורות מכונה שנתמכות על ידי Persistent Disk אזורי: E2, ‏ N1, ‏ N2, ‏ N2D.
  • מוודאים שהדרייבר של Compute Engine Persistent Disk CSI מופעל. הדרייבר של CSI ל-Persistent Disk מופעל כברירת מחדל באשכולות חדשים של Autopilot ו-Standard, ואי אפשר להשבית או לערוך אותו כשמשתמשים ב-Autopilot. אם אתם צריכים להוסיף ידנית את מנהל ההתקן של Persistent Disk CSI מהאשכול, תוכלו לעיין במאמר בנושא הפעלת מנהל ההתקן של Persistent Disk CSI באשכול קיים.
  • אם אתם משתמשים ב-StorageClass מותאם אישית, צריך להגדיר את מנהל ה-CSI של Persistent Disk באמצעות pd.csi.storage.gke.io provisioner והפרמטרים הבאים:
    • availability-class: regional-hard-failover
    • replication-type: regional-pd

הגדרה ושימוש ב-Stateful HA Operator

כדי להגדיר את Stateful HA Operator לעומסי העבודה עם שמירת מצב, פועלים לפי השלבים הבאים:

  1. מפעילים את התוסף StatefulHA.
  2. מתקינים משאב HighAvailabilityApplication.
  3. מתקינים StatefulSet.
  4. בודקים את המשאב HighAvailabilityApplication.

הפעלת התוסף StatefulHA

כדי להשתמש ב-Stateful HA Operator, צריך להפעיל את התוסף StatefulHA באשכול.

  • אשכולות Autopilot: GKE מפעיל אוטומטית את התוסף StatefulHA כשיוצרים אשכול. אם רוצים להשתמש ב-Stateful HA Operator בעומס עבודה קיים, צריך להפעיל באופן ידני את Compute Engine Persistent Disk CSI Driver. מידע נוסף זמין במאמר בנושא הפעלת מנהל התקן של Persistent Disk CSI באשכול קיים.

  • אשכולות רגילים:

    • יצירת אשכול חדש: פועלים לפי ההוראות של ה-CLI של gcloud ליצירת אשכול רגיל ומוסיפים את הדגל הבא: --add-on=StatefulHA.
    • באשכול קיים מסוג Standard: פועלים לפי ההוראות לשימוש ב-CLI של gcloud כדי לעדכן את ההגדרות של אשכול מסוג Standard, ומשתמשים בדגל הבא כדי להפעיל את התוסף: --update-addons=StatefulHA=ENABLED.

כשמפעילים את התוסף, GKE מתקין באופן אוטומטי StorageClass בשם standard-rwo-regional.

התקנה של משאב HighAvailabilityApplication

HighAvailabilityApplication הוא משאב Kubernetes שמפשט את ההגדרות של StatefulSet ומגדיל את הזמינות של Pod ב-GKE. אופרטור Stateful HA מבצע התאמה של משאבי HighAvailabilityApplication ב-GKE.

במפרט HighAvailabilityApplication, צריך להגדיר את HighAvailabilityApplication.spec.resourceSelection.resourceKind לערך StatefulSet.

כדי ללמוד איך להגדיר את משאב הזמינות הגבוהה, אפשר לעיין בHighAvailabilityApplication מסמכי העזר.

דוגמה ל-PostgreSQL:

  1. שומרים את המניפסט הבא בקובץ בשם stateful-ha-example-resource.yaml:

    kind: HighAvailabilityApplication
    apiVersion: ha.gke.io/v1
    metadata:
      name: APP_NAME
      namespace: APP_NAMESPACE
    spec:
      resourceSelection:
        resourceKind: StatefulSet
      policy:
        storageSettings:
          requireRegionalStorage: true
        failoverSettings:
          forceDeleteStrategy: AfterNodeUnreachable
          afterNodeUnreachable:
            afterNodeUnreachableSeconds: 20
    

    מחליפים את מה שכתוב בשדות הבאים:

    • APP_NAME: השם של אפליקציה באשכול שרוצים להגן עליה. השם הזה חייב להיות משותף ל-HighAvailabilityApplication ול-StatefulSet.
    • APP_NAMESPACE: מרחב השמות של האפליקציה. מרחב השמות הזה צריך להיות משותף ל-HighAvailabilityApplication ול-StatefulSet שמוגנים.

    בדוגמה הזו:

    • הערך של HighAvailabilityApplication.spec.policy.storageSettings.requireRegionalSettings הוא true. כך אוכפים אחסון אזורי.
    • הערך של HighAvailabilityApplication.spec.policy.failoverSettings הוא AfterNodeUnreachable. ההגדרה הזו קובעת איך מופעלת מחיקה בכפייה במקרה של כשל בצומת.
    • הערך של HighAvailabilityApplication.spec.policy.failoverSettings.afterNodeUnreachable הוא 20. זהו הזמן הקצוב לתפוגה למחיקה מאולצת של Pod אחרי שהצומת שבו הוא פועל מסומן כבלתי ניתן להשגה.
  2. יוצרים את המשאב. המשאב HighAvailabilityApplication מזהה StatefulSet עם מרחב שמות ושם תואמים.

    kubectl apply -f stateful-ha-example-resource.yaml
    

התקנה של StatefulSet

מתקינים StatefulSet. לדוגמה, אפשר להתקין PostgreSQL StatefulSet באמצעות Helm (Helm מותקן מראש ב-Cloud Shell):

helm install postgresql oci://registry-1.docker.io/bitnamicharts/postgresql \
  --namespace=APP_NAMESPACE \
  --set fullnameOverride=APP_NAME

המשאב HighAvailabilityApplication משנה אוטומטית את StorageClass של StatefulSet ל-standard-rwo-regional, שמשתמש ב-Persistent Disk אזורי.

בדיקת המשאב HighAvailabilityApplication

מריצים את הפקודה הבאה כדי לוודא שההעברה האוטומטית לגיבוי (failover) מופעלת באפליקציה לדוגמה:

kubectl describe highavailabilityapplication APP_NAME

הפלט אמור להיראות כך:

Status:
Conditions:
  Last Transition Time:  2023-08-09T23:59:52Z
  Message:               Application is protected
  Observed Generation:   1
  Reason:                ApplicationProtected
  Status:                True
  Type:                  Protected

שימוש בדיסקים קיימים של אחסון מתמיד

אם אתם משתמשים בדיסק אחסון מתמיד קיים וב-PersistentVolume שמוגדר באופן סטטי, צריך להגדיר את ה-PersistentVolume עם force-attach: true ב-.spec.csi.volumeAttributes. לדוגמה:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: PV_NAME
spec:
  storageClassName: "STORAGE_CLASS_NAME"
  capacity:
    storage: DISK_SIZE
  accessModes:
    - ReadWriteOnce
  claimRef:
    name: PV_CLAIM_NAME
    namespace: default
  csi:
    driver: pd.csi.storage.gke.io
    volumeHandle: DISK_ID
    fsType: FS_TYPE
    volumeAttributes:
      force-attach: true