יצירת מאגר גיבוי לשירות מסד הנתונים

במסמך הזה מוסבר איך להגדיר את BackupRepository הנדרש לשירות מסד הנתונים (DBS) של Google Distributed Cloud (GDC) עם air gap. המאגר הזה, שחובה לקרוא לו dbs-backup-repository, הוא משאב בהתאמה אישית ב-Kubernetes שמפנה את שירות הגיבוי של GDC לקטגוריית אחסון אובייקטים שתואמת ל-S3, כדי לאחסן גיבויים של מסדי נתונים.

הגדרה נכונה היא חיונית כדי להפעיל פונקציות של גיבוי ושחזור למכונות DBS כמו PostgreSQL,‏ Oracle ו-AlloyDB Omni.

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

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

  • פרויקט: פרויקט לאירוח הקטגוריה, בדרך כלל בשם backups, עם גישה לחשבון השירות בלבד.
  • גישה: הרשאות מספיקות כדי לקיים אינטראקציה עם שרת ה-API לניהול.
    • כדי ליצור את מאגר הגיבויים, למשתמש צריכים להיות התפקידים הבאים ברמת הארגון:
      • אדמין של קטגוריות (bucket-admin)
      • יצירת פרויקטים (project-creator)
      • אדמין של גיבויים בארגון (organization-backup-admin)
    • בפרויקט היעד:
      • אדמין של פרויקט ב-IAM‏ (project-iam-admin)
      • צפייה בפרויקט של אובייקט בקט (project-bucket-object-viewer)
      • אדמין של פרויקט אובייקטים בקטגוריה (project-bucket-object-admin)
      • אדמין של פרויקט קטגוריות (project-bucket-admin)
      • צפייה בסודות (secret-viewer)
      • אדמין של מרחב שמות (namespace-admin)
      • יצירת גיבויים (backup-creator)
  • כלים:

יצירת קטגוריה של מאגר אובייקטים

כל השלבים הבאים מתבצעים בשרת ה-API לניהול. הגדרה ויצירה של משאב Bucket. השם המומלץ dbs-backups לקטגוריית האחסון הזו מופיע בהמשך המסמך, בתוך מרחב השמות של הפרויקט backups. מוודאים שאין בקטגוריה מדיניות שמירת נתונים.

המסוף

  1. נכנסים למסוף GDC של הארגון.
  2. מוודאים שאתם נמצאים בפרויקט backups.
  3. עוברים אל מאגר אובייקטים > קטגוריות.
  4. לוחצים על Create Bucket.
  5. מגדירים את שם הקטגוריה בתור dbs-backups.
  6. מגדירים את התיאור בתור Bucket for DBS backups.
  7. מגדירים את סוג האחסון (storage class) לפי הצורך. לדוגמה, Standard.
  8. בקטע Security, חשוב לוודא שלא מגדירים מדיניות שמירה, כי זה יגרום לשמירה שגויה של מסדי נתונים והגיבויים שלהם.
  9. לוחצים על יצירה.

API

  • מחילים את המניפסט הבא על שרת ה-API לניהול:
kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f -
<<EOF
apiVersion: object.gdc.goog/v1
kind: Bucket
metadata:
  name: dbs-backups
  namespace: backups
spec:
  description: "Bucket for DBS backups"
  storageClass: "Standard"
EOF

יצירת חשבון שירות והגדרת הרשאות

יוצרים ProjectServiceAccount ונותנים לו הרשאות גישה לקטגוריה.

המסוף

  1. בפרויקט backups, עוברים אל זהות וגישה > זהויות שירות.
  2. לוחצים על Create Service Identity. נפתח הדף Service Identity details.
  3. בשדה Service identity name, מזינים את הערך dbs-backup-sa.
  4. לוחצים על יצירה.
  5. עוברים אל Identity & Access > Access.
  6. ברשימה חברים, לוחצים על הוספת חבר. מוצג הדף משתמשים ותפקידים.
  7. ברשימה Member type, בוחרים באפשרות Service identity.
  8. ברשימה Service identity, בוחרים את dbs-backup-sa כדי להקצות קישור לתפקיד.
  9. ברשימה Role, בוחרים את התפקיד Bucket Object Project Admin כדי להקצות אותו לזהות השירות.
  10. לוחצים על הוספה.

API

  • מחילים את המניפסטים האלה על שרת ה-API לניהול:
kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f -
<<EOF
apiVersion: resourcemanager.gdc.goog/v1
kind: ProjectServiceAccount
metadata:
  name: dbs-backup-sa
  namespace: backups
spec: {}
EOF
kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f -
<<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dbs-backups-readwrite-rolebinding
  namespace: backups
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: project-bucket-object-admin
subjects:
- kind: ServiceAccount
  name: dbs-backup-sa
  namespace: backups
