云原生时代,为什么基础设施即代码(IaC)是开发者体验的核心?
作者 | 林俊(万念)
来源 |尔达 Erda 公众号
从一个小故事开始
你是一个高级开发工程师。
某天,你自信地写好了自动煮咖啡
功能的代码,并在本地调试通过。代码合并入主干分支后,你准备把服务发布到测试环境,进入提测流程。
你熟练地打开项目协同,新建了一个发布工单给运维同学,详细备注了需要发布的代码分支,并特别强调这次需要专门新增一个环境变量开关 AUTO_MAKE_COFFIE_ENABLED=true
。
过了一段时间,工单处理完成,测试同学开始测试。
突然,噩耗传来:你的项目协同里出现了几个 Bug。
你很疑惑,为什么本地完美运行的代码,在测试环境被提了这么多 Bug ?
你开始怀疑代码中某个地方的逻辑有问题。可仔细排查后却仍然定位不到问题。
最后,你终于发现,是运维同学复制环境变量时少复制了一个字母:
AUTO_MAKE_COFFIE_ENABLE=true
,ENABLED
少了一个 D
。
上面这种情况是不是很熟悉?虽然不是你的锅,却拖慢了你成为十倍程序员的进度。
那么,该怎么避免呢?
你一定在想:要是没有手工复制操作就好了。那就要有个地方来保存你的配置,但是你没有权限、也不想登录到运维操作平台自己粘贴配置。
你灵光一现:要是和运维同学约定好一个配置文件,把部署配置也提交进代码里,运维同学从文件里读取应用环境配置,问题就迎刃而解了。
IaC 是什么
在上面的故事里,这个特殊约定好的配置文件就是这个应用基础设施的一部分(IaC 中的 I)。
我们该怎么理解基础设施呢?一个稍微复杂点的应用,只有代码是无法运行起来的,因为它还有很多环境依赖需要被准确描述,比如需要运行环境有 make、git 等指定的命令行工具,依赖了哪些中间件等。
因此,产品团队在实施持续交付的过程中,必须考虑将基础设施的维护纳入进来,作为支持产品运行的一部分。
同时,技术的快速进步和演化,也使得基础设施的配置不得不频繁变化。在这种快速变化的过程中,要求基础设施既要灵活,也要安全、可靠。
参考 Wikipedia 上的定义,IaC 里的 Infrastructure 广义上是指 IaaS 层的基础设施,包括物理服务器、虚拟机以及相关的资源定义等。As Code 是指这些配置都应该被放到 VCS 上管理起来。
As Code 的好处是,你可以享受版本管理天然的福利,很方便地做一些回滚操作等。
当你把 Code 维护在 Git 里,就成了 GitOps。感兴趣的同学可以搜索 GitOps 相关文章进行学习。
那么,As Code 里的 Code 应该长什么样?这个格式由具体的自动化平台来定。至于 Code 的类型,指令式和声明式都可以。例如,常见的 Ansible 一般来说是指令式的,而 Terraform 是声明式的。当然,声明式定义更为推荐,因为这是一种面向终态的定义,对开发者屏蔽了具体实现细节,更加友好。
云原生时代,以应用为中心的 IaC 有什么不同?
时间快进到云原生时代。
在服务上云的大趋势下,基础设施的概念已经不再局限于 IaaS 层。云原生时代,开发者的焦点逐渐聚集到了应用上。即:以应用为中心。
持续集成、持续部署和 DevOps 这些概念的广泛推行和接受,要求产品团队对部署和运维要有更高的自主性。
首先,在 DevOps 概念深入人心的今天,一个开发工程师如果仅仅是把代码写好,是远远不够的,那只是做好了 Dev。真正的软件交付的生命周期,是从 Ops 开始的,运维同学早已不再负责应用的部署和运维,这都是开发者的事情。
Docker 的出现使得镜像交付成为大多数应用软件事实上的交付标准。所以,应用里需要有一个文件来定义怎么样把你的代码制作成镜像,这个文件通常是 Dockerfile。
与此同时,PaaS 平台的普及,使得开发者甚至不需要关心 Dockerfile。因为 PaaS 平台可以通过你的应用目录结构和特征文件,自动探测和选择合适的构建方式,这个代码编译和镜像构建的过程被称为 BuildPack。当然,在编译之前,你可能还需要做一些代码质量检查、合规性检查等,这些流程化的配置,需要有一个流程描述文件来声明。在不同的 PaaS 平台上,会有不同的声明方式。
Erda DOP 里怎么样把 IaC 做得更好
Erda 是一个以应用为中心的企业级一站式数字化 PaaS 平台。
DOP,即 DevOps Platform,是一个以应用为中心的一站式的 DevOps 平台。
一个 Erda 应用支持代码质量扫描、代码安全扫描、单元测试执行等,镜像制作好之后,还有镜像安全扫描、持续部署、接口自动化测试等。通过这些流程对应用的全生命周期进行管理。
在这个平台上,你可以使用 pipeline.yaml 来定义应用的 CI/CD 全流程。很显然,这个 pipeline.yaml 就是这个应用基础设施的一部分。
同时,你需要用一个声明式的 erda.yaml 来描述你的应用微服务架构,包括微服务之间的依赖关系、对中间件的依赖等等。
在平台设计之初,我们就对应用做了抽象,使得它可以被部署到任意平台,包括 K8s、DC/OS 等,对开发者屏蔽了具体实现细节。
因此,当应用部署在 Erda PaaS 平台上时,这两个文件是必不可少的。
值得一提的是,在平台最早期的时候,我们只有一个 erda.yaml 文件,里面把微服务架构和构建过程写在一起。在实践过程中,我们逐渐意识到这样的方式扩展性不够,很难进行流程定制。并且命令式和声明式的两种形态耦合在同一个文件中,使用者的心智切换成本也更高。
除此之外,我们还支持在 .erda 目录下定义 API 描述文件来对 API 全生命周期进行管理。
当这些 Infrastructure 都被作为 Code 提交之后,Erda 平台就可以根据这些配置,进行持续集成和持续交付,最终自动把应用完整地部署起来。
以 Erda 自身举例,Erda 本身的持续集成、自动版本发布等,都是在 Erda 平台上自举的。
erda.yaml 部分截图如下:
用于 CI 的 pipeline.yaml 部分截图如下:
当你的应用是一个标品时,有了 IaC,给客户交付这个应用就变得非常简单。你要做的,只是把代码仓库完整地推送到新的应用代码仓库里,然后执行流水线。执行完毕后,一个完整的应用就被交付到了新的客户环境里。之后,开发者在这个新应用进行定制化开发,在应用的基础设施变更时,把变更提交到代码里进行版本控制管理。
总结
You build it, you run it.
所以我们说,基础设施即代码(IaC)是云原生时代开发者体验的核心。
有了 IaC,作为开发者的你,终于可以更好地掌握应用的全生命周期了。
欢迎参与开源
Erda 作为开源的一站式云原生 PaaS 平台,具备 DevOps、微服务观测治理、多云管理以及快数据治理等平台级能力。点击下方链接即可参与开源,和众多开发者一起探讨、交流,共建开源社区。欢迎大家关注、贡献代码和 Star!
- Erda Github 地址:https://github.com/erda-project/erda
- Erda Cloud 官网:https://www.erda.cloud/
云原生时代,为什么基础设施即代码(IaC)是开发者体验的核心?的更多相关文章
- 阿里云弹性容器实例产品 ECI ——云原生时代的基础设施
阿里云弹性容器实例产品 ECI ——云原生时代的基础设施 1. 什么是 ECI 弹性容器实例 ECI (Elastic Container Instance) 是阿里云在云原生时代为用户提供的基础计算 ...
- 云原生时代的DevOps平台设计之道
开发人员与运维人员是 IT 领域很重要的两大人群,他们都会参与到各种业务系统的建设过程中去.DevOps 是近年间火爆起来的一种新理念,这种理念被很多人错误的解读为"由开发人员(Dev)学习 ...
- 进击的 Java ,云原生时代的蜕变
作者| 易立 阿里云资深技术专家 导读:云原生时代的来临,与Java 开发者到底有什么联系?有人说,云原生压根不是为了 Java 存在的.然而,本文的作者却认为云原生时代,Java 依然可以胜任&qu ...
- 进击的.NET 在云原生时代的蜕变
你一定看过这篇文章 <进击的 Java ,云原生时代的蜕变>, 本篇文章的灵感来自于这篇文章.明天就将正式发布.NET Core 3.0, 所以写下这篇文章让大家全面认识.NET Cor ...
- 开放下载 | 《Knative 云原生应用开发指南》开启云原生时代 Serverless 之门
点击下载<Knative 云原生应用开发指南> 自 2018 年 Knative 项目开源后,就得到了广大开发者的密切关注.Knative 在 Kubernetes 之上提供了一套完整的应 ...
- [转帖]从 SOA 到微服务,企业分布式应用架构在云原生时代如何重塑?
从 SOA 到微服务,企业分布式应用架构在云原生时代如何重塑? 2019-10-08 10:26:28 阿里云云栖社区 阅读数 54 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权 ...
- 云原生时代,Java的危与机(周志明)
说明 本篇文章是转载自周志明老师的文章,链接地址:https://www.infoq.cn/article/RQfWw2R2ZpYQiOlc1WBE 今天,25 岁的 Java 仍然是最具有统治力的编 ...
- 云原生时代的Java
原文链接(作者:周志明):https://time.geekbang.org/column/article/321185 公开课链接:https://time.geekbang.org/opencou ...
- CODING —— 云原生时代的研发工具领跑者
本文为 CODING 创始人兼 CEO 张海龙在腾讯云 CIF 工程效能峰会上所做的分享. 文末可前往峰会官网,观看回放并下载 PPT. 大家上午好,很高兴能有机会与大家分享 CODING 最近的一些 ...
随机推荐
- git merge远程合并
当某个分支上的开发工作完成后需要将其合入主分支master 但是在提交合并前我们自己最好做一次衍合,目的是检测是否有冲突的风险,如果有应该在本分支先解决冲突然后在提交合并. 否则解决冲突的工作就全部转 ...
- 转:Linux常用命令总结
学习linux也有一阵子了,现总结一些常用的linux操作命令,方便大家查找1. cd命令这个命令是最基本的也是最常用的.它用于切换当前目录,可以是绝对路径,也可以是相对路径.例:cd /root/h ...
- Luogu P2982 [USACO10FEB]慢下来 Slowing down | dfs序、线段树
题目链接 题目大意: 有一棵N个结点树和N头奶牛,一开始所有奶牛都在一号结点,奶牛们将按从编号1到编号N的顺序依次前往自己的目的地,求每头奶牛在去往自己目的地的途中将会经过多少已经有奶牛的结点. 题解 ...
- hdu 1160 FatMouse's Speed(最长不下降子序列+输出路径)
题意: FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to ...
- 安装配置多个版本JDK
前言:JDK有多个版本,有时为了开发需要切换不同的版本,在一部电脑上安装多个JDK,只需要按以下配置,每次即可轻松使用.以下环境为Windows10 安装JDK 安装JDK8 配置环境变量 需要配置J ...
- 《手把手教你》系列技巧篇(三十七)-java+ selenium自动化测试-日历时间控件-上篇(详解教程)
1.简介 我们在实际工作中,有可能遇到有些web产品,网页上有一些时间选择,然后支持按照不同时间段范围去筛选数据.网页上日历控件一般,是一个文本输入框,鼠标点击,就会弹出日历界面,可以选择具体日期.这 ...
- oracle静默安装完成后,重启数据库,错误ORA-01102: cannot mount database in EXCLUSIVE mode
静默安装oracle完成后,登录数据库激活用户,无法更改,提示未载入数据库,关闭后重启报错: 1.找到安装目录下的$ORACLE_HOME/dbs/ 目录下,查看当前使用lkORCL文件的用户(fus ...
- Filter学习笔记
博客园的编辑器太丑了,所以我换用了别的Markdown编辑器,并用图片形式上传.
- maven项目打包执行
1.maven项目已完成状态! 2.maven打包前提pom.xml引入插件依赖 <build> <plugins> <plugin> <artifactId ...
- java 雪花算法实现获取分布式id
import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkI ...