为节点规划原地 OS 升级

集群管理员可以使用此检查清单,为在非 Alauda OS 上由 创建的业务集群节点规划原地操作系统升级(集群类型为 On-Premises)。请在更改操作系统之前和之后完成 检查。

适用范围和支持边界

请在维护时段内,将此检查清单与操作系统提供商支持的升级操作步骤配合使用。升级任何节点之前,请根据 支持矩阵确认目标操作系统和内核。此检查清单不保证支持所有操作系统升级路径。

适用范围和限制

仅在满足以下所有条件时使用此操作步骤:

  • 集群是由 在非 Alauda OS 上创建的业务集群。
  • 你可以登录目标节点并管理节点操作系统。
  • 你拥有平台管理员权限、kubectl 管理员权限,以及每个目标节点的 SSH 或控制台访问权限。
  • 你可以在操作系统升级之前排空目标节点上的工作负载 Pod。

以下集群类型不适用此操作步骤:

  • 节点运行 Alauda OS 的集群。请通过使用新镜像替换节点来应用操作系统更改。
  • 云提供商管理节点或控制平面操作系统的托管云 Kubernetes 集群。
  • 无法登录节点或控制平面节点的导入集群。

升级前

在更改任何节点的操作系统之前,完成以下检查。

步骤 1:确认目标操作系统和内核

确认目标操作系统版本、内核版本、内核来源和 CPU 架构均在支持范围内。有关当前支持矩阵和已知限制,请参阅支持的操作系统和内核版本。

在维护时段之前应用以下规则:

  • 操作系统的主版本和次版本必须与支持矩阵匹配。
  • 核心内核版本必须与支持矩阵匹配。只有构建后缀可以不同。
  • 内核必须是操作系统供应商提供的官方内核。
  • 不支持 Ubuntu HWE 内核以及第三方或自定义编译的内核。
  • 如果目标版本不在支持矩阵中,请在升级之前联系技术支持确认兼容性。

步骤 2:检查冲突软件包

在原地操作系统升级期间,操作系统软件包管理器可能会安装或覆盖容器运行时、Kubernetes 或容器网络二进制文件。升级之前,请检查并解决与 组件冲突的软件包。有关软件包列表和命令,请参阅移除冲突的软件包。

如果发现冲突的软件包,请在卸载这些软件包之前准备应用迁移计划并备份受影响的数据。

步骤 3:记录当前节点基线

记录操作系统升级前的节点状态。节点升级后,使用这些记录进行比较。

现在在节点上运行步骤 2:验证基础节点配置中的 Base node configuration check 代码块,并保留其输出。该代码块会捕获 SELinux 模式、AppArmor 和主机防火墙状态,以及正在使用的防火墙规则。升级后的检查会与此输出进行精确比较,因此没有此输出的节点无法完成验证。

同时记录运行时和节点组件版本:

containerd --version
runc --version
crictl --version
kubelet --version

另外,记录操作系统升级过程可能会更新的关键节点配置文件,例如 /etc/resolv.conf、/etc/fstab、systemd 配置文件和容器运行时配置文件。

步骤 4:验证集群容量并排空节点

确认其余节点具有足够的容量来运行从目标节点驱逐的 Pod。然后在操作系统升级之前排空节点。

你可以使用 控制台从节点驱逐 Pod。有关控制台操作,请参阅管理节点。

如果使用 kubectl,请在运行之前与运维团队确认命令选项。例如:

kubectl cordon <node-name>
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data

排空操作不会驱逐由 DaemonSet 管理的 Pod。使用本地存储的工作负载在驱逐后可能会丢失本地数据。继续操作之前,请确认对工作负载的影响。

控制平面节点的其他检查

控制平面节点运行 kube-apiserver、etcd、kube-scheduler 和 kube-controller-manager 等组件。一次升级一个控制平面节点,并在每个节点升级完成后验证集群运行状况。

