【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

避免不完全的云原生(二):人员和流程要素

  • 2021-01-07
  • 本文字数:3713 字

    阅读完需:约 12 分钟

避免不完全的云原生(二):人员和流程要素

本文最初发布于 TheStartup 博客,经原作者授权由 InfoQ 中文站翻译并分享。


注意:这是该系列文章的第 2 部分。你可以点击这里阅读第1部分,或者跳转到第345部分。


在前一篇文章中,我们讨论了云原生的实际含义,并且指出,要从云原生方法中获益,就需要从多个角度来审视它。这不仅与你使用的技术和基础设施所在的位置有关,还与你如何构建解决方案有关。但最重要的也许是,它和你如何组织员工和遵循什么流程有关。在这篇文章以及接下来的两篇文章中,我们将介绍成功迈出云原生第一步的最重要的部分,并从不同的角度进行分析。本系列文章的主题摘要如下图所示:



云原生组件


让我们从最容易被忽视的角度开始——云原生对相关人员及其所在流程的影响。


云原生要素:人员和流程


要想在云原生方法上取得成功,人员组件比其他任何组件都重要。为了实现云原生的业务价值,团队需要能够在业务和 IT 之间快速协调,以一种“低接触”的方式将更改提交到生产环境,并对所交付的内容负责,而且信心十足。任何新技术或现代架构方法都无法凭一己之力实现这一点。团队需要投入精力转向敏捷方法,采用 DevOps 原则和软件生命周期自动化,引入新的角色(例如 SRE),而且,组织必须赋予团队一定程度的自治权。下图展示了云原生方法中人员要素的一些最重要的方面:



云原生要素:人员和流程


这个列表肯定不完整。我们还认为,关于人员,还有其他方面可以提高团队弹性,超出了上面列举的要素,如转向无责备文化,鼓励成长型思维。接下来,我们将对上图中的每一项进行深入探讨。


敏捷方法


云原生基础设施和基于微服务的设计使得开发可快速更改和部署的细粒度组件成为可能。然而,如果我们没有能够用来实现交付并兑现承诺的开发方法,这将毫无意义。敏捷方法使被授权的(去中心化的)团队能够缩短变更周期,更紧密地结合业务需求,其特点如下:


  • 短而有规律的迭代周期

  • 固有的业务协同

  • 数据驱动的反馈


通常,敏捷方法会被拿来与旧有的“瀑布式”方法做对比。传统的瀑布方法会提前收集所有的需求,然后,团队在近乎隔离的状态下工作,直到他们交付最终产品供验收为止。尽管这种方法能够最小化实现团队的障碍,使他们不受变更请求的影响,但是在当今快速变化的业务环境中,最终交付物很可能与当前的业务需求不同步。


敏捷方法使用迭代开发周期,会与业务定期接触,再结合有意义的客户使用数据,可以确保项目始终专注于业务目标。其目的是根据实际的业务需求不断地修正项目的方向。


工作被分解成相对较小的、业务相关的特性,业务可以在每个发布周期中更直接地确定它们的优先级。当他们可以接受没有精确的长期交付计划,但可以确定接下来构建什么时,对业务的真正好处就出现了。


敏捷本身正在成为一个“古老的”术语,和许多术语一样,它已经遭受了近二十年的误用。然而,就目前而言,它也许仍然是对这些方法的最好的概括。

生命周期自动化


除非你缩短将新代码转移到生产环境所花费的时间,否则你无法达到你想要的敏捷程度。如果生命周期流程很慢,那么你的方法多敏捷,或者你设计的组件多轻量化,就都没有什么关系了。此外,如果反馈周期被打破,你就不能实时地对业务需求的变化做出响应。生命周期自动化主要围绕三个关键管道,它们是:


  • 持续集成——构建/测试管道自动化

  • 持续交付/部署——部署、验证

  • 持续采用——运行时更新


下图说明了它们之间的交互关系:



管道自动化(CI/CD)是 DevOps 和敏捷方法的基础


持续集成(CI)意味着经常(“持续”地)向源代码存储库提交更改,并且可以即刻进行自动构建、质量检查、相关代码集成及测试。CI 可以即时为开发人员提供反馈,让他们知道更改与当前代码库是否兼容。我们发现,基于镜像的部署使得构建管道更简单、更一致。此外,更加模块化的、细粒度的、完全解耦的无状态组件的创建简化了自动化测试过程。


