故障排除

概述

以下是解决升级失败的一些提示:

  • 查看版本的升级说明。你可以单击支持矩阵表中的版本查看是否存在已知问题。
  • 深入了解升级设计方案。以下简要介绍了升级的各个阶段以及可能的解决方法。

升级流程

Harvester 升级包含了几个阶段: 故障排除 - 图1

阶段 1:预配置升级仓库 VM。

Harvester controller 下载 Harvester 版本 ISO 文件并使用它来配置 VM。在此阶段,你可以看到升级状态窗口显示:

故障排除 - 图2

完成的时间取决于用户的网络速度和集群资源利用率。由于网络速度,我们看到此阶段出现了故障。如果发生这种情况,用户可以再次重新开始升级

我们还可以检查仓库 VM(以 upgrade-repo-hvst-xxxx 格式命名)状态及其对应的 Pod:

  1. $ kubectl get vm -n harvester-system
  2. NAME AGE STATUS READY
  3. upgrade-repo-hvst-upgrade-9gmg2 101s Starting False
  4. $ kubectl get pods -n harvester-system | grep upgrade-repo-hvst
  5. virt-launcher-upgrade-repo-hvst-upgrade-9gmg2-4mnmq 1/1 Running 0 4m44s

阶段 2:预加载容器镜像

Harvester controller 在每个 Harvester 节点上创建 Job,以便从仓库 VM 下载镜像并进行预加载。这些是下一个版本所需的容器镜像。

在此阶段,你可以看到升级状态窗口显示:

故障排除 - 图3

所有节点都需要一些时间来预加载镜像。如果升级在此阶段失败,用户可以查看 cattle-system 命名空间中的 Job 日志:

  1. $ kubectl get jobs -n cattle-system | grep prepare
  2. apply-hvst-upgrade-9gmg2-prepare-on-node1-with-2bbea1599a-f0e86 0/1 47s 47s
  3. apply-hvst-upgrade-9gmg2-prepare-on-node4-with-2bbea1599a-041e4 1/1 2m3s 2m50s
  4. $ kubectl logs jobs/apply-hvst-upgrade-9gmg2-prepare-on-node1-with-2bbea1599a-f0e86 -n cattle-system
  5. ...

如果升级在此阶段失败,重新开始升级也是安全的。

阶段 3:升级系统服务

故障排除 - 图4

在此阶段,Harvester controller 使用 Job 来升级组件 Helm Chart。用户可以使用以下命令检查 apply-manifest Job:

  1. $ kubectl get jobs -n harvester-system -l harvesterhci.io/upgradeComponent=manifest
  2. NAME COMPLETIONS DURATION AGE
  3. hvst-upgrade-9gmg2-apply-manifests 0/1 46s 46s
  4. $ kubectl logs jobs/hvst-upgrade-9gmg2-apply-manifests -n harvester-system
  5. ...

阶段 4:升级节点

故障排除 - 图5

Harvester controller 在每个节点上(一个接一个)创建 Job 以升级节点的操作系统和 RKE2 运行时。对于多节点集群,更新节点的 Job 有两种:

  • pre-drain Job:热迁移或关闭节点上的虚拟机。Job 完成后,嵌入式 Rancher 服务会升级节点上的 RKE2 运行时。
  • post-drain Job:升级操作系统并重新启动。

对于单节点集群,每个节点只有一个 single-node-upgrade 类型的 Job(命名格式为 hvst-upgrade-xxx-single-node-upgrade-<hostname> )。

用户可以通过以下方式检查节点 Job:

  1. $ kubectl get jobs -n harvester-system -l harvesterhci.io/upgradeComponent=node
  2. NAME COMPLETIONS DURATION AGE
  3. hvst-upgrade-9gmg2-post-drain-node1 1/1 118s 6m34s
  4. hvst-upgrade-9gmg2-post-drain-node2 0/1 9s 9s
  5. hvst-upgrade-9gmg2-pre-drain-node1 1/1 3s 8m14s
  6. hvst-upgrade-9gmg2-pre-drain-node2 1/1 7s 85s
  7. $ kubectl logs -n harvester-system jobs/hvst-upgrade-9gmg2-post-drain-node2
  8. ...

故障排除 - 图6警告

