本文档介绍了在 Compute Engine 实例上升级操作系统的最佳实践和策略。了解如何使用不可变的基础设施、重新创建实例或就地工作流来升级主要操作系统版本,以及如何自动执行常规安全修补。
当操作系统版本接近支持终止 (EOS) 或生命周期结束 (EOL) 时,您必须升级到受支持的操作系统版本,才能继续获得安全更新、软件兼容性和 Cloud de Confiance by S3NS 平台集成。如需详细了解支持阶段,请参阅操作系统生命周期。
就地升级主要操作系统版本的风险
如果您对正在运行的计算实例执行操作系统重大就地升级(例如将 Debian 12 升级到 13、RHEL 9 升级到 10 或 Ubuntu 24.04 升级到 26.04),则会在云环境中引入重大运营风险。与本地物理服务器不同,您的计算实例依赖于客机环境的专用软件包,才能与虚拟机监控程序和 Compute Engine 元数据服务器进行通信。
当您就地升级操作系统时,可能会遇到以下故障模式:
- SSH 和 RDP 连接丢失:网络服务、访客级防火墙规则(例如 ufw 或 firewalld)或 SSH 精灵设置的配置格式可能会在操作系统版本之间发生变化,从而切断远程管理员权限。
- 访客环境中断:
google-guest-agent和google-oslogin软件包用于管理 SSH 密钥、用户账号、网络接口以及与元数据的同步。如果在分发升级期间软件包代码库或依赖项中断,访客代理可能会停止运行,从而导致无法进一步登录或配置网络。 - 与存储和内核驱动程序不兼容:对内核、
initramfs或磁盘控制器(例如 virtio-scsi 或 NVMe)的驱动程序所做的更改可能会导致启动失败,或阻止计算实例识别所连接的 Persistent Disk 卷。 - 代码库配置不一致:操作系统供应商经常会弃用或替换旧版软件包代码库和签名密钥,这可能会导致软件包管理器在升级过程中失败,并使操作系统处于无法恢复的半安装状态。
为避免这些风险,请使用不可变的基础设施模型,而不是在生产计算实例上就地升级主要操作系统版本。
选择合适的升级策略
根据工作负载是无状态工作负载还是有状态工作负载,选择以下策略之一:
| 策略 | 建议用于 | 停机风险 | 回滚机制 |
|---|---|---|---|
| 不可变的基础设施 | 无状态工作负载、代管式实例组 (MIG)、微服务、容器主机 | 通过滚动替换实现零停机时间 | 将实例模板还原为较早的映像 |
| 重新创建具有永久性磁盘的 Compute 实例 | 有状态独立计算实例、附加了辅助存储空间的数据库、旧版应用主机 | 最低限度,但有计划的维护窗口 | 将磁盘重新挂接到原始计算实例或恢复快照 |
| 操作系统就地升级 | 无法自动执行或提取本地配置的独立计算实例 | 高,需要停机和手动恢复规划 | 从 Persistent Disk 快照恢复 |
不可变基础架构
升级操作系统最安全可靠的方法是使用不可变的基础设施模型。您无需修改正在运行的计算实例,而是可以基于更新后的公共或自定义操作系统映像构建新的计算实例,并替换旧版实例。
如果您的工作负载在代管式实例组 (MIG) 中运行,则可以自动执行此发布,而不会造成服务中断。
创建更新后的映像
- 从支持的操作系统详细信息列表中选择最新的公开操作系统映像,或使用 Image Builder 或 Packer 或 Ansible 等自动化工具创建自定义基础映像。
- 验证您的应用和依赖项是否已在非生产测试环境中成功安装并运行在新版操作系统上。
- 创建自定义操作系统映像或引用新的公共映像系列。如需了解详情,请参阅映像系列最佳实践。
创建更新后的实例模板
创建引用更新后的操作系统映像的新实例模板:
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:目标操作系统的映像系列,例如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 的计算实例
如果您运行有状态的独立计算实例,其中应用将配置和数据存储在 Persistent Disk 卷上,那么您可以通过重新创建具有全新启动磁盘的计算实例来升级操作系统,同时保留数据磁盘。
备份所有磁盘
在修改基础架构之前,请创建启动磁盘和所有已挂接的 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)上,而不是位于启动磁盘上。
创建替代计算实例
停止旧版计算实例,以确保数据保持一致:
gcloud compute instances stop LEGACY_INSTANCE_NAME --zone=ZONE
从旧版计算实例中分离辅助数据磁盘:
gcloud compute instances detach-disk LEGACY_INSTANCE_NAME \ --disk=DATA_DISK_NAME \ --zone=ZONE创建具有目标操作系统版本的新计算实例:
gcloud compute instances create NEW_INSTANCE_NAME \ --image-family=IMAGE_FAMILY \ --image-project=IMAGE_PROJECT \ --zone=ZONE \ --machine-type=MACHINE_TYPE将现有的辅助数据磁盘挂接到新的计算实例:
gcloud compute instances attach-disk NEW_INSTANCE_NAME \ --disk=DATA_DISK_NAME \ --zone=ZONE连接到新的计算实例,装载数据磁盘上的文件系统,然后启动应用服务。
如有必要,请重新分配所有静态外部 IP 地址或 DNS 记录,以指向新的计算实例。
替换以下内容:
LEGACY_INSTANCE_NAME:您要升级的现有计算实例的名称。DATA_DISK_NAME:要分离并重新挂接的辅助 Persistent Disk 卷的名称。NEW_INSTANCE_NAME:新替换计算实例的名称。IMAGE_FAMILY:目标操作系统版本的映像系列,例如debian-13或ubuntu-2604-lts。IMAGE_PROJECT:提供映像的项目,例如debian-cloud或ubuntu-os-cloud。MACHINE_TYPE:新计算实例的机器类型。ZONE:计算实例所在的可用区。
就地操作系统升级
如果您因手动配置复杂而无法重新创建计算实例,并且必须执行就地升级,请完成以下升级前检查,并仔细按照特定于分发的说明操作。
升级前核对清单
在开始就地升级之前,请完成此核对清单中的每个步骤:
- 在运行任何升级命令之前,请先为启动磁盘拍摄快照。如果升级失败,这是您的主要恢复机制。
将 Cloud de Confiance的所有当前软件包和 guest 环境更新为当前操作系统版本可用的最新版本:
- 对于 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
- 对于 Debian 和 Ubuntu:
在计算实例上启用交互式串行控制台,以便在升级期间 SSH 或网络停止工作时进行问题排查和登录:
gcloud compute instances add-metadata INSTANCE_NAME \ --metadata=serial-port-enable=TRUE \ --zone=ZONE替换以下内容:
INSTANCE_NAME:计算实例的名称。ZONE:计算实例所在的可用区。
如需了解详情,请参阅与串行控制台进行交互。
如果您使用 OS Login 或由 Guest 代理管理的 SSH 密钥,请为具有管理员权限的本地用户账号设置密码(例如使用
sudo passwd USERNAME),以便在升级期间 OS Login 暂时不可用时,您可以通过串行控制台登录。 将USERNAME替换为本地用户账号的名称。确保根分区
/和启动分区/boot有足够的可用空间(建议至少 5 GB),以便下载和解压缩新软件包:df -h / /boot
验证用于安全、备份或监控的第三方代理(包括 Google Cloud Ops Agent)是否支持目标版本的操作系统。
就地升级程序
以下部分提供了常见操作系统的简要工作流程。在升级之前,请务必先参阅操作系统的官方升级文档。
Debian
您可以在连续的主要版本之间升级 Debian。请勿跳过主要版本,例如,先将 Debian 11 升级到 12,然后再将 Debian 12 升级到 13。
更新现有的 Debian 软件包代码库:
sudo apt update && sudo apt upgrade -y && sudo apt dist-upgrade -y
通过将当前版本代号(例如
bullseye)替换为目标版本代号(例如bookworm),更新/etc/apt/sources.list和/etc/apt/sources.list.d/中的软件包来源。确保 Cloud de Confiance 软件包代码库网址 与新版本一致。执行最低限度的升级以更新核心打包工具:
sudo apt update sudo apt upgrade --without-new-pkgs -y
运行全面分发升级:
sudo apt full-upgrade -y
验证
google-guest-agent是否处于有效状态且已启用:sudo systemctl enable --now google-guest-agent
重新启动计算实例:
sudo systemctl reboot
Ubuntu
如需在 Ubuntu 上管理从 LTS 到 LTS 的升级,请使用 do-release-upgrade 工具。
更新所有当前软件包:
sudo apt update && sudo apt dist-upgrade -y
安装更新管理器的核心软件包:
sudo apt install update-manager-core -y
启动版本升级工具:
sudo do-release-upgrade
按照互动式提示确认代码库更新和软件包替换。如果系统提示您有配置文件已修改,请仔细查看差异,然后再进行覆盖。
在系统提示时重启计算实例。
RHEL
如需在 RHEL 主要版本之间升级,请使用受支持的 Red Hat leapp 实用程序。
- 验证您的 Red Hat 订阅状态,并确保 Compute Engine 实例连接到 Red Hat Update Infrastructure (RHUI)。
- 安装 Leapp 实用程序和包含迁移数据的软件包。
运行升级前评估:
sudo leapp preupgrade
查看
/var/log/leapp/leapp-report.txt中的报告,并解决 Leapp 发现的所有抑制性问题。执行升级:
sudo leapp upgrade
重新启动实例,以便 Leapp 在隔离环境中执行操作系统升级:
sudo reboot
SLES
如需在 SLES 上执行主要版本 Service Pack 迁移和分发升级,请使用 zypper:
更新现有系统:
sudo zypper patch
运行
zypper migration以执行在线迁移,或按照 SLES 升级文档中指定的zypper dup,遵循分发升级工作流。
Windows
对于 Windows Server 计算实例,您可以使用具有 Compute Engine 批量许可的安装介质和 PowerShell 脚本来自动执行升级,而无需手动干预。
如需在 Windows Server 上执行就地升级,请按照教程执行 Windows Server 的就地升级操作。
针对次要更新自动执行补丁管理
区分重大操作系统版本升级与常规次要更新和安全补丁。为了定期维护软件、更新软件包和修补 CVE,请使用 虚拟机管理器 Patch 自动在整个计算实例舰队中部署补丁。
请遵循以下最佳实践来自动管理补丁:
- 使用标签整理实例:为目标特定计算实例组分配包含元数据的标签,例如
env:dev、env:prod和tier:frontend,以便进行补丁安装。 - 按可用区逐个部署:在可用区和区域之间错开修补作业。切勿在生产环境中同时对所有可用区应用修补作业。
- 使用修补前脚本和修补后脚本:配置修补前脚本以安全地耗尽连接或暂停服务,并配置修补后脚本以在将实例恢复为服务状态之前运行健康检查。
- 监控补丁合规性:使用Cloud de Confiance 控制台中的虚拟机管理器信息中心,跟踪计算实例群组的补丁合规性和漏洞状态。
如需了解详情,请参阅创建修补作业。
升级后验证和问题排查
完成升级后,请执行以下验证步骤:
- 确认 SSH 或 RDP 连接正常。
确保客户机代理和 OS Login 服务处于活跃状态并报告正常状态:
sudo systemctl status google-guest-agent sudo systemctl status google-oslogin-cache
验证计算实例是否可以查询实例元数据服务器:
curl -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/id
确认应用服务已启动,并且负载均衡器的健康检查报告实例运行状况良好。
排查连接中断问题
如果您在就地升级后无法通过 SSH 或 RDP 访问计算实例,请完成以下问题排查步骤:
检查控制台日志,了解是否存在内核崩溃、服务启动期间的错误或网络初始化期间的故障:
gcloud compute instances tail-serial-port-output INSTANCE_NAME \ --zone=ZONE如果您在升级之前启用了交互式串行控制台,请直接连接到终端:
gcloud compute connect-to-serial-port INSTANCE_NAME \ --zone=ZONE使用本地用户凭据登录,使用
journalctl -xe检查系统日志,然后重新启动网络或google-guest-agent服务。替换以下内容:
INSTANCE_NAME:您要排查问题的计算实例的名称。ZONE:计算实例所在的可用区。
如果操作系统无法启动或恢复,请从升级前截取的快照中创建新的 Persistent Disk 卷,并将其作为计算实例的启动磁盘进行挂接。如需了解详细的恢复步骤,请参阅将快照恢复到新磁盘。