CD 既可以表示持续交付,也可以表示持续部署(两个都对,尽管 Jez Humble 的著作让持续交付这个术语流行了起来,它实际上涵盖了这两个过程)。持续交付从 CI 获取输出,并执行将其部署到目标环境所需的所有准备工作,但是不部署,把最后的步骤留在审批之后,以受控的方式手动执行。当环境允许自动向环境中部署时,这就是持续部署,对敏捷的优势和潜在的风险进行了平衡。


持续采用(CA)这个术语知道的人比较少,它表示一个越来越常见的概念:保持对底层软件运行时和工具的更新。这包括 Kubernetes、语言运行时等平台。大多数供应商和开源社区已经开始按季度甚至按月进行升级。无法跟上软件的发展步伐会导致应用程序过时,变得难以更改和支持。通常,安全更新是由软件内部的管理机制强制执行的。供应商会为数量很少的旧版本提供支持,所以支持窗口一直在变短。例如,Kubernetes 每三个月发布一次,社区仅支持最近的三个版本。如上所述,CI/CD 意味着代码更改触发构建和可能的部署。企业应该自动化类似的 CA 管道,当供应商或社区发布新的升级补丁时触发这些管道。有关 CA 的更多信息,请参见持续采用


值得注意的是,生命周期自动化的效率取决于与之相关的过程。如果你的发布审批周期仍然需要几周,或者有个依赖项的生命周期以月为单位,那么将 CI/CD 周期缩短到几分钟就没有意义了。

DevOps 和站点可靠性工程


正如我们从上图中看到的,生命周期自动化为人们工作方式的更深刻变革奠定了基础。我们简化了从编码完成到将其部署到生产环境的机制,缩短了开发人员和运营角色之间的距离,甚至可能将两个角色合二为一。


这就是所谓的 DevOps,以下是其核心内容:


  • 跨开发和运营角色的协作和联合

  • 运营关切“左移”

  • 快速的运营反馈和处理


在传统环境中,开发和运营角色是严格分开的。开发人员不许接近生产环境,运营人员也很少接触软件开发的过程。这可能导致开发人员编写代码时没有考虑到生产环境的实际情况。当运营团队为了保护环境而单独引入质量门,增加进入生产环境的障碍时,这种分离就会加剧,开发和运营之间的距离会周期性地加大。


DevOps 采取的方法是,我们应该不断努力减少并尽可能消除开发和运营之间的距离,以便保持目标一致。这可以激励开发人员“左移”许多运营上关注的事项。在实践中,这可以归结为问一系列问题,然后根据答案采取行动:


  1. 我们可以使开发环境与生产环境有多相似?

  2. 我们可以将可伸缩性、可用性和可观察性测试作为早期测试的一部分吗?

  3. 我们能否从一开始就将安全性放在适当的位置,而不仅仅是在主要环境的最后才把它打开?


在这方面,容器和 Kubernetes 等平台元素可以发挥重要的作用,稍后,我们将讨论基于镜像的部署和基础设施即代码等概念,从中我们就可以看出来。


显然,使用 CI/CD 缩短开发和生产之间的路径是与 DevOps 联系在一起的,因为关注迭代和业务是敏捷方法的特点。这也意味着改变人们的工作模式。软件开发人员应该在照管生产系统方面发挥积极的作用,而不仅仅是创建新的功能。运营人员应该专注于那些可以让单调而枯燥的任务自动化的方法,这样他们就可以转向更有价值的活动,比如创建自动化程度更高的自愈环境。当这两者结合起来时,这个特定的角色通常被称为站点可靠性工程师,以强调他们也是软件工程师的事实。成功的关键是需要充分认识到,组件“失败是正常的”,因此,我们应该计划好如何管理失败,而不是徒劳地试图阻止它发生。


在理想情况下,软件开发和运营会成为一个团队,每个团队成员都可以承担开发和运营角色,彼此之间可以互换。然而,大多数组织在这方面都有某种程度的妥协,角色往往会向一端或另一端倾斜。

团队自治


如果我们使方法更加敏捷,通往生产环境的路径更加自动化,就不会扼杀这些方法所带来的生产力和创新能力。每个团队都在处理一个独一无二的问题,他们将更适合于特定的语言和工作方式。我们应该通过以下方式给予团队尽可能多的自主权:


  • 所有权去中心化

  • 技术自由

  • 自助配置