如果升级在此阶段失败,请不要重新开始升级。

阶段 5:清理

Harvester controller 会删除升级仓库 VM 和不再需要的文件。

常用操作

重新开始升级

  1. 登录到 control plane 节点。

  2. 列出集群中的 Upgrade CR:

    1. # 使用 root
    2. $ sudo -i
    3. # 列出进行中的升级
    4. $ kubectl get upgrade.harvesterhci.io -n harvester-system -l harvesterhci.io/latestUpgrade=true
    5. NAME AGE
    6. hvst-upgrade-9gmg2 10m
  3. 删除 Upgrade CR

    1. $ kubectl delete upgrade.harvesterhci.io/hvst-upgrade-9gmg2 -n harvester-system
  4. 单击 Harvester 仪表板中的升级按钮,重新开始升级。

下载升级日志

我们设计并实现了一种机制,用于自动收集所有与升级相关的日志并显示升级过程。默认情况下,此功能已启用。你也可以选择退出此类行为。

The "Enable Logging" checkbox on the upgrade confirmation dialog

你可以在升级过程中单击 Download Log 按钮来下载日志存档。

Download the upgrade log archive by clicking the "Download Log" button on the upgrade dialog

每个与升级相关的 Pod(包括中间 Pod)日志条目都将被收集为文件。Support Bundle 提供了集群当前状态的快照,包括日志和资源清单,而升级日志则保留了升级期间生成的任何日志。通过结合二者,你可以进一步调查升级过程中的问题。

The upgrade log archive contains all the logs generated by the upgrade-related Pods

升级结束后,Harvester 会停止收集升级日志,以免占用磁盘空间。此外,你还可以单击 Dismiss it 按钮来清除升级日志。

The upgrade log archive contains all the logs generated by the upgrade-related Pods

有关更多详情,请参阅升级日志 HEP

故障排除 - 图11警告

升级日志的存储容量默认为 1GB。如果升级出现问题,日志可能会占用卷的所有可用空间。要解决此问题,请尝试以下步骤:

  1. 你可以通过缩小 Fluentd StatefulSet 和 downloader Deployment 来拔出 log-archive 卷。
  1. # Locate the StatefulSet and Deployment
  2. $ kubectl -n harvester-system get statefulsets -l harvesterhci.io/upgradeLogComponent=aggregator
  3. NAME READY AGE
  4. hvst-upgrade-xxxxx-upgradelog-infra-fluentd 1/1 43s
  5. $ kubectl -n harvester-system get deployments -l harvesterhci.io/upgradeLogComponent=downloader
  6. NAME READY UP-TO-DATE AVAILABLE AGE
  7. hvst-upgrade-xxxxx-upgradelog-downloader 1/1 1 1 38s
  8. # Scale down the resources to terminate any Pods using the volume
  9. $ kubectl -n harvester-system scale statefulset hvst-upgrade-xxxxx-upgradelog-infra-fluentd --replicas=0
  10. statefulset.apps/hvst-upgrade-xxxxx-upgradelog-infra-fluentd scaled
  11. $ kubectl -n harvester-system scale deployment hvst-upgrade-xxxxx-upgradelog-downloader --replicas=0
  12. deployment.apps/hvst-upgrade-xxxxx-upgradelog-downloader scaled
  1. 通过 Longhorn 仪表板扩展卷大小。有关更多详情,请参阅卷扩展指南
  1. # Here's how to find out the actual name of the target volume
  2. $ kubectl -n harvester-system get pvc -l harvesterhci.io/upgradeLogComponent=log-archive -o jsonpath='{.items[].spec.volumeName}'
  3. pvc-63355afb-ce61-46c4-8781-377cf962278a
  1. 恢复 Fluentd StatefulSet 和 downloader Deployment。
  1. $ kubectl -n harvester-system scale statefulset hvst-upgrade-xxxxx-upgradelog-infra-fluentd --replicas=1
  2. statefulset.apps/hvst-upgrade-xxxxx-upgradelog-infra-fluentd scaled
  3. $ kubectl -n harvester-system scale deployment hvst-upgrade-xxxxx-upgradelog-downloader --replicas=1
  4. deployment.apps/hvst-upgrade-xxxxx-upgradelog-downloader scaled