故障排除
概述
以下是對升級失敗進行故障排除的一些提示:
升級流程
Harvester 升級過程涉及幾個階段。

Phase 1: 配置升級儲存庫虛擬機
Harvester 控制器下載發布 ISO 檔案並使用它來配 置儲存庫虛擬機。虛擬機名稱使用格式 upgrade-repo-hvst-xxxx。

網路速度和叢集資源使用率會影響完成此階段所需的時間。升級通常會因為網路速度問題而失敗。
如果升級在此時失敗,請在重新啟動升級之前檢查儲存庫虛擬機及其相應 Pod 的狀態。您可以使用命令 kubectl get vm -n harvester-system 檢查狀態。
範例:
$ 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
Phase 2: 預載容器映像檔
Harvester 控制器建立任務,從儲存庫虛擬機下載並預載容器映像檔。這些映像檔是下一個版本所需的。
請留出一些時間讓映像檔在所有節點上下載和預載。

如果升級在此時失敗,請在重新啟動升級之前檢查 cattle-system 命名空間中的任務日誌。您可以使用命令 kubectl get jobs -n cattle-system | grep prepare 檢查日誌。
範例:
$ 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
...
Phase 3: 升級系統服務
Harvester 控制器建立一個升級元件 Helm chart 的任務。

您可以使用命令 $ kubectl get jobs -n harvester-system -l harvesterhci.io/upgradeComponent=manifest 檢查 apply-manifest 任務。
範例:
$ 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
...
Phase 4: 升級節點
Harvester 控制器在每個節點上建立以下任務:
- 多節點叢集:
pre-drain任務:即時遷移或關閉虛擬機在節點上。完成後,嵌入式 Rancher 服務會升級節點上的 RKE2 執行時。post-drain任務:升級和重新啟動作業系統。
- 單節點叢集:
single-node-upgrade任務:升級作業系統和 RKE2 執行時。任務名稱使用格式hvst-upgrade-xxx-single-node-upgrade-<hostname>。

您可以透過執行命令 kubectl get jobs -n harvester-system -l harvesterhci.io/upgradeComponent=node 來檢查在每個節點上執行的任務。
範例:
$ 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
...
如果升級在此時失敗,請勿重新啟動升級,除非 SUSE support 指示這樣做。
Phase 5: 清理
Harvester 控制器刪除儲存庫虛擬機和所有不再需要的檔案。
常見操作
重新啟動升級
如果正在進行的升級失敗或卡在 Phase 4: Upgrade Nodes,請勿重新啟動升級,除非 SUSE support 指示這樣做。
停止正在進行的升級
-
登入控制平面節點。
-
列出叢集中的
UpgradeCR。# become root
$ sudo -i
# list the on-going upgrade
$ kubectl get upgrade.harvesterhci.io -n harvester-system -l harvesterhci.io/latestUpgrade=true
NAME AGE
hvst-upgrade-9gmg2 10m -
刪除
UpgradeCR。$ kubectl delete upgrade.harvesterhci.io/hvst-upgrade-9gmg2 -n harvester-system -
恢復暫停的 ManagedChart。
ManagedChart 被暫停以避免升級和其他程序之間的資料競爭。當升級被手動停止時,ManagedChart 可能沒有被恢復,您需要手動恢復所有暫停的 ManagedChart。
cat > resumeallcharts.sh << 'FOE'
resume_all_charts() {
local patchfile="/tmp/charttmp.yaml"
cat >"$patchfile" << 'EOF'
spec:
paused: false
EOF
echo "the to-be-patched file"
cat "$patchfile"
local charts="harvester harvester-crd rancher-monitoring-crd rancher-logging-crd"
for chart in $charts; do
echo "unapuse managedchart $chart"
kubectl patch managedcharts.management.cattle.io $chart -n fleet-local --patch-file "$patchfile" --type merge || echo "failed, check reason"
done
rm "$patchfile"
}
resume_all_charts
FOE
chmod +x ./resumeallcharts.sh
./resumeallcharts.sh
下載升級日誌
Harvester 會自動收集所有升級相關的日誌並顯示升級程序。預設情況下,此功能已啟用。您也可以選擇退出此行為。

您可以在升 級期間點擊 Download Log 按鈕下載日誌封存檔。

日誌項目將作為每個升級相關 Pod 的檔案收集,即使是中間 Pod 也是如此。支援套件提供叢集目前狀態的快照,包括日誌和資源清單,而升級日誌則保留升級期間產生的任何日誌。透過結合這兩者,您可以進一步調查升級期間的問題。

升級結束後,Harvester 會停止收集升級日誌以避免佔用磁碟空間。此外,您可以點擊 Dismiss it 按鈕清除升級日誌。

如需更多詳細資訊,請參閱 upgrade log HEP。
儲存升級相關日誌的卷的預設大小為 1 GB。當發生錯誤時,這些日誌可能會完全消耗卷的可用空間。要解決此問題,您可以執行以下步驟:
-
透過縮減
fluentdStatefulSet 和downloaderdeployment 來分離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 UI 擴展卷大小。
# 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如需更多資訊,請參閱 Longhorn 文件中的 Volume Expansion。
-
恢復
fluentdStatefulSet 和downloaderdeployment。$ 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
清理未使用的映像檔
KubeletConfiguration 中 imageGCHighThresholdPercent 的預設值為 85。當磁碟使用率超過 85% 時,kubelet 會嘗試刪除未使用的映像檔。
在升級期間,新映像檔會載入到每個 Harvester 節點。當磁碟使用率超過 85% 時,這些新映像檔可能會被標記為清理,因為它們未被任何容器使用。在離線環境中,從叢集中刪除新映像檔可能會中斷升級過程。
如果您遇到錯誤訊息 Node xxx will reach xx.xx% storage space after loading new images. It's higher than kubelet image garbage collection threshold 85%.,請在開始新升級之前執行 crictl rmi --prune 以清理未使用的映像檔。
