הפעלת הכלי שלפני השדרוג

במאמר הזה מוסבר איך להפעיל כלי עצמאי כהכנה לשדרוג. לפני שמשדרגים אשכול אדמין או אשכול משתמשים ב-Google Distributed Cloud בגרסה 1.9 ובגרסאות מאוחרות יותר, מומלץ להריץ את כלי ההכנה לשדרוג.

כדי להריץ את הכלי, משתמשים בסקריפט bash שבמסמך הזה, שמבוסס על אלגוריתמים לגיבוב מאובטח (SHA) שמוגדרים כקשיחים. בכל גרסה של הכלי, המסמך הזה יעודכן עם ה-SHA החדש. הסקריפט יוצר Kubernetes Job כדי להריץ גרסה ספציפית של בדיקות מקדימות, בהתאם לגרסה שמשדרגים אליה.

בדיקות לפני שדרוג

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

קטגוריה תיאור
תקינות האשכול
  • מאמת את ה-PDB בכל מרחבי השמות של אשכול האדמין.
  • מאמת את ה-PDB בכל מרחבי השמות של אשכול המשתמשים.
  • הכלי מאמת ששדרוג קודם של אשכול האדמין הסתיים בהצלחה.
הגדרות אישיות
  • ממליץ על גרסת התיקון שאליה כדאי לשדרג.
  • אם אתם משדרגים לגרסה 1.10, תופיע אזהרה אם תצטרכו להחיל את הפתרון העקיף שמופיע בבעיה הידועה הזו.

הכלי בודק את הדברים הבאים לפני שמשדרגים אשכול אדמין:

קטגוריה תיאור
תקינות האשכול מאמת את PodDisruptionBudgets (PDBs) בכל מרחבי השמות של אשכול האדמין.
הגדרות אישיות

