运行预升级工具

本文档介绍如何在准备升级时运行独立工具。在升级 GKE on VMware 1.9 版及更高版本中的管理员或用户集群之前,我们建议您运行预升级工具。

如需运行该工具,请使用本文档中采用硬编码安全哈希算法 (SHA) 的 bash 脚本。对于该工具的每个版本,本文档都将使用新的 SHA。该脚本会创建一个 Kubernetes 作业,以根据要升级到的版本运行特定版本的预检检查。

升级前检查

在您升级用户集群之前,该工具会检查以下内容:

类别 说明
集群健康状况
  • 验证管理员集群的所有命名空间中的 PDB。
  • 验证用户集群所有命名空间中的 PDB。
  • 验证管理员集群的先前升级是否成功完成。
配置
  • 建议升级到的补丁版本。
  • 如果您要升级到 1.10,则需要在您需要应用此已知问题中的解决方法时发出警告。

在您升级管理员集群之前,该工具会检查以下内容:

类别 说明
集群健康状况 验证管理员集群的所有命名空间中的 PodDisruptionBudgets (PDB)。
配置

准备运行该工具

  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:您要升级到的 GDCV for VMware 补丁程序版本。版本号的格式必须是完整的补丁版本,例如 1.13.10-gke.42

    • ADMIN_CLUSTER_KUBECONFIG:管理员集群 kubeconfig 的路径。

  3. 如果您使用的是私有注册表,请使用提供的 Docker digest 下载预检容器映像,并将该映像上传到私有注册表中。如果您使用的不是私有注册表,请跳至下一步。

    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

    等待几分钟,以便作业完成或达到退避时间并失败。在结果中,查看 Reason 中是否有状态为 WarningUnknownFailure 的检查,看看能否解决问题。

  3. 在升级集群之前,请运行以下命令删除作业:

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