华为云DevOps系列之 —— 持续部署与发布(五)自动化的实现 “一切即代码”
【摘要】 华为云DevOps系列之 —— 持续部署与发布(五)自动化的实现 “一切即代码”
没有自动化之前的软件部署
- 随着微服务的增多,运维部署的成本也直线上升,如果我们还是采用之前手动的部署方式,无疑会导致工作量的剧增
- 全程人员参与,浪费大量时间
- 如果节点多,时间就成倍增长
- 人为干预,可能导致人为失误多
- 无自动化回滚,或者难以回退
从云计算堆栈到实践“一切即代码”
- IaaS、PaaS、SaaS,就是我们常说的云计算的三种模式,也叫三大堆栈
- 用一个开披萨店的例子来解释一下这三种模式
- On-Premises:从头到尾自己生产披萨,比较麻烦,需要准备的东西多,因此你决定外包一部分工作采用他人的服务,你有以下三种方案
- 方案一:
IaaS
,他人提供厨房、炉子、煤气,你使用这些基础设施来烤披萨 - 方案二:
PaaS
,除了方案一的基础设施,他人还提供披萨、饼皮,你只需要把自己的配料撒在饼皮上烤出来就行了,也就是说,你需要做的仅仅是设计披萨的味道(海鲜披萨 or 鸡肉披萨)。他人提供平台服务,让你自己的设计实现 - 方案三:
SaaS
,他人直接做好了披萨,不用你的介入,到手的就是一个成品,你要做的就是把它卖出去,最多就是包装一下(印上自己的 logo)
- 一切即代码,这个说法最早来源于基础设施即代码
- 一切即代码实际讨论的就是
自动化
,利用自动化来处理繁琐的工作,或者在某个任务过于庞大和复杂,无法手动处理时考虑自动化
什么是基础设施即代码
为什么要推行基础设施即代码?
- 随着技术的快速进步和演化以及市场需求的瞬息万变,要求基础设施有更快的响应速度,也使得基础设施的配置不得不频繁变化,在这种快速变化的过程中,要求基础设施既要
灵活
也要安全可靠
- 基础设施即代码的目标就是我们能够通过可重用的代码来实现 IT 环境变更的自动化,并对代码进行版本控制,就像多年前开发人员在程序开发中采用这种方式来处理应用程序的代码变更一样
基础设施即代码解决方案
- Infrastructure as Code 基础设施即代码:用代码或配置文件来生命应用系统使用的基础设施资源
- 通过自动化部署工具即可以实现“基础设施即代码”,也就是不需要为每一台虚拟机安装基础软件或调整系统参数,一一进行手动升级。只需要把环境的创建过程使用代码的形式描述出来,并且提交到代码库中。任何的环境变更都必须通过修改代码、提交,然后总是使用代码库中的最新版本重新构建环境。这样所有的机器的状态就是可预测的,并且是一致的
- 一旦采用了环境定义脚本,实现对环境的控制后,需要将环境定义脚本纳入版本管理中,并且之后所有的环境变更都应该先修改环境定义脚本,由环境定义脚本触发对环境的变更
- 登录到服务器,执行一些临时性命令是坚决被禁止的,因为这极有可能会
破坏环境的一致性
,重建服务器时,也不能保证能应用所有需要的变更 - 有人可能会将其理解为配置管理,某种意义上说这就是一种全自动化,但它和配置管理有一个非常大的区别 ——
开发人员可以全权负责
- 常见的开源自动化配置管理工具有 Puppet、Chef、SaltStack 和 Ansible
Ansible - 轻量级的自动化部署工具
“Yet Another Markup Language”(仍是一种标记语言)
- Ansible 是一个开源配置管理工具,可以使用它来自动化任务部署应用程序,实现 IT 基础架构。Ansible 可以用来自动化日常任务,比如服务器的初始化、配置、安全基线配置、更新和打补丁系统安装软件包等
- Ansible与 Chef、Puppet 以及 SaltStack 相比,Ansible 更轻量级,是无客户端的,仅需通过 SSH 连接客户机执行任务即可
- Ansible 中一些概念术语
控制节点
:指安装了 Ansible 的主机,也叫 Ansible 服务器端管理机,主要用于发布运行任务、执行控制命令,Ansible 的程序都安装在控制节点上,控制节点需要安装 Python 和 Ansible 所需要的依赖库(目前 Ansible 还不能安装在 Windows 下)受控节点
:也叫客户机,就是用 Ansible 执行任务的客户服务器模块模块
:Ansible 执行特定任务的代码块,比如添加用户、上传文件和对客户机执行 ping 操作等,Ansible 默认自带 450 多个模块Host文件
:受控节点的列表,就是所有要管理的主机列表- Connection plugins:Ansible 基于连接插件连接到各个主机上
剧本
:利用 Yaml 标记语言编写的可重复执行的任务列表- 可读性好
- 和脚本语言的交互性好
- 脚本模块化、配置灵活
- 每个步骤都配有名称,方便查看结果
- 易于实现
Dockerfile —— 容器镜像构建文件
- Vigrant 以及 Docker 等技术简化了开发环境的设置,容器和容器编排器(比如 K8S),都成为了流行的工具,它们利用敏捷、隔离、正确配置的组件部署环境,我们可以将这些工具视为以代码的形式提供系统依赖性。Dockerfile 是这种依赖关系中的代码和模板,而 docker 是运行和满足这些依赖关系的工具
- 每个 Dockerfile 都以 from 开头
from debian
:以 debian 官方提供的镜像为基础来构建镜像,在构建时 docker 会从 dockerHub(类似于 Github) 查找和下载需要的镜像Run apt-get install emacs
:执行安装 emacsRun apt-get install apache2
:执行安装 apache2CMD ["/bin/bash"]
:配置启动容器时执行的 shell 命令
Kubernetes manifest
- 有人会有疑问:既然有了 docker,为什么还要 Kubernetes 呢?
容器化部署后的问题
- 容器化部署后,随着业务扩展,容器实例会越来越多,就像鸡蛋太多需要一个篮子来装一样,K8S 就是那个篮子,当然它不是一个简单的篮子
Kubernetes manifest
- 通过 Kubernetes manifest 文件,可以用 YAML 形式来描述在 K8S 中,以 Pod 的形式运行的应用容器,以及要运行多少个应用的副本
- 如下图的 YAML 文件
- 副本的数量是 3
- 引用的镜像是 nginx1.7.9
- 容器的端口是 80
Terraform 多云资源管理
Terraform 概述
- “Multi-Cloud”即企业将多个应用部署在多个云平台上,比如华为云、AWS、Azure、OpenStack 或其他云平台,如何对不同云平台的资源进行统一管理?
- Terraform 可以用来管理多层次的资源。从上层的软件配置到底层的网络、系统配置,通过一致的模板形态定义基础设施的创建、更新、销毁的全生命周期
- Terraform 提供了对资源和提供者的灵活抽象,该模型允许表示从物理硬件、虚拟机和容器到电子邮件和 DNS 提供者的所有内容。由于这种灵活性
- Terraform 与其他系统并不互相排斥,它可以用于管理小到单个应用程序或大到整个数据中心的不同对象
- Terraform 使用云提供商 API 来配置基础架构,使用云提供商提供的身份验证机制,构建及访问服务器
Terraform 管理华为云资源
- Terraform 使用配置文件描述管理的组件,小到单个应用程序,大到整个数据中心,Terraform 生成一个执行计划,描述它将做什么来达到所需的状态,然后执行它来构建所描述的基础结构。随着配置的变化,Terraform 能够确定发生了什么变化,并创建可应用的增量执行计划
- 下面是华为云的模板,可以看到模板形态一致,定义
resource
填写不同的参数(比如:数量、镜像、实例类型)。如果所示,使用模板创建了一个 S1 规格的系统为 CentOS7 的 ESC 的服务器
Document as Code —— Markdown
- 在研发过程中,文档是不可避免地
- 有的同学可能会有疑问:敏捷中不是强调可以工作的软件胜过面面俱到的文档吗?其实敏捷宣言里也解释了,并不是说右向没有价值,只是左向的价值更高
- Markdown 是编写软件文档的最广泛的形式
- 它是一种轻量级标记语言,可以轻松转换为 HTML 或其他格式
- Markdown 成为首选的原因之一是我们几乎可以使用任何纯文本编辑器来创建 Markdown 文件
- 我们可以通过 Markdown 桌面文本编辑器、markdown 浏览器、在线编辑器或自动生成软件文档工具来发布以 Markdown 格式编写的文档
- 通过 git 版本控制系统向管理代码一样管理 Markdown 文件,实现文档及代码
Pipeline as Code —— Jenkins
- 从某种程度上来看,实施流水线即代码是不言而喻的。在 CI/CD 的实践过程中,凡是可以被编码的东西都已经被代码化了(比如:构建、测试、数据库迁移、部署和基础设施环境配置等),流水线已经是 CI/CD 实践过程中最后一公里
- Jenkins 允许我们在项目的特定目录下放置一个 Jenkins file 文件,Jenkins fil e是 Jenkins 核心特性 pipeline 的脚本,由 groovy 语言实现。Jenkinsfile 一般放在项目根目录,随项目一起受源代码管理软件控制
- 好处
- 实现流水线上的代码评审、迭代
- 对流水线进行审计跟踪
- 作为流水线的单一可信数据员,能够被项目的多个成员查看和编辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-02fmoc3u-1630289412869)(https://files.mdnice.com/user/1631/ffea6334-ce24-48c8-a49e-579eab4e80ca.png)]
node
为流水线分配了一个执行者和工作区,没有 node 流水线就无法工作- Stage 代表阶段,一个 pipeline 可以划分成若干个 stage,每个stage 代表一组操作(例如:build、test、deploy等等)
- 如图所示,在样例中依次在 stage 中执行了检出项目代码、测试、构建、部署等操作
实现“一切即代码”自动化
- 应用程序源代码变更
- 代码提交到 GitHub/CodeHub
- Jenkins/构建服务,持续集成触发器
- Jenkins 触发容器镜像生成
- Jenkins 触发 Terraform,使用镜像构建的容器集群
- 云上收集并分析日志
- 监控应用程序并进行改进
思考题
关于“一切即代码”,以下哪项说法是正确的()?
- A. 没有自动化前的软件部署,也可做到“回滚”,且人工效率较高
- B. IaC 中,着重强调程序开发中的代码编写,基础设施与应用本身>无关,不应被视作代码
- C. Docker 和 Kubernetes 中都是用 YAML 文件进行描述
- D. “一切即代码”是一种思想,通过可重用的代码来实现 IT 环境变更的自动化,并对代码进行版本控制
答案:D
最后,欢迎大家关注我的个人微信公众号 『小小猿若尘』,获取更多IT技术、干货知识、热点资讯。同时,我在公众号中分享了精心整理的一些视频资料(包括 Python全栈教程、AI教程、前端、数据库等),大家回复相应关键词即可获取网盘视频链接,感谢大家的关注😊
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)