升級作業系統的最佳做法

本文說明在 Compute Engine 執行個體上升級作業系統的最佳做法和策略。瞭解如何使用不可變動的基礎架構、重新建立執行個體或就地工作流程,升級主要 OS 版本,以及如何自動執行例行安全性修補作業。

作業系統版本即將終止支援 (EOS) 或終止生命週期 (EOL) 時,您必須升級至支援的作業系統版本,才能繼續取得安全性更新、維持軟體相容性,以及 Cloud de Confiance by S3NS 平台整合。如要進一步瞭解支援階段,請參閱「作業系統生命週期」。

就地升級主要 OS 版本的風險

如果您對作業系統執行重大就地升級 (例如在執行中的運算執行個體上,將 Debian 12 升級至 13、RHEL 9 升級至 10,或 Ubuntu 24.04 升級至 26.04),就會在雲端環境中造成重大作業風險。與地端實體伺服器不同,運算執行個體需要依賴訪客環境的專用套件,才能與管理程序和 Compute Engine 中繼資料伺服器通訊。

就地升級作業系統時,可能會發生下列故障模式:

  • SSH 和 RDP 連線中斷:網路服務、訪客層級防火牆規則 (例如 ufw 或 firewalld) 或 SSH 精靈設定的設定格式,可能會因 OS 版本而異,導致遠端管理存取權中斷。
  • 中斷客體環境:google-guest-agent 和 google-oslogin 套件會管理 SSH 金鑰、使用者帳戶、網路介面,以及與中繼資料的同步作業。如果套件存放區或依附元件在發布升級期間中斷,訪客代理程式可能會停止執行,導致無法進一步登入或設定網路。
  • 儲存空間和核心驅動程式不相容:變更核心、initramfs 或磁碟控制器 (例如 virtio-scsi 或 NVMe) 的驅動程式,可能會導致開機失敗,或導致運算執行個體無法辨識所連線的永久磁碟磁碟區。
  • 存放區設定不一致:作業系統供應商通常會淘汰或取代舊版套件存放區和簽署金鑰,導致套件管理員在升級期間發生錯誤,並使作業系統處於無法復原的半安裝狀態。

為避免這些風險,請使用不可變動的基礎架構模型,而非在正式環境運算執行個體上就地升級主要 OS 版本。

選擇合適的升級策略

請根據工作負載是否有狀態,選擇下列其中一種策略:

策略 適合 停機風險 復原機制
不可變動的基礎架構 無狀態工作負載、代管執行個體群組 (MIG)、微服務、容器主機 透過滾動式替換作業,完全不必停機 將執行個體範本還原為較早的映像檔
使用永久磁碟重新建立運算執行個體 有狀態的獨立運算執行個體、附加次要儲存空間的資料庫、舊版應用程式主機 在預定維護期間內,將影響降到最低 將磁碟重新附加至原始運算執行個體,或還原快照
作業系統就地升級 無法自動化或擷取本機設定的獨立運算執行個體 高,需要停機並手動規劃復原作業 從永久磁碟快照還原

不可變的基礎架構

使用不可變動的基礎架構模型,是升級作業系統最安全可靠的方式。您不必修改執行中的運算執行個體,而是從更新後的公開或自訂 OS 映像檔建立新的運算執行個體,並取代舊版執行個體。

如果工作負載在代管執行個體群組 (MIG) 中執行,您就能自動推出更新,且服務不會停機。

建立更新後的圖片

  1. 從支援的「作業系統詳細資料」清單中選取最新的公開作業系統映像檔,或使用 Image Builder 或 Packer/Ansible 等自動化工具建立自訂基礎映像檔。
  2. 在非正式測試環境中,確認應用程式和依附元件在新版 OS 上可順利安裝及執行。
  3. 建立自訂 OS 映像檔,或參照新的公開映像檔系列。詳情請參閱「圖片系列最佳做法」。

建立更新後的執行個體範本

建立新的執行個體範本,並參照更新後的 OS 映像檔:

gcloud compute instance-templates create NEW_TEMPLATE_NAME \
    --image-family=IMAGE_FAMILY \
    --image-project=IMAGE_PROJECT \
    --machine-type=MACHINE_TYPE \
    --region=REGION

更改下列內容:

  • NEW_TEMPLATE_NAME:新執行個體範本的名稱。
  • IMAGE_FAMILY:目標 OS 的映像檔系列,例如 debian-12 或 ubuntu-2404-lts。
  • IMAGE_PROJECT:圖片的代管專案,例如 debian-cloud 或 ubuntu-os-cloud。
  • MACHINE_TYPE:執行個體的機型。
  • REGION:您建立範本的 Compute Engine 區域。

在 MIG 中執行滾動式更換

將更新後的範本套用至代管執行個體群組,並啟動滾動式替換:

gcloud compute instance-groups managed rolling-action replace MIG_NAME \
    --max-surge=20% \
    --max-unavailable=0 \
    --region=REGION

更改下列內容:

  • MIG_NAME:代管執行個體群組的名稱。
  • REGION:MIG 所在的區域。如果是區域 MIG,請將 --region=REGION 替換為 --zone=ZONE。

使用永久磁碟重新建立運算執行個體

如果您執行有狀態的獨立運算執行個體,且應用程式將設定和資料儲存在永久磁碟磁碟區,則可以透過重新建立運算執行個體並使用新的開機磁碟,同時保留資料磁碟,升級作業系統。

備份所有磁碟

修改基礎架構前,請先建立開機磁碟和所有附加的 Persistent Disk 磁碟區的標準或區域快照:

gcloud compute disks snapshot BOOT_DISK_NAME \
    --snapshot-names=SNAPSHOT_NAME \
    --zone=ZONE

更改下列內容:

  • BOOT_DISK_NAME:要備份的開機磁碟名稱。
  • SNAPSHOT_NAME:新 Persistent Disk 快照的名稱。
  • ZONE:磁碟所在的可用區。

詳情請參閱「建立及管理快照」。

將應用程式資料與開機磁碟分開

請確保應用程式資料、資料庫檔案和交易記錄位於次要 Persistent Disk 磁碟區或外部服務 (例如 Cloud Storage 或 Cloud SQL),而非開機磁碟。

建立替代運算執行個體

  1. 停止舊版運算執行個體,確保資料一致性:

    gcloud compute instances stop LEGACY_INSTANCE_NAME --zone=ZONE
    
  2. 從舊版運算執行個體卸載次要資料磁碟:

    gcloud compute instances detach-disk LEGACY_INSTANCE_NAME \
        --disk=DATA_DISK_NAME \
        --zone=ZONE
    
  3. 使用目標 OS 版本建立新的運算執行個體:

    gcloud compute instances create NEW_INSTANCE_NAME \
        --image-family=IMAGE_FAMILY \
        --image-project=IMAGE_PROJECT \
        --zone=ZONE \
        --machine-type=MACHINE_TYPE
    
  4. 將現有的次要資料磁碟連接至新的運算執行個體:

    gcloud compute instances attach-disk NEW_INSTANCE_NAME \
        --disk=DATA_DISK_NAME \
        --zone=ZONE
    
  5. 連線至新的運算執行個體,在資料磁碟上掛接檔案系統,然後啟動應用程式服務。

  6. 如有必要,請重新指派任何靜態外部 IP 位址或 DNS 記錄,指向新的運算執行個體。

更改下列內容:

  • LEGACY_INSTANCE_NAME:要升級的現有運算執行個體名稱。
  • DATA_DISK_NAME:要卸離並重新連結的次要永久磁碟卷冊名稱。
  • NEW_INSTANCE_NAME:新替代運算執行個體的名稱。
  • IMAGE_FAMILY:目標 OS 版本的映像檔系列,例如 debian-13 或 ubuntu-2604-lts。
  • IMAGE_PROJECT:提供映像檔的專案,例如 debian-cloud 或 ubuntu-os-cloud。
  • MACHINE_TYPE:新運算執行個體的機型。
  • ZONE:運算執行個體所在的可用區。

