一、什么是devops
在DevOps之前,从业人员使用瀑布模型或敏捷开发模型进行软件项目开发:瀑布模型或顺序模型是软件开发生命周期(SDLC)中的一种开创性方法,在这个模型中,软件开发成为一个线性过程,不同的阶段和任务被依次定位;而敏捷开发涉及各种方法的使用和SDLC中多个团队的协作。瀑布模型的线性和敏捷开发的跨功能性无法确保快速、连续地交付无缺陷的软件应用程序。
软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运维工作必须紧密合作。这样的情况下,DevOps应运而生。
DevOps是一个简单的缩写词,源于“development(开发)”和“Operation(运维)”两个词,它涉及以特定的方式实践应用程序开发的任务。更广泛地说,软件开发和IT运维的结合被称为DevOps。
在组织内部负责管理重要 IT 部门的典型 IT 组织通常看起来是这样的:
主要由于历史的原因(大部分运维人员来自硬件和电信业务领域),运维人员和开发者分属不同的组织结构分支。开发者属于研发部门,而运维人员大部分时候属于基础架构部门(或专门的运维部门)。
看了这些,终于知道运维人员到底有多重要了吧!
二、真的很难共存吗?
DevOps 的共存主要是为了扩展敏捷开发实践,进一步完善软件变更在构建、验证、部署、交付等阶段中的流动,同时通过软件应用程序的全面所有权予力跨职能团队完成从设计到生产支持等各环节的工作。
DevOps 鼓励软件开发者和 IT 运维人员之间所进行的沟通、协作、集成和自动化,借此有助于改善双方在交付软件过程中的速度和质量。
DevOps 团队更侧重于通过标准化开发环境和自动化交付流程改善交付工作的可预测性、效率、安全性,以及可维护性。理想情况下,DevOps 可以为开发者提供更可控的生产环境,帮助他们更好地理解生产基础架构。
三、devops 工具链
DevOps 实际是一种文化上的变迁,代表了开发、运维、测试等环节之间的协作,因此 DevOps 工具是非常多种多样的,甚至可以由多种工具组成一个完整的 DevOps 工具链。此类工具可以应用于一种或多种类别,并可体现出软件开发和交付过程的不同阶段:
- 编码:代码开发和审阅,版本控制工具、代码合并工具
- 构建:持续集成工具、构建状态统计工具
- 测试:通过测试和结果确定绩效的工具
- 打包:成品仓库、应用程序部署前暂存
- 发布:变更管理、发布审批、发布自动化
- 配置:基础架构配置和部署,基础架构即代码工具
- 监视:应用程序性能监视、最终用户体验
虽然可用工具有很多,但其中一些环节是组织内部应用 DevOps 工具链不可或缺的。
说了这么多,离了工具怎么行。这里罗列出来,以便大家参考使用。
版本控制&协作开发:GitHub、GitLab、BitBucket、SubVersion、Coding、Bazaar,git
自动化构建和测试:Apache Ant、Maven 、Selenium、PyUnit、QUnit、JMeter、Gradle、PHPUnit,Gradle。
持续集成&交付:Jenkins、Capistrano、BuildBot、Fabric、Tinderbox、Travis CI、flow.ci Continuum、LuntBuild、CruiseControl、Integrity、Gump,
容器平台: k8s,k9s,k3s,k10086s(这个是自己瞎写的),Mesosphere,
监控,警告&分析:Nagios、Ganglia、Sensu、zabbix、ICINGA、Graphite、Kibana,prometheus,New Relic,Splunk,Elasticsearch,finderWeb
下面介绍几款常用的工具:
1. maven
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。 Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。
2. Ansible
我们知道现在自动化工具中,最简单、易于上手,而且最流行的当属Ansible莫属了。和Chef、Puppet等Ruby工具甚至同时Python系的Saltstack等CS架构的自动化工具相比虽然执行性能上可能会稍一点,但是无需客户端,只需SSH就可以管理优势还是相当明显的。服务器上架后无需额外操作就可以直接进行操作,比如服务器的初始化标准配置等。 Ansible是一个开源配置管理工具,可以使用它来自动化任务,部署应用程序实现IT基础架构。Ansible可以用来自动化日常任务,比如,服务器的初始化配置、安全基线配置、更新和打补丁系统,安装软件包等。Ansible架构相对比较简单,仅需通过SSH连接客户机执行任务即可:
Ansible的与节点有关的重要术语包括控制节点,受管节点,清单和主机文件:
- 控制节点(Control node):指安装了Ansible的主机,也叫Ansible服务器端,管理机。 Ansible控制节点主要用于发布运行任务,执行控制命令。Ansible的程序都安装在控制节点上,控制节点需要安装Python和Ansible所需的各种依赖库。注意:目前Ansible还不能安装在Windows下。
- 受控节点(Managed nodes):也叫客户机,就是想用Ansible执行任务的客户服务器。
- 清单(Inventory):受控节点的列表,就是所有要管理的主机列表。
- host文件:清单列表通常保存在一个名为host文件中。在host文件中,可以使用IP地址或者主机名来表示具体的管理主机和认证信息,并可以根据主机的用户进行分组。缺省文件:/etc/ansible/hosts,可以通过-i指定自定义的host文件。
- 模块(Modules):模块是Ansible执行特定任务的代码块。比如:添加用户,上传文件和对客户机执行ping操作等。Ansible现在默认自带450多个模块,,Ansible Galaxy公共存储库则包含大约1600个模块。
- 任务(Task):是Ansible客户机上执行的操作。可以使用ad-hoc单行命令执行一个任务。
- 剧本(Playbook):是利用YAML标记语言编写的可重复执行的任务的列表,playbook实现任务的更便捷的读写和贡献。比如,在Github上有大量的Ansible playbooks共享,你要你有一双善于发现的眼睛你就能找到大量的宝藏。
- 角色(roles):角色是Ansible 1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。
3. jenkins
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。
4. Docker
Docker 是一种容器技术,可让您在特殊环境中隔离应用程序。容器化与虚拟化类似,不同之处在于容器不会启动完整的操作系统。
使用 Docker 容器,您可以在这些自定义环境中开发和部署应用程序,从而不必担心兼容性问题。您的应用程序可以在任何位置运行,只要它们位于容器中即可。
要启动 Docker 容器,您必须通过 Dockerfiles 创建 Docker 映像。从 Docker 映像启动时,Dockerfile 包含 Docker 容器中所需的规范。您不必总是构建自己的 Docker 映像,因为 Docker Hub 上可以使用官方映像。
Docker 本身可以在 Linux 上运行,并且在 macOS 上也可以正常运行,因为它类似于 Unix。对于 Windows 用户,也可以通过Docker 工具箱来使用 Docker。
5. Kubernetes
Kubernetes (K8s) 是一个谷歌开源工具,它可以让你管理 Docker 容器。由于在生产中经常有大量的容器在运行,因此,Kubernetes 使编排这些容器成为可能。
首先要了解编排 Docker 容器的原因。当有许多容器在运行时,很难手动监视这些容器,并使它们彼此通信;另外,这种扩展以及负载平衡也变得困难。
使用 Kubernetes,可以控制所有这些容器,因此可以将这组机器作为一台机器进行管理。与 Docker Compose 相比,Kubernetes 是不同的,因为它使部署,扩展和监视容器变得更加容易。当它们中的任何一个崩溃时,它们都可以自愈,而 Kubernetes 可以制造新的来代替。使用 K8s,可以轻松地进行存储编排、服务发现和负载平衡。
您可以在 macOS,Linux 和 Windows 上安装 Kubernetes,并通过Kubernetes 命令行工具使用它。
四、企业级开发
企业中,整合开发流程非常重要,使用devops能够有效提高团队的协作效率,节省团队中各个角色的时间,多留些时间给亲友们,岂不快哉! 下面是一个devops企业级开发的全景图。