如果我们要在更细粒度的组件上快速迭代,就需要放弃“一刀切”的策略,允许更多的局部决策。正如我们稍后将讨论的那样,只要组件以一致的方式交付(例如容器镜像),一个好的云平台就理所当然地应该鼓励将构建、部署和运营标准化。为了提高生产力,团队需要能够自由决定如何实现这些组件;选择他们自己的技术,比如语言和框架。同样重要的是,确保团队能够快速完成所需工具和资源的自助配置,当然,这也符合云基础设施的特点。


在整个企业中,仍然需要在方法和技术上保持一定程度的一致性。例如,像 Spotify 模式这样的方法,通常是通过“协会(Guild)”来实现这种需求。“协会”是由团队中的个人组成的团体,他们专注于鼓励(而不是强制)团队基于自己的实际经验选择常见的方法和工具。


当然,需要注意,权力下放通常无法普遍施行,也不能一下子全部应用。它可能只对企业的某些部分有意义,或者对企业中的某些类型的计划有意义。最终,要在促进公司创新和探索以保持市场领先地位,和确保企业不会因为不断变化和日益分化而破坏核心竞争力,之间寻求平衡。


在本系列的下一部分中,我们将看一下,为充分利用云环境,我们需要做出哪些架构和设计选择。同时,如果你想了解关于这些问题的更多信息,请访问IBM Garage Method网站,在那里,我们在端到端方法的上下文中更深入地讨论了这些主题。


查看英文原文:

The “How” of Cloud Native: People and Process Perspective


延伸阅读:

云原生到底意味着什么?

避免不完全的云原生


2021-01-07 12:511682

评论

发布
暂无评论
发现更多内容

工厂模式(三)泛型工厂的概念以及示例代码

LSJ

基于 Markdown 的中文文档排版规范

Murphy

markdown 排版规范 GitHub GFM 物联网学前班

备案问题汇总

云也退

网站 备案

探索 Go 语言数据类型的内部实现

TuringTuring

内存模型 高效 Go 语言

Android 通过opencv实现人脸识别,追踪

sar

android OpenCV 人脸识别

你有信息焦虑症吗?

Neco.W

学习 创业 知识体系

幂等问题及解决方案

Joker

幂等 解决方案

阿里巴巴为什么让初始化集合时必须指定大小?

王磊

Java 性能

Mysql常用删除方式比较

云也退

MySQL

一个在游戏行业摸爬滚打了十几年的人,为何我对这本书情有独钟

图灵社区

游戏开发 游戏制作 世嘉培训教材

从位图到布隆过滤器

王坤祥

位图 布隆过滤器

Nginx 入门及命令行操作

子杨

nginx 运维

游戏夜读 | 改写图形API的意义

game1night

Nginx 基础原理和命令行的真相

子杨

nginx 运维

为什么你要学习 Go?

司徒公子

编程语言 谷歌Google Go 语言

“Plus Token”传销主犯被公诉!警惕,区块链不是“取款链”!

CECBC

1024讲话 CECBC 区块链技术 人才发展 培训

神经网络中为什么不能将权重初始值设置为一样的值

王坤祥

神经网络 学习

10分钟了解Flink

代码诗人

kudmp介绍和安装

唯爱

2020智源-京东多模态对话挑战赛开战 产学研联合推动AI技术发展

DT极客

奈学干货分享:分布式CAP实践分析

奈学教育

分布式

我们可能都误解了什么是情商

董一凡

情绪

用户故事为什么要关联开发数据?

Worktile

敏捷开发 开发数据

架构师训练营0期开营

刁架构

架构师

「首度揭秘」大规模HPC生产环境 IO 特征

焱融科技

sds io 高性能 存储 焱融科技

ARTS_20200529

凌轩

Java ARTS 打卡计划

Weex开发:页面跳转以及Android端多应用选择窗口的处理

AR7

android Vue 大前端 跨平台 Weex

Cassandra可调一致性的使用及原理

老任物联网杂谈

大数据 分布式 Cassandra 可调一致性

Server Queue 提高 QPS

风含叶

Python kafka 后端 队列

GrowingIO 大数据多维分析自动化测试实践

GrowingIO技术专栏

大数据 自动化测试 parewise

卧槽,接到一个阎王的需求

码农神说

程序员

避免不完全的云原生(二):人员和流程要素_架构_Kyle Brown_InfoQ精选文章