升级控制平面节点之前:

  • 备份 etcd 数据。有关支持的备份机制和还原注意事项,请参阅 etcd 备份和还原。
  • 确认 etcd 集群运行状况正常,并且在一个控制平面节点不可用期间仍可维持仲裁。
  • 在对控制平面节点执行滚动维护时,确认集群至少有三个控制平面节点。
  • 如果可能,先在工作节点上验证操作步骤,然后再继续处理控制平面节点。

检查控制平面运行状况时,可以参考以下命令:

kubectl get nodes
kubectl get pods -n kube-system | grep -E "etcd|apiserver|scheduler|controller"

如果在控制平面节点上使用 etcdctl,请使用环境中的证书路径:

ETCDCTL_API=3 etcdctl member list \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  --write-out=table

执行操作系统升级

按照操作系统供应商针对目标版本提供的支持升级操作步骤执行升级。具体的软件包命令、软件仓库配置和重启要求由操作系统供应商以及组织的操作系统维护策略决定。

在操作系统升级期间:

  • 不要有意安装与 组件冲突的容器运行时、Kubernetes 或容器网络软件包。
  • 保留节点网络配置、DNS 配置、时间同步配置和 systemd 服务配置,除非供应商操作步骤要求进行更改。
  • 根据供应商操作步骤的要求重启节点。
  • 在所有升级后检查通过之前,保持节点不可调度。

升级后

操作系统升级和重启完成后,在每个节点上执行以下检查。

步骤 1:确认操作系统和内核

验证节点运行的操作系统和内核版本是否符合预期。

cat /etc/os-release
uname -r

将输出结果与受支持的矩阵和已批准的维护计划进行比较。

步骤 2:验证基本节点配置

验证操作系统升级未还原所需的节点设置。

echo "=== Base node configuration check ==="

# SELinux must be disabled. Record the value so that you can confirm the
# operating system upgrade did not turn it back on.
if command -v getenforce >/dev/null; then
  echo "SELinux: $(getenforce)"
else
  echo "SELinux: getenforce not available on this system"
fi

# AppArmor must be disabled. A missing unit means the system has no AppArmor at
# all, which is not the same as AppArmor being present but turned off.
if systemctl list-unit-files --no-legend apparmor.service 2>/dev/null | grep -q .; then
  echo "AppArmor: enabled=$(systemctl is-enabled apparmor.service 2>&1) active=$(systemctl is-active apparmor.service 2>&1)"
else
  echo "AppArmor: unit not present on this system"
fi

# firewalld. Same distinction as AppArmor.
if systemctl list-unit-files --no-legend firewalld.service 2>/dev/null | grep -q .; then
  echo "firewalld: enabled=$(systemctl is-enabled firewalld.service 2>&1) active=$(systemctl is-active firewalld.service 2>&1)"
  firewall-cmd --list-all 2>/dev/null || true
else
  echo "firewalld: unit not present on this system"
fi

# ufw. The unit reports active (exited) once it has ever run, so the unit state
# does not show whether the ruleset is enabled. Only ufw status does.
if command -v ufw >/dev/null; then
  ufw status verbose
else
  echo "ufw: not installed"
fi

# Swap must be disabled.
swapon --show
free -h | grep Swap

# /tmp must not be mounted with noexec.
mount | grep " /tmp "

# DefaultTasksMax must be infinity.
systemctl show --property=DefaultTasksMax

如果操作系统升级后启用了 swap,请根据操作系统策略将其禁用,并从 /etc/fstab 中移除 swap 条目。

必须禁用 SELinux 和 AppArmor。如果操作系统升级重新启用了其中任何一个,请根据操作系统策略再次将其禁用。请参阅必须禁用 SELinux 和 AppArmor 的原因。

主机防火墙必须恢复到集群安装时的状态。如果集群安装时禁用了主机防火墙,而操作系统升级重新启用了它,请再次将其禁用。如果集群运行时启用了主机防火墙,请确认升级后防火墙仍处于启用状态且规则完整。有关所需配置和端口列表,请参阅强化节点安全配置和通信矩阵。

步骤 3:验证运行时和节点组件版本

