故障排除
概述
以下是解决升级失败的一些提示:
升级流程
Harvester 升级包含了几个阶段:
阶段 1:预配置升级仓库 VM。
Harvester controller 下载 Harvester 版本 ISO 文件并使用它来配置 VM。在此阶段,你可以看到升级状态窗口显示:
完成的时间取决于用户的网络速度和集群资源利用率。由于网络速度,我们看到此阶段出现了故障。如果发生这种情况,用户可以再次重新开始升级。
我们还可以检查仓库 VM(以 upgrade-repo-hvst-xxxx
格式命名)状态及其对应的 Pod:
$ kubectl get vm -n harvester-system
NAME AGE STATUS READY
upgrade-repo-hvst-upgrade-9gmg2 101s Starting False
$ kubectl get pods -n harvester-system | grep upgrade-repo-hvst
virt-launcher-upgrade-repo-hvst-upgrade-9gmg2-4mnmq 1/1 Running 0 4m44s
阶段 2:预加载容器镜像
Harvester controller 在每个 Harvester 节点上创建 Job,以便从仓库 VM 下载镜像并进行预加载。这些是下一个版本所需的容器镜像。
在此阶段,你可以看到升级状态窗口显示:
所有节点都需要一些时间来预加载镜像。如果升级在此阶段失败,用户可以查看 cattle-system
命名空间中的 Job 日志:
$ kubectl get jobs -n cattle-system | grep prepare
apply-hvst-upgrade-9gmg2-prepare-on-node1-with-2bbea1599a-f0e86 0/1 47s 47s
apply-hvst-upgrade-9gmg2-prepare-on-node4-with-2bbea1599a-041e4 1/1 2m3s 2m50s
$ kubectl logs jobs/apply-hvst-upgrade-9gmg2-prepare-on-node1-with-2bbea1599a-f0e86 -n cattle-system
...
如果升级在此阶段失败,重新开始升级也是安全的。
阶段 3:升级系统服务
在此阶段,Harvester controller 使用 Job 来升级组件 Helm Chart。用户可以使用以下命令检查 apply-manifest
Job:
$ kubectl get jobs -n harvester-system -l harvesterhci.io/upgradeComponent=manifest
NAME COMPLETIONS DURATION AGE
hvst-upgrade-9gmg2-apply-manifests 0/1 46s 46s
$ kubectl logs jobs/hvst-upgrade-9gmg2-apply-manifests -n harvester-system
...
阶段 4:升级节点
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:
$ kubectl get jobs -n harvester-system -l harvesterhci.io/upgradeComponent=node
NAME COMPLETIONS DURATION AGE
hvst-upgrade-9gmg2-post-drain-node1 1/1 118s 6m34s
hvst-upgrade-9gmg2-post-drain-node2 0/1 9s 9s
hvst-upgrade-9gmg2-pre-drain-node1 1/1 3s 8m14s
hvst-upgrade-9gmg2-pre-drain-node2 1/1 7s 85s
$ kubectl logs -n harvester-system jobs/hvst-upgrade-9gmg2-post-drain-node2
...
警告
如果升级在此阶段失败,请不要重新开始升级。
阶段 5:清理
Harvester controller 会删除升级仓库 VM 和不再需要的文件。
常用操作
重新开始升级
登录到 control plane 节点。
列出集群中的
Upgrade
CR:# 使用 root
$ sudo -i
# 列出进行中的升级
$ kubectl get upgrade.harvesterhci.io -n harvester-system -l harvesterhci.io/latestUpgrade=true
NAME AGE
hvst-upgrade-9gmg2 10m
删除 Upgrade CR
$ kubectl delete upgrade.harvesterhci.io/hvst-upgrade-9gmg2 -n harvester-system
单击 Harvester 仪表板中的升级按钮,重新开始升级。
下载升级日志
我们设计并实现了一种机制,用于自动收集所有与升级相关的日志并显示升级过程。默认情况下,此功能已启用。你也可以选择退出此类行为。
你可以在升级过程中单击 Download Log 按钮来下载日志存档。
每个与升级相关的 Pod(包括中间 Pod)日志条目都将被收集为文件。Support Bundle 提供了集群当前状态的快照,包括日志和资源清单,而升级日志则保留了升级期间生成的任何日志。通过结合二者,你可以进一步调查升级过程中的问题。
升级结束后,Harvester 会停止收集升级日志,以免占用磁盘空间。此外,你还可以单击 Dismiss it 按钮来清除升级日志。
有关更多详情,请参阅升级日志 HEP。
警告
升级日志的存储容量默认为 1GB。如果升级出现问题,日志可能会占用卷的所有可用空间。要解决此问题,请尝试以下步骤:
- 你可以通过缩小
Fluentd
StatefulSet 和downloader
Deployment 来拔出log-archive
卷。
# Locate the StatefulSet and Deployment
$ kubectl -n harvester-system get statefulsets -l harvesterhci.io/upgradeLogComponent=aggregator
NAME READY AGE
hvst-upgrade-xxxxx-upgradelog-infra-fluentd 1/1 43s
$ kubectl -n harvester-system get deployments -l harvesterhci.io/upgradeLogComponent=downloader
NAME READY UP-TO-DATE AVAILABLE AGE
hvst-upgrade-xxxxx-upgradelog-downloader 1/1 1 1 38s
# Scale down the resources to terminate any Pods using the volume
$ kubectl -n harvester-system scale statefulset hvst-upgrade-xxxxx-upgradelog-infra-fluentd --replicas=0
statefulset.apps/hvst-upgrade-xxxxx-upgradelog-infra-fluentd scaled
$ kubectl -n harvester-system scale deployment hvst-upgrade-xxxxx-upgradelog-downloader --replicas=0
deployment.apps/hvst-upgrade-xxxxx-upgradelog-downloader scaled
- 通过 Longhorn 仪表板扩展卷大小。有关更多详情,请参阅卷扩展指南。
# Here's how to find out the actual name of the target volume
$ kubectl -n harvester-system get pvc -l harvesterhci.io/upgradeLogComponent=log-archive -o jsonpath='{.items[].spec.volumeName}'
pvc-63355afb-ce61-46c4-8781-377cf962278a
- 恢复
Fluentd
StatefulSet 和downloader
Deployment。
$ kubectl -n harvester-system scale statefulset hvst-upgrade-xxxxx-upgradelog-infra-fluentd --replicas=1
statefulset.apps/hvst-upgrade-xxxxx-upgradelog-infra-fluentd scaled
$ kubectl -n harvester-system scale deployment hvst-upgrade-xxxxx-upgradelog-downloader --replicas=1
deployment.apps/hvst-upgrade-xxxxx-upgradelog-downloader scaled