就地升級作業系統

如果因為複雜的手動設定而無法重新建立運算執行個體,且必須執行就地升級,請完成這些升級前檢查,並仔細按照發行版本專屬的操作說明操作。

升級前檢查清單

開始就地升級前,請先完成這份檢查清單中的每個步驟:

  1. 執行任何升級指令前,請先拍攝開機磁碟的快照。如果升級失敗,這是主要復原機制。
  2. 將所有現有套件和訪客環境更新至目前 OS 版本可用的最新版本: Cloud de Confiance

    • Debian 和 Ubuntu:sudo apt update && sudo apt dist-upgrade -y
    • 如果是 RHEL、CentOS 和 Rocky Linux:sudo dnf upgrade -y
    • 適用於 SLES:sudo zypper update

    確認 google-guest-agent 和 google-oslogin 套件已啟用:

    sudo systemctl status google-guest-agent
    
  3. 在運算執行個體上啟用互動式序列控制台,以便在升級期間 SSH 或網路停止運作時,進行疑難排解及登入:

    gcloud compute instances add-metadata INSTANCE_NAME \
        --metadata=serial-port-enable=TRUE \
        --zone=ZONE
    

    更改下列內容:

    • INSTANCE_NAME:運算執行個體的名稱。
    • ZONE:運算執行個體所在的可用區。

    詳情請參閱「與序列控制台互動」。

  4. 如果您使用 OS 登入或由訪客代理程式管理的安全殼層金鑰,請為具有管理員權限的本機使用者帳戶設定密碼 (例如使用 sudo passwd USERNAME),這樣一來,如果升級期間暫時無法使用 OS 登入,您就能透過序列埠控制台登入。將 USERNAME 替換為本機使用者帳戶名稱。

  5. 確認根分區 / 和啟動分區 /boot 有足夠的可用空間 (建議至少 5 GB),可供下載及解壓縮新套件:

    df -h / /boot
    
  6. 確認安全性、備份或監控的第三方代理程式 (包括 Google Cloud Ops Agent) 支援目標作業系統版本。

就地升級程序

下列各節提供常見作業系統的高階工作流程。升級前,請務必參閱作業系統的官方升級文件。

Debian

您可以升級 Debian,但只能升級至下一個主要版本。請勿略過主要版本,例如先將 Debian 11 升級至 12,再將 Debian 12 升級至 13。

  1. 更新現有的 Debian 套件存放區:

    sudo apt update && sudo apt upgrade -y && sudo apt dist-upgrade -y
    
  2. 在 /etc/apt/sources.list 和 /etc/apt/sources.list.d/ 中更新套件來源,方法是將目前的發布版本代號 (例如 bullseye) 替換為目標發布版本代號 (例如 bookworm)。確認 Cloud de Confiance 套件存放區網址 與新版本相符。

  3. 執行最低升級,更新核心封裝工具:

    sudo apt update
    sudo apt upgrade --without-new-pkgs -y
    
  4. 執行完整發行升級:

    sudo apt full-upgrade -y
    
  5. 確認 google-guest-agent 已啟用:

    sudo systemctl enable --now google-guest-agent
    
  6. 重新啟動運算執行個體:

    sudo systemctl reboot
    

Ubuntu

如要在 Ubuntu 上管理 LTS 到 LTS 的升級,請使用 do-release-upgrade 工具。

  1. 更新所有目前的套件:

    sudo apt update && sudo apt dist-upgrade -y
    
  2. 安裝更新管理員的核心套件:

    sudo apt install update-manager-core -y
    
  3. 啟動版本升級工具:

    sudo do-release-upgrade
    
  4. 按照互動式提示操作,確認存放區更新和套件取代作業。如果系統提示您設定檔已修改,請仔細檢查差異,再覆寫設定檔。

  5. 系統提示時,請重新啟動運算執行個體。

RHEL