将运行时和节点组件版本与升级前的记录进行比较。

containerd --version
runc --version
crictl --version
kubelet --version

然后验证 containerd 正在运行:

systemctl status containerd

如果任何二进制文件被操作系统软件包覆盖,请停止维护操作,并在继续处理其他节点之前联系技术支持。

步骤 4:验证时间同步和 DNS

验证时间同步和 DNS 配置未因操作系统升级而发生更改。

date
timedatectl
cat /etc/resolv.conf

节点之间的时间偏差不得超过 10 秒。如果偏差大于 10 秒,请在节点上重启工作负载之前同步时间。

步骤 5:重启 kubelet 并验证节点恢复

操作系统升级完成且基本节点检查通过后,重启 kubelet。

systemctl daemon-reload
systemctl restart kubelet
systemctl status kubelet

等待节点返回 Ready 状态。

kubectl get node <node-name> --watch

节点运行状况正常后,恢复调度。

kubectl uncordon <node-name>

你也可以从 控制台恢复调度。有关控制台操作,请参阅管理节点。

步骤 6:验证工作负载恢复

恢复调度后,验证节点状态和工作负载放置情况。

kubectl get nodes
kubectl get pods -A -o wide | grep <node-name>

然后验证受节点排空影响的业务服务。只有在当前节点及相关服务运行状况正常后,才能继续处理下一个节点。

已知高风险场景

症状可能原因检查方法建议操作
containerd 无法启动操作系统升级覆盖了 运行时二进制文件将 containerd --version 与升级前的记录进行比较停止维护并联系技术支持
节点持续处于 NotReady 状态kubelet、容器运行时、CNI、DNS 或节点网络配置发生了变化检查 systemctl status kubelet、systemctl status containerd 和节点事件恢复已更改的配置,或联系技术支持
集群组件报告 TLS 错误升级期间或升级后节点时间发生偏差检查 timedatectl,并比较各节点上的 date同步时间后再继续
DNS 解析失败/etc/resolv.conf 被覆盖检查 cat /etc/resolv.conf恢复已批准的 DNS 配置
kubelet 因安全策略错误而失败操作系统升级重新启用了 SELinux 或 AppArmor运行 Base node configuration check 块,并将其与升级前的记录进行比较根据操作系统策略再次禁用该机制;如果操作系统要求,请重启节点。如果错误仍然存在,请联系技术支持
取消封锁后无法调度工作负载节点仍处于运行状况异常、带有污点或资源受限的状态检查 kubectl describe node <node-name>解决节点状况问题后再继续

操作检查清单

在维护窗口期间使用此检查清单,并在升级后保留已完成的记录。

阶段项目负责人状态
升级前确认目标操作系统和内核位于支持矩阵中
升级前确认内核为供应商提供的官方内核
升级前检查并解决冲突的软件包
升级前记录 containerd、runc、crictl 和 kubelet 版本
升级前记录 DNS、时间同步、/etc/fstab 和运行时配置
升级前记录 SELinux、AppArmor 和主机防火墙是否已启用,并记录当前使用的防火墙规则
升级前确认集群有足够的容量来承载被驱逐的工作负载
升级前排空目标节点并确认对工作负载的影响
仅控制平面节点备份 etcd 数据
仅控制平面节点确认 etcd 健康状态和仲裁状态
升级执行操作系统供应商支持的升级操作步骤
升级如果供应商操作步骤要求,重启节点
升级后确认操作系统和内核版本
升级后确认 SELinux 和 AppArmor 已禁用
升级后确认交换分区已禁用
升级后确认主机防火墙与集群安装配置一致
升级后确认 /tmp 未使用 noexec 挂载
升级后确认 DefaultTasksMax 为 infinity
升级后确认运行时和节点组件版本未被覆盖
升级后确认 containerd 和 kubelet 状态正常
升级后确认节点之间的时间偏差不超过 10 秒
升级后确认 DNS 配置正确
升级后确认节点处于 Ready 状态
升级后恢复节点上的调度
升级后确认工作负载和业务服务运行状况正常