posted in DevOps 

一般定义

平台能为产品团队提供可复用能力支撑(赋能),它是一个操作环境,可以让产品团队在其上把产品特性快速交付到客户手中。ThoughtWorks开发出一个五维模型来描述平台的重要特征:

  • 支持端到端交付的基础设施
  • API和架构自愈
  • 提供自助服务
  • 支持实验的基础设施
  • 提供用户触点技术

先来看看什么不是一个平台

按技术领域划分团队

有的企业花大力气构建自动化能力,但是往往会根据技术划分团队。比如,负责中间件管理的团队,负责操作系统管理的团队,负责DB管理的团队,负责LB管理的团队,另外还会有一个专门负责自动化的效能团队,往往能力上只是负责编排。

这些团队,每个都在自己的管理架构下有独立的工作方式,每个团队都在各自的技术领域范围内实现高效率管理,集中专业化,外包非差异化功能,应用治理,并降低成本。但就是没人去衡量客户需求端到端的交付效率。

一个客户需求的交付往往穿越多个团队,端到端交付效率极差。

时间长了,产品和基础设施的质量逐渐下降。环境和配置上会出现很多细微的不一致。产品团队不得不降低交付速度,减少一次交付包含的特性。甚至不敢去做任何改动较大的提升动作或重构动作,而这些动作本来是用来改善问题的。

彼此依赖的待办事项

一个特性的交付往往在一个团队内无法独立完成,于是一个团队的待办事项会依赖其他团队的待办事项,彼此耦合。而往往不同团队有不同的目标,各自的待办事项优先级不同。于是一个团队的待办事项无法落地的原因往往就是依赖另一个团队的待办事项,而另一个团队迟迟不能完成。这就造成了团队之间的隔阂和互相之间的不信任,甚至扯皮、推诿,丧失责任感和创造力。最终使端到端交付的效率变得极低。

显然,一个好的平台的一个重要特征是,他必须能减少待办事项耦合。该平台必须能够支持自助服务。

什么是一个平台

AWS就是一个平台。

如何构建一个平台

  1. 调整组织架构,给每个产品团队增加5%的运维职责,节省平台团队200%的运维职责。"you build it, you run it."
  2. 平台自己也要承担从开发到运行的所有责任,避免平台自身的开发团队只管开发,运维团队管运行。同样要坚守:"you build it, you run it."
  3. 划清平台和产品团队的职责边界,产品团队负责自己产品的构建,部署,监控等;平台团队负责平台的构建,部署,监控等;设计抽象,对外暴露自助服务;平台不应该关心它上面跑的是什么业务,产品不应该关心平台使用的技术。
  4. 除了提供API之外,还要提供文档,guideline, template code, on call, 布道等。
  5. 最初落地时不知道需要提供哪些能力,可以从产品团队了解需求,从解决最迫切的需求开始。
posted in DevOps 

什么是Mutable Infrastructure

传统物理服务器时代,企业倾向于对服务器做修改以实现商业目的。如,更换配件,原地更新软件包(upgrade app),修改配置(update configuration),打补丁(ad-hoc fixes),微调(tweaks)。这些操作渐渐把一个服务器变得独一无二(SnowflakeServer)。这使得它难以被替换,难以维护,难以复制。你越来越无法理解其上面的某个配置这样配的原因。而这一切之所以会这样发展,是因为物理服务器时代服务器更新的难度大,成本高,周期长。所以企业在服务器更新上发展出很多技术,但都是围绕着原地升级的思路发展的。

什么是Immutable Infrastructure

到了虚拟化时代,虚拟服务器变得可以被轻易替换(disposable),整个服务器可以在秒级被重新构建。这使得使用服务器被整体替换的方式更新服务器比原地升级服务器来的更划算。服务器一旦部署完就不再被修改,服务器需要升级时,是基于一个基线重新构建然后替换原有服务器。这使得服务器的复制,替换变得轻而易举。这种服务器也叫PhoenixServer。这样的基础架构无疑更加健壮,可维护。

如何实现Immutable Infrastructure

  • 禁止人工登录服务器做任何修改
  • 使用虚拟化技术
  • 服务器可以基于镜像快速构建,
  • 服务器的生命周期管理由软件自动化实现
    • 服务器目标状态由文档定义
    • 文档由VCS管理
    • 服务器更新由自动化工具基于VCS里文档的更新触发,并最终实现目标状态
  • 一个无状态,变化频繁的应用层
  • 一个数据持久层
    • 日志中心,记录服务器的每次变更
    • 外部数据存储,无状态应用层服务器被频繁替换,数据必须存储在外部
  • 开发和运维无间合作(DevOps)
  • 使用混沌工程工具验证服务的健壮性

理想很丰满,现实很骨感

如果在物理服务器上利用严格规范和自动化工具是否能打造Immutable Infrastructure呢?理论上可以,但现实是物理服务器很多场景下难以实现批量统一的更新,因为物理服务器太大,上面跑的东西太多。
那么是不是使用了虚拟化技术,就一定能实现Immutable Infrastructure?答案是否定的。国内很多大厂,甚至是云计算提供商,其内部服务虽然使用了虚拟机,甚至容器,但是其运维范式仍然遵循传统原地升级模式,仍然会登录到虚拟机或容器内部做一些修改,或者只有部分技术栈(如服务软件包,基础软件包)实现了基线化管理,而其他技术栈(如操作系统配置,网络配置)还是通过其他途径手动升级,整体效果仍然和传统Mutable Infrastructure一样。举个例子,应用扩容一台机器,而防火墙没有同步更新,导致新扩容的服务器和其他服务器之间网络不通,需要人工修改网络配置才能打通网络。
所以说,真正的Immutable Infrastructure的落地,是依赖强有力的运维能力的,而这样的运维能力又依赖配套的组织架构关系和DevOps文化和极强的规范化。