הכנה להפעלת הכלי

  1. משדרגים את תחנת העבודה של האדמין, אם עדיין לא עשיתם את זה.

  2. מריצים את הפקודה gkectl prepare כדי לייבא תמונות של מערכת ההפעלה אל vSphere, אם עדיין לא עשיתם זאת:

    gkectl prepare \
        --bundle-path /var/lib/gke/bundles/gke-onprem-vsphere-TARGET_VERSION.tgz \
        --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    

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

    • TARGET_VERSION: גרסת הפאץ' של Google Distributed Cloud שאליה רוצים לשדרג. הפורמט של מספר הגרסה צריך להיות גרסת תיקון מלאה, כמו 1.13.10-gke.42.

    • ADMIN_CLUSTER_KUBECONFIG: הנתיב לקובץ ה-kubeconfig של אשכול האדמין.

  3. אם אתם משתמשים במאגר פרטי, הורידו את קובץ האימג' של הקונטיינר לבדיקה המוקדמת עם ה-digest של Docker שסופק, והעלו את קובץ האימג' למאגר הפרטי. אם אתם לא משתמשים במאגר פרטי, דלגו לשלב הבא.

    export SRC_IMAGE=gcr.io/gke-on-prem-release/preflight@sha256:9704315c6637750a014d0079ca04a8f97d0ca3735e175020377107c3181f6234
    export DST_IMAGE=REGISTRY_ADDRESS/preflight:$(date +%Y-%m%d-%H%M%S)
    docker pull $SRC_IMAGE
    docker tag $SRC_IMAGE $DST_IMAGE
    docker push $DST_IMAGE
    

    מחליפים את REGISTRY_ADDRESS בכתובת של הרישום הפרטי.

  4. בסקריפט הבא של bash, מגדירים ערכים ל-placeholders האלה:

    • ADMIN_CLUSTER_KUBECONFIG: הנתיב לקובץ ה-kubeconfig של אשכול האדמין.

    • REGISTRY_ADDRESS: אם אשכול האדמין משתמש במאגר פרטי, זוהי כתובת המאגר הפרטי שציינתם בשלב הקודם. אם אתם לא משתמשים במרשם פרטי, צריך לציין את המרשם הציבורי: gcr.io/gke-on-prem-release

    #!/bin/bash
    UPGRADE_TARGET_VERSION=${1}
    CLUSTER_NAME=${2}
    ADMIN_KUBECONFIG=ADMIN_CLUSTER_KUBECONFIG
    REGISTRY_ADDRESS=REGISTRY_ADDRESS
    pre_upgrade_namespace=kube-system
    if [[ -z "$CLUSTER_NAME" ]]
    then
      echo "Running the pre-ugprade tool before admin cluster upgrade"
    else
      echo "Running the pre-ugprade tool before user cluster upgrade"
      pre_upgrade_namespace=$CLUSTER_NAME-gke-onprem-mgmt
    fi
    kubectl apply --kubeconfig ${ADMIN_KUBECONFIG} -f - <<EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: pre-upgrade-job
      namespace: $pre_upgrade_namespace
    EOF
    kubectl apply --kubeconfig ${ADMIN_KUBECONFIG} -f - <<EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      creationTimestamp: null
      name: pre-upgrade-job-rolebinding-in-$pre_upgrade_namespace
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: onprem-user-cluster-controller-role
    subjects:
      - kind: ServiceAccount
        name: pre-upgrade-job
        namespace: $pre_upgrade_namespace
    EOF
    kubectl apply --kubeconfig ${ADMIN_KUBECONFIG} -f - <<EOF
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: pre-upgrade-$(date +%Y-%m%d-%H%M%S)
      namespace: $pre_upgrade_namespace
      labels:
        onprem.cluster.gke.io/job-usage: preflight
    spec:
      ttlSecondsAfterFinished: 2592000
      backoffLimit: 2
      template:
        metadata:
          labels:
            onprem.cluster.gke.io/pod-usage: preflight
        spec:
          containers:
          - name: preflight
            image: $REGISTRY_ADDRESS/preflight@sha256:9704315c6637750a014d0079ca04a8f97d0ca3735e175020377107c3181f6234
            imagePullPolicy: Always
            command:
            - /preflight
            - --upgrade-target-version
            - "$UPGRADE_TARGET_VERSION"
            - --cluster-name
            - "$CLUSTER_NAME"
            - --scenario
            - pre-upgrade
          restartPolicy: Never
          serviceAccountName: pre-upgrade-job
          imagePullSecrets:
          - name: private-registry-creds
    EOF
    
  5. שומרים את סקריפט ה-Bash שלמעלה בקובץ בשם pre-upgrade.sh והופכים אותו לקובץ הפעלה:

    chmod +x pre-upgrade.sh
    

הפעלת הסקריפט

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

    • לפני שמשדרגים אשכול אדמין, מריצים את הסקריפט באופן הבא:
    ./pre-upgrade.sh TARGET_VERSION
    
    • לפני שמשדרגים אשכול משתמשים:
    ./pre-upgrade.sh TARGET_VERSION USER_CLUSTER_NAME
    

    מחליפים את USER_CLUSTER_NAME בשם של אשכול המשתמש שרוצים לשדרג.

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

    job.batch/pre-upgrade-2023-0822-213551 created
    
  2. מריצים את הפקודה הבאה ב-Pods שמנוהלים על ידי המשימה כדי לקבל רשימה של תוצאות האימות.

    kubectl logs -n JOB_NAMESPACE jobs/JOB_NAME \
        --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    

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

    • JOB_NAME: זהו שם המשימה שהסקריפט מוציא כפלט מהשלב הקודם.

    • JOB_NAMESPACE: הערך שאתם מגדירים תלוי בסוג האשכול שאתם משדרגים – אשכול אדמין או אשכול משתמשים. אם משדרגים אשכול אדמין, מציינים את kube-system. אם משדרגים אשכול משתמשים, צריך לציין USER_CLUSTER_NAME-gke-onprem-mgmt.

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

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

    kubectl delete jobs JOB_NAME -n JOB_NAMESPACE \
        --kubeconfig ADMIN_CLUSTER_KUBECONFIG