跳至主要内容

故障排除

概述​

以下是對升級失敗進行故障排除的一些提示:

  • 查看特定版本的升級說明。您可以點擊支援矩陣表中的版本以查看是否有任何已知問題。
  • 深入研究升級設計提案。以下章節簡要描述了升級中的階段和可能的診斷方法。

升級流程​

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 指示這樣做。

  1. 產生支援套件。

  2. 停止正在進行的升級。

  3. 在 Harvester UI Dashboard 畫面上點擊 Upgrade 按鈕。

    如果您自訂了版本,您可能需要再次建立版本物件。

停止正在進行的升級​

  1. 登入控制平面節點。

  2. 列出叢集中的 Upgrade CR。

    # 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
  3. 刪除 Upgrade CR。

    $ kubectl delete upgrade.harvesterhci.io/hvst-upgrade-9gmg2 -n harvester-system
  4. 恢復暫停的 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 會自動收集所有升級相關的日誌並顯示升級程序。預設情況下,此功能已啟用。您也可以選擇退出此行為。

The &quot;Enable Logging&quot; checkbox on the upgrade confirmation dialog

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

Download the upgrade log archive by clicking the &quot;Download Log&quot; button on the upgrade dialog

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

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

如需更多詳細資訊,請參閱 upgrade log HEP。

警告

儲存升級相關日誌的卷的預設大小為 1 GB。當發生錯誤時,這些日誌可能會完全消耗卷的可用空間。要解決此問題,您可以執行以下步驟:

  1. 透過縮減 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
  2. 使用 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。

  3. 恢復 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

清理未使用的映像檔​

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 以清理未使用的映像檔。

Disk space not enough error message