首页>云>正文

从硬件冗余到期望状态:云与混合基础设施高可用重构

Feng 65 阅读 云

硬件冗余那套方法论没有错,只是适用边界在收缩。双机热备、SAN 双控、专用负载均衡,这些手段依然能处理物理层故障。问题在于,云与混合环境里的故障单位已经换了。

一台服务器宕掉,编排系统几秒内补一个副本。可一次错误的滚动发布、一条过期的证书、一个被配额卡住的命名空间,能让整个自愈机制集体失灵。继续按”多买一台设备”的思路对冲,等于在为错误的故障模型付钱。

故障域迁移后冗余单位必须重算

传统 HA 的假设很朴素:故障来自单台机器、单块盘、单条链路,所以冗余单位是设备。云上这个假设不成立。可用区、区域、控制平面、DNS 解析、证书生命周期、配额上限,任何一个出问题,影响面都远超单台设备。

混合架构进一步放大了这个错位。本地数据中心、私有云、公有云三套环境,硬件型号、网络路径、虚拟化层、API 语义全不一致。厂商打包的”整体高可用方案”往往只在自家栈内自洽,跨云就退化成手工运维。成本结构也在推着人走:硬件冗余的边际成本是线性的,多一个 9 就多一套设备一份维保;软件方法的边际成本接近一次性工程投入,同一套编排能力能复用到几十个服务上。

真正的驱动力在这里,不在技术时髦。

五个支柱的依赖顺序比清单本身重要

把高可用当软件问题解,实现路径可以拆成五块,但它们不是并列的工具清单,有先后依赖。

声明式配置与不可变基础设施是地基。系统该是什么状态写成配置,变更靠重建而非原地改。实例从此不是需要保护的对象,随时可替换。高可用的目标从”保住这台机器”变成”保证期望状态被持续满足”。

编排与自愈建立在地基之上。Kubernetes 的核心能力不是部署,是持续调谐:期望状态和实际状态不一致就自动纠正。副本数、存活探针、就绪探针、Pod 驱逐与重调度,共同构成软件层自愈回路。多集群编排把这条回路延伸到跨环境边界。

这里有个版本断层必须提前处理。Kubernetes 1.24 起内置 dockershim 被移除,节点运行时切到 containerd 后,kubelet 的探针执行路径和镜像拉取行为都有差异,旧集群升级时若节点运行时不一致,会出现探针误判、Pod 反复重启。升级前先在每个节点跑一遍运行时校验:

crictl info
crictl images
systemctl status containerd

确认所有节点的容器运行时统一为 containerd 且版本在兼容矩阵内,再动控制平面。跳过这步,自愈回路会在最不该出问题的时候抖动。

流量编排是多活架构的一等公民。切换逻辑从专用负载均衡设备挪到服务网格、Ingress 控制器和 DNS 策略上,好处是策略可版本化、可测试、可回滚,坏处是它变成了代码,需要 review。

混沌工程负责验证。冗余设计最大的毛病是从未被验证过。主动注入实例终止、网络延迟、依赖不可用,把”我们以为能扛住”变成”我们验证过能扛住”。这是软件方法相对硬件方法最本质的优势:可测试性。

可观测性是输入信号。没有指标、日志、链路追踪,自愈就是盲目的。它回答三个问题:当前是否降级、降级是否被用户感知、自愈动作是否生效。

混沌实验的通过标准要量化

混沌工程最容易做成表演:注入一个故障,看服务没挂,宣布成功。这种结论不可复现,也说明不了韧性水平。

判定口径应该落在 SLO 上。实验期间观察错误预算消耗速率,而不是单次请求成功率。用 Prometheus 查询示例:

sum(rate(http_requests_total{job="api",code=~"5.."}[5m]))
/
sum(rate(http_requests_total{job="api"}[5m]))

把这个比例和该服务的 SLO 阈值对照,实验窗口内错误预算消耗速率不超过基线的一定倍数,才算通过。单次成功率好看但错误预算被快速烧穿的实验,结论是失败。稳态假设必须写成可查询的表达式,实验才有工程价值。

控制平面会自锁,这是被低估的风险

软件方法把高可用从数据平面挪到了控制平面,但控制平面自己也会坏。API Server、配置仓库、密钥管理、CI/CD 流水线,任一环节出问题,自愈就变成自锁。

一个典型路径:etcd 和 API Server 同节点部署,磁盘 IO 饱和后 etcd 写入延迟飙升,API Server 调谐停滞,控制器无法收敛,Pod 该重建的重建不了。表面看是业务故障,根因在控制平面。规避手段是把 etcd 独立部署,并对磁盘延迟单独设告警,别和业务指标混在一个看板里。

隐含前提很明确:控制平面必须比它管理的负载更可靠。这条经常被跳过。

复杂度也没有消失,只是从机房搬进了代码仓库。YAML 层级、策略交互、版本兼容矩阵,这些隐性复杂度对团队工程能力有硬要求。能力不够,软件方法反而制造新的故障源。

混合环境的一致性目前没有优雅解。多数企业实际走的是分层策略:编排层尽量统一,网络和存储层接受差异,用流量编排屏蔽底层不一致。这是务实妥协,不是终局。

责任转移才是这次模型迁移的实质

软件定义高可用不是更便宜的硬件冗余,是责任转移。企业把可靠性责任从厂商手里收回,自己承担。这既是机会也是门槛。

衡量标准跟着变:从”买了多少冗余”转向”故障注入后多久恢复”。组织形态上,平台工程会承接这件事,把高可用能力封装成内部开发者平台的自带能力,而不是让每个业务团队各写一套。

AI 和 LLM 在运维侧的介入,短期更可能落在异常检测和根因辅助,而不是直接接管自愈决策。自愈动作代价太高,可解释性仍是硬约束。

实现建议只有一条:别想着一次性替换所有硬件冗余。先在可观测性和声明式配置上打底,再引入编排自愈,最后用混沌工程验证。硬件冗余处理物理故障,软件方法处理逻辑故障,两者是分工,不是替代。高可用来自对故障模型的准确理解,不来自冗余数量的堆叠。

ID:6785

Feng
这位作者很神秘,还没有填写简介。