DevOpsKubernetesInfrastructureCloud Native

临时基础设施 - 为什么短生命周期是好事

Lukas Niessen··原文链接
收录于 2026/5/27 23:39:53

什么是 Ephemeral(临时)基础设施?

比喻:

  • 公寓 → 长期居住,自己维护,坏了自己修
  • 酒店房间 → 短暂停留,离开后打扫干净,恢复初始状态

Ephemeral 基础设施 = 把服务器、容器当作酒店房间,而不是公寓。

临时资源示例

类型说明
Kubernetes Pods随时可能被杀死替换,存活数小时到数周
CI/CD Runners每个任务一个新环境,任务结束即销毁
Lambda Functions执行完就消失(或回收)
Auto-scaling Instances流量高峰出现,低谷消失,是"牲口"不是"宠物"

为什么短生命周期更好?

1. 强制无状态设计

坏(有状态):

Pod 内存存储用户会话 → Pod 崩溃 → 所有会话丢失 → 用户登出

好(无状态):

Pod 会话存 Redis → Pod 崩溃 → 新 Pod 启动 → 用户保持登录

临时基础设施强迫你做正确的事。

2. 自动自愈

传统方式临时方式
服务器崩溃 → SSH 登录 → 调试数小时 → 也许修好Pod 崩溃 → K8s 检测 → 启动新 Pod → 秒级完成

不需要"修复",直接替换。

3. 消除配置漂移

  • 传统服务器:三年前有人"临时"装了个包,现在没人知道为什么
  • 临时基础设施:每次都从相同镜像启动,无累积变化,无神秘配置

4. 扩展变得简单

  • 需要更多容量?启动更多 Pod
  • 需要减少?杀掉一些 Pod
  • 扩展只是一个数字

数据怎么办?

Pod 是临时的,数据不是:

volumes:
- name: data
  persistentVolumeClaim:
    claimName: my-pvc  # 数据在这里,不在 Pod 里
  • Pod 可随时杀死重建
  • 数据在 PersistentVolume,持久存在

Pod 被替换的场景

  • 滚动更新(部署新版本)
  • 节点维护(排空节点)
  • 资源压力(内存不足)
  • 健康检查失败
  • 缩容

这在生产环境 constantly 发生,而且这正是你想要的。

数据库怎么办?

数据库天生有状态,不能直接杀掉重建。

但可以应用临时原则:

组件策略
Database Pod临时 → PersistentVolume 持久
托管数据库RDS/Cloud SQL,抽象掉服务器
只读副本可以是临时的

Ephemeral vs Immutable

概念定义示例
Ephemeral设计上短生命周期CI runner 存在 2 分钟
Immutable创建后不可修改Docker 镜像、版本化配置文件

不同概念,但实践中通常一起出现:

  • Pod 只存活几小时 → 为什么还要修改它?
  • 自然推动你构建新镜像并重新部署

实践对比:Web 应用

传统(长生命周期):

部署 EC2 → 安装应用 → 配置 → 运行数月 → 打补丁 → SSH 调试 → "别碰它,能跑"

临时方式:

构建 Docker 镜像 → 推送到 Registry → K8s 拉取镜像启动 Pod → 
部署新版本时旧 Pod 死,新 Pod 生 → 出问题?重启 Pod → 无需 SSH

代价

代价说明
启动时间应用启动需 5 分钟?问题。需优化启动速度
调试更难Pod 崩溃后无法 SSH,需提前做好日志和可观测性
有状态负载复杂数据库等需要更仔细的设计

核心结论

现代系统默认已部分临时化:

  • Kubernetes 集群 → 临时 Pod
  • CI/CD 流水线 → 临时 Runner
  • Serverless 函数 → 天生临时
  • Auto-scaling 组 → 临时实例

问题不是"是否使用临时基础设施",而是"多少应该是临时的"。

作者建议:

让一切都可以是临时的,除了必须有状态的部分(数据库、消息队列等)。即使它们,也让计算临时,只保留存储持久。

与证书撤销的关联

这篇和 X.509 证书撤销文章形成了有趣的呼应——短生命周期证书和临时基础设施都是用"缩短生命周期"来解决信任/稳定性问题。