本文档介绍了如何运行独立工具以便为升级做好准备。在升级 GKE on VMware 版本 1.9 及更高版本中的管理员集群或用户集群之前,我们建议您运行预升级工具。
如需运行该工具,请使用本文档中采用硬编码安全哈希算法 (SHA) 的 bash 脚本。对于该工具的每个版本,本文档都将使用新 SHA 进行更新。该脚本会创建一个 Kubernetes 作业,以根据要升级到的版本运行特定版本的预检检查。
升级前检查
在您升级用户集群之前,该工具会检查以下内容:
Category | 说明 |
---|---|
集群健康状况 |
|
配置 |
|
在您升级管理员集群之前,该工具会检查以下内容:
Category | 说明 |
---|---|
集群健康状况 | 验证管理员集群所有命名空间中的 PodDisruptionBudgets (PDB)。 |
配置 |
准备运行该工具
升级管理员工作站(如果您尚未升级)。
如果您尚未将操作系统映像导入 vSphere(如果您尚未这样做),请运行
gkectl prepare
:gkectl prepare \ --bundle-path /var/lib/gke/bundles/gke-onprem-vsphere-TARGET_VERSION.tgz \ --kubeconfig ADMIN_CLUSTER_KUBECONFIG
替换以下内容:
TARGET_VERSION
:要升级到的 GKE on VMware 补丁版本。版本号的格式必须是完整的补丁版本,例如1.13.10-gke.42
。ADMIN_CLUSTER_KUBECONFIG
:管理员集群 kubeconfig 的路径。
如果您使用的是私有注册表,请使用提供的 Docker 摘要下载预检容器映像,并将该映像上传到私有注册表中。如果您未使用私有注册表,请跳至下一步。
export SRC_IMAGE=gcr.io/gke-on-prem-release/preflight@sha256:8f7bf21dc96ef2360b78ae94190d7b6fd604b6b58aa76e4f2b11761fc87be772 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
替换为私有注册表地址。在以下 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:8f7bf21dc96ef2360b78ae94190d7b6fd604b6b58aa76e4f2b11761fc87be772 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
将上述 bash 脚本保存到名为
pre-upgrade.sh
的文件中,并使其可执行:chmod +x pre-upgrade.sh
运行脚本
运行脚本时提供的参数取决于您是要升级用户集群还是管理员集群:
- 在升级管理员集群之前,请按如下方式运行脚本:
./pre-upgrade.sh TARGET_VERSION
- 在升级用户集群之前,请执行以下操作:
./pre-upgrade.sh TARGET_VERSION USER_CLUSTER_NAME
将
USER_CLUSTER_NAME
替换为要升级的用户集群的名称。输出类似于以下内容:
job.batch/pre-upgrade-2023-0822-213551 created
在作业控制的 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
中是否有状态为Warning
、Unknown
或Failure
的检查,看看能否解决问题。在升级集群之前,请运行以下命令删除作业:
kubectl delete jobs JOB_NAME -n JOB_NAMESPACE \ --kubeconfig ADMIN_CLUSTER_KUBECONFIG