執行升級前工具

本文說明如何執行獨立工具,為升級做準備。升級 Google Distributed Cloud 1.9 以上版本的管理員或使用者叢集前,建議您先執行升級前工具。

如要執行這項工具,請使用本文中的 bash 指令碼,該指令碼會使用硬式編碼的安全雜湊演算法 (SHA)。每次發布工具時,這份文件都會更新為新的 SHA。指令碼會建立 Kubernetes 工作,根據您要升級的版本執行特定版本的前置檢查。

升級前檢查

升級使用者叢集前,這項工具會檢查下列項目:

類別 說明
叢集健康狀態
  • 驗證管理員叢集所有命名空間中的 PDB。
  • 驗證使用者叢集所有命名空間中的 PDB。
  • 驗證管理員叢集先前的升級作業是否已順利完成。
設定
  • 建議升級的修補程式版本。
  • 如果您要升級至 1.10,系統會發出警告,指出您是否需要套用已知問題中的解決方法。

在升級管理員叢集前,這項工具會檢查下列項目:

類別 說明
叢集健康狀態 驗證管理叢集所有命名空間中的 PodDisruptionBudgets (PDB)。
設定

準備執行工具

  1. 如果尚未升級管理員工作站,請升級

  2. 如果尚未將 OS 映像檔匯入 vSphere,請執行 gkectl prepare

    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. 如果您使用私人登錄檔,請下載預檢容器映像檔 (使用提供的 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 指令碼中,為這些預留位置設定值:

    • 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. 在工作控制的 Pod 上執行下列指令,即可取得驗證結果清單。

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

    更改下列內容:

    • JOB_NAME:這是指令碼在上一步驟中輸出的工作名稱。

    • JOB_NAMESPACE:您設定的值取決於要升級管理員叢集還是使用者叢集。如要升級管理員叢集,請指定 kube-system。如果您要升級使用者叢集,請指定 USER_CLUSTER_NAME-gke-onprem-mgmt

    請稍候幾分鐘,等待工作完成或達到退避限制而失敗。在結果中,查看狀態為 WarningUnknownFailure 的任何檢查項目 Reason,看看是否能解決問題。

  3. 升級叢集前,請先執行下列指令刪除 Job:

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