如要在 RHEL 主要版本之間升級,請使用支援的 Red Hat leapp 公用程式。

  1. 確認 Red Hat 訂閱狀態,並確保運算執行個體連線至 Compute Engine Red Hat Update Infrastructure (RHUI)。
  2. 安裝 Leapp 公用程式和包含遷移資料的套件。
  3. 執行升級前評估:

    sudo leapp preupgrade
    
  4. 查看 /var/log/leapp/leapp-report.txt中的報表,並解決 Leapp 發現的所有阻礙問題。

  5. 執行升級:

    sudo leapp upgrade
    
  6. 重新啟動執行個體,讓 Leapp 在獨立環境中執行 OS 升級:

    sudo reboot
    

SLES

如要在 SLES 上執行主要版本服務套件遷移作業和發布升級,請使用 zypper:

  1. 更新現有系統:

    sudo zypper patch
    
  2. 執行 zypper migration 進行線上遷移,或按照發行版本升級工作流程,使用 zypper dup (如 SLES 升級說明文件中所指定)。

Windows

對於 Windows Server 運算執行個體,您可以使用安裝媒體搭配 Compute Engine 大量授權和 PowerShell 指令碼,自動升級,不需手動介入。

如要在 Windows Server 上執行就地升級,請按照教學課程執行 Windows Server 就地升級。

自動管理次要更新的修補程式

區分 OS 主要版本升級與例行性子版本更新和安全性修補程式。如要定期維護軟體、更新套件及修補 CVE,請使用 VM 管理員修補程式,自動在整個運算執行個體機群中部署修補程式。

請按照下列最佳做法自動管理修補程式:

  • 使用標籤整理執行個體:使用中繼資料指派標籤,例如 env:dev、env:prod 和 tier:frontend,針對特定群組的運算執行個體套用修補程式。
  • 逐一部署可用區:在不同可用區和區域交錯執行修補程式工作。在正式環境中,請勿同時對所有可用區套用修補程式工作。
  • 使用修補前和修補後指令碼:設定修補前指令碼,安全地排空連線或暫停服務,並設定修補後指令碼,在將執行個體恢復服務前執行健康狀態檢查。
  • 監控修補程式法規遵循狀態:使用Cloud de Confiance 控制台中的 VM 管理員資訊主頁,追蹤修補程式法規遵循狀態,以及整個運算執行個體機群的安全漏洞狀態。

詳情請參閱「建立修補工作」。

升級後的驗證和疑難排解

升級完成後,請執行下列驗證步驟:

  1. 確認 SSH 或 RDP 連線正常。
  2. 確認客體代理程式和 OS 登入服務已啟用,且回報的狀態正常:

    sudo systemctl status google-guest-agent
    sudo systemctl status google-oslogin-cache
    
  3. 確認運算執行個體可以查詢執行個體中繼資料伺服器:

    curl -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/id
    
  4. 確認應用程式服務已啟動,且負載平衡器的健康檢查回報執行個體狀態良好。

排解連線中斷問題

如果就地升級後,您無法透過 SSH 或遠端桌面協定存取運算執行個體,請完成下列疑難排解步驟:

  1. 檢查控制台記錄,找出核心恐慌、服務啟動期間的錯誤,或網路初始化期間的失敗情形:

    gcloud compute instances tail-serial-port-output INSTANCE_NAME \
        --zone=ZONE
    
  2. 如果您在升級前啟用互動式序列主控台,請直接連線至終端機:

    gcloud compute connect-to-serial-port INSTANCE_NAME \
        --zone=ZONE
    

    使用本機使用者憑證登入,透過 journalctl -xe 檢查系統記錄,然後重新啟動網路或 google-guest-agent 服務。

    更改下列內容:

    • INSTANCE_NAME:要排解疑難的運算執行個體名稱。
    • ZONE:運算執行個體所在的可用區。
  3. 如果作業系統無法啟動或復原,請從升級前建立的快照建立新的永久磁碟磁碟區,然後將其做為運算執行個體的開機磁碟。如需詳細的復原步驟,請參閱「將快照還原至新磁碟」。

後續步驟