EOF

זיהוי הסוד של פרטי הכניסה של חשבון השירות ופרטי הקטגוריה

אחרי שמעניקים ל-dbs-backup-sa גישה לקטגוריה, GDC יוצר באופן אוטומטי סוד באותו מרחב שמות, backups, שמכיל את פרטי הכניסה ל-S3. אתם צריכים למצוא את שם הסוד ואת פרטי הקטגוריה באמצעות kubectl CLI (API).

  1. מגדירים את משתני הסביבה:

    export SA_NAMESPACE="backups"
    export SA_NAME="dbs-backup-sa"
    export KUBECONFIG=MANAGEMENT_API_SERVER
    
  2. מוצאים את השם הסודי:

    export BUCKET_CRED_SECRET_NAME=$(kubectl --kubeconfig=${KUBECONFIG} get secret \
        -n "${SA_NAMESPACE}" -l object.gdc.goog/subject-type=ServiceAccount -o json | \
        jq -r --arg SA_NAME "${SA_NAME}" \
        '.items[] | select(.metadata.annotations["object.gdc.goog/subject"] == $SA_NAME and (.metadata.name |startswith("object-storage-key-std-sa-"))) | .metadata.name')
    echo "Bucket Credential Secret Name: ${BUCKET_CRED_SECRET_NAME}"
    

    הפקודה הזו מסננת את הסודות במרחב השמות backups כדי למצוא את הסוד שנוסף לו הערה לחשבון השירות dbs-backup-sa, ושתואם למוסכמות מתן השמות הרגילות. כדי להריץ את הפקודה הזו, צריך להיות לכם תפקיד "צפייה בסודות" (secret-viewer) בפרויקט backups, או לבקש מהאדמין של הפלטפורמה שיצר את חשבון השירות לספק את שם הסוד.

  3. מקבלים את פרטי נקודת הקצה והאזור של הקטגוריה:

    export BUCKET_NAME=dbs-backups
    export FULL_BUCKET_NAME=$(kubectl --kubeconfig=${KUBECONFIG} get bucket -n ${SA_NAMESPACE} ${BUCKET_NAME} -o jsonpath='{.status.fullyQualifiedName}')
    export ENDPOINT=$(kubectl --kubeconfig=${KUBECONFIG} get bucket -n ${SA_NAMESPACE} ${BUCKET_NAME} -o jsonpath='{.status.endpoint}')
    export REGION=$(kubectl --kubeconfig=${KUBECONFIG} get bucket -n ${SA_NAMESPACE} ${BUCKET_NAME} -o jsonpath='{.status.region}')
    
    echo "FULL_BUCKET_NAME: ${FULL_BUCKET_NAME}"
    echo "ENDPOINT: ${ENDPOINT}"
    echo "REGION: ${REGION}"
    

יצירת BackupRepository

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

  • יוצרים את קובץ ה-YAML, למשל backup-repo.yaml, ומחליפים את המשתנים שנמצאים בקטע הקודם:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f -
    <<EOF
    apiVersion: backup.gdc.goog/v1
    kind: BackupRepository
    metadata:
      name: dbs-backup-repository # This specific name is required for DBS
    spec:
      secretReference:
        namespace: "backups" # Namespace of the Service Account and the auto-generated secret
        name: BUCKET_CRED_SECRET_NAME
      endpoint: ENDPOINT
      type: "S3"
      s3Options:
        bucket: FULL_BUCKET_NAME
        region: REGION
        forcePathStyle: true
      importPolicy: "ReadWrite"
      force: true
      EOF
    

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

    • ‫BUCKET_CRED_SECRET_NAME: שם הסוד.
    • ‫ENDPOINT: נקודת הקצה של הקטגוריה.
    • ‫FULL_BUCKET_NAME: השם המלא של הקטגוריה.
    • ‫REGION: האזור של הקטגוריה.

אימות של מאגר הגיבויים

בודקים את סטטוס המאגר כדי לוודא שהוא הוגדר בצורה נכונה.

  1. מדפיסים את המידע של מאגר הגיבויים:

    kubectl --kubeconfig MANAGEMENT_API_SERVER get backuprepository dbs-backup-repository -ojson | jq .status
    
  2. מוודאים שהפלט נראה דומה לזה: הודעת NoError היא האות לכך שהמאגר הוגדר כמצופה:

    NAME                    TYPE   POLICY      ERROR
    dbs-backup-repository   S3     ReadWrite   NoError
    status:
      conditions:
      - lastTransitionTime: "2025-11-13T00:36:09Z"
        message: Backup Repository reconciled successfully
        reason: Ready
        status: "True"
        type: Ready
      initialImportDone: true
      reconciliationError: NoError
      sentinelEtag: 9b82fbb7-6ea2-444d-8878-ab91397ae961