DevOps与Kubernetes 、容器的关系
近两年,随着容器、Kubernetes 等技术的兴起,DevOps 这个概念被广泛提及并被大量使用。 本文将会从以下几个方面着手,结合实验展现的方式,让读者真正理解 DevOps 的含义。
- DevOps 产生的背景
- DevOps 与容器、Kubernetes 之间的关系
- DevOps 的常用工具
DevOps 是什么
DevOps 中的 Dev 指的 Development,Ops 指的是的 Operations,用一句话来说 DevOps 就是打通开发运维的壁垒,实现开发运维一体化。
从瀑布式开发到敏捷开发
谈到 DevOps 的发展史,我们需要先谈一下敏捷开发。
首先,敏捷开发是面向软件的,而软件依赖于计算硬件。我们知道,世界上第一台计算机是在 1946 年出现的。因此,软件开发相对于人类历史而言,时间并不长。相对于软件开发方法论的掌握,人们更擅长于工程学,如盖楼、造桥等。为了推动软件开发,1968 年,人们将工程学的方法应用到软件领域,由此产生了软件工程。
软件工程的方式有其优点,但带来了不少问题。最关键一点是:软件不同于工程。通过工程学建造的大桥、高楼在竣工后,人们通常不会对大桥高楼的主体有大量使用需求的变更;但软件却不同。对于面向最终用户的软件,人们对于软件功能的需求是会不断变化的。在瀑布式开发的模式下,当客户对应用有变化的需求时,软件厂商得重新开发软件。这将会使企业的竞争力大幅下降。
传统的软件开发流程是:产品经理收集一线业务部门和客户的需求,这些需求可能是新功能需求,也可能是对产品现有功能做变更的需求。然后进行评估、分析,将这些需求制定为产品的路线图,并且分配相应的资源进行相关工作。接下来,产品经理将需求输出给开发部门,开发工程师写代码。写好以后,就由不同的部门的人员进行后续的代码构建、质量检验、集成测试、用户验收测试,最后给生产部门。这样带来的问题是,开发周期比较长,并且如果有任何变更,都要重新走一遍开发流程,在商场如战场的今天,软件一个版本推迟发布,可能到发布时这个版本在市场上就已经过时了;而竞争对手很可能由于在新软件发布上快了一步,而迅速抢占了客户和市场。
正是由于商业环境的压力,软件厂商需要改进开发方式。
2001 年初,在美国滑雪胜地 snowbird,17 位专家聚集在一起,概括了一些可以让软件开发团队更具有快速工作、相应变化的能力的价值观原则。他们称自己为"敏捷联盟"。
敏捷开发的主要价值观如下:
表 1. 敏捷开发的核心价值观
个体和互动 | 高于 | 流程和文档 |
工作的软件 | 高于 | 详尽的文档 |
客户合作 | 高于 | 合同谈判 |
相应变化 | 高于 | 遵循计划 |
有了敏捷联盟,有了敏捷开发价值观,必然会产生开发的流派。主要的敏捷开发流派有:极限编程(XP)、Scrum、水晶方法等。
至此,敏捷开发有理念、有方法、有实践。随着云计算概念的兴起,云计算的不断落地,敏捷开发不仅实现了工具化,也得到了升华。
从敏捷开发到 DevOps
谈到了敏捷开发,那么敏捷开发和 DevOps 有什么关系呢?
敏捷开发是开发域里的概念,在敏捷开发基础之上,有如下阶段:
敏捷开发->持续集成->持续交付->持续部署->DevOps
从敏捷开发到 DevOps,前一个阶段都是后一个阶段的基础;随着阶段的推进,每个阶段概念覆盖的流程越来越多;最终 DevOps 涵盖了整个开发和运维阶段。正式由于每个阶段涉及的范围不同,因此所以每个概念所提供的工具也是不一样的。具体内容我们参照下图:
图 1. 从敏捷开发到 DevOps 的进阶
持续集成(Continuous Integration)指的是:代码集成到主干之前,必须全部通过自动化测试;只要有一个测试用例失败,就不能集成。持续集成的要实现的目标是:在保持高质量的基础上,让产品可以快速迭代。
持续交付(Continuous Delivery)指的是:开发人员频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就被发布。如果评审不通过,那么需要开发进行变更后再提交。
持续部署(Continuous Deployment)指的是:代码通过评审并发布后,自动部署,以交付使用。
DevOps 是一组完整的实践,可以自动化软件开发和 IT 团队之间的流程,以便他们可以更快、更可靠地构建、测试和发布软件。
图 2. DevOps 示意图
DevOps 的技术实现
DevOps 的技术实现,需要三个方面:标准交付物、容器调度平台、DevOps 工具链。接下来,我们详细看一下这个三个方面的内容。
DevOps 的技术实现 1:标准交付物
DevOps 的目的在于让开发和运维一体化、让开发和运维相互之间的沟通更加顺畅、迅捷,从而使企业更能适应市场的变化。
当然,真正实现开发运维一体化,并非只是让开发和运维的人坐在一起那么简单。从技术角度,DevOps 首先需要有一个包含了“操作系统+Runtime+应用”的标准交付物。除此之外,还需要通过整个 DevOps 流程来打通。
在 IT 早期,厂商硬件和系统平台的差异化过大,在不同硬件和系统平台进行应用的无缝迁移几乎是不可想象的。随着 X86 服务器以及 vSphere 等虚拟化技术的普及,操作系统(包括操作系统上的应用)可以在不同 X86 服务器厂商的硬件平台上在线无缝迁移。硬件差异化不断缩小甚至消失,软件的重要性不断提升,IT 界真正进入软件定义一切的时代。在这个背景下,业务提出了更高的要求,如何将应用在不同操作系统之间实现无缝迁移,将开发和生产统一,做到“构建一次,到处运行”。
容器技术的概念最初出现在 2000 年,当时称为 FreeBSD jail,这种技术可将 FreeBSD 系统分区为多个子系统。
但直到 Docker 的出现(2008 年),容器才真正具备了较好的可操作性和实用性。因为 Docker 提供了容器的镜像构建、打包等技术,使容器具备了一次打包,到处运行的能力。
对于客户而言,Docker 只能在一个 Linux 上运行,是“单机版”,很难符合企业对高可用的需求。此外,docker 也缺乏和持久存储、虚拟网络相关的功能。
DevOps 的技术实现 2:容器调度平台
2014 年 Kubernetes 的出现,奠定了今天容器调度平台的事实标准的基础。
因为通过 Kubernetes,我们不仅实现了容器在多个计算节点上的统一调度,还可以将容器对接持久存储、对接虚拟网络等。换句话说,Kubernetes 使容器具备企业级的功能。
图 3. Kubernetes 架构
DevOps 的技术实现 3:DevOps 工具链
在有了容器和 Kubernetes 以后,我们还需要相关的 DevOps 工具链。
目前在 IT 界,DevOps 相关的工具很多,其中大多数是开源的工具,如下图。
图 4. DevOps 工具链
总结:DevOps 与容器和 Kubernetes 的关系
PaaS、DevOps 的概念,在容器和 Kubernetes 普及之前就存在了。广义上的 PaaS、DevOps 的建设,会包含:人、流程、工具等多方面内容。IT 厂商提供的 PaaS、DevOps 以指工具层面的落地为主、以流程咨询为辅。
在 Kubernetes 和容器普及之前,我们通过虚拟机也可以实现 PaaS、CI/CD,只是相对速度较慢,因此普及性不高(想象一下通过 X86 虚拟化来实现中间件集群弹性伸缩的效率)。而正是容器的出现,为 PaaS、DevOps 工具层面的落地提供非常好的承载平台,使得这两年容器云风生水起。这就好比 4G(2014 年出现)和微信(2011 年出现)之间的关系:在手机网速 3G 时代,流量按照兆收费的时候,(即使有)大家对于微信语音聊天、微信视频也不会太感兴趣。
所以说, Docker 使容器具备了较好的可操作性、可移植性,Kubernetes 使容器具备企业级使用的条件。而 IT 界众多基于 Kubernetes 和 Docker 企业级的容器平台,又成为了 Devops 工具落地的新一代基础架构。
常用 DevOps 工具介绍
- Kubernetes 集群:包含 Docker 和 Kubernetes。
- Gogs: 通过 Go 编写的本地代码仓库,功能与 github 类似。
- Jenkins/Jenkins Slave Pods:持续集成工具。
- Nexus :工件管理器,能够解决本地缓存构建依赖项。
- SonarQube:开源代码分析工具,它可以分析常见编程错误的源代码。
以上的 DevOps 工具,都可以以容器方式部署到 Kubernetes 集群中。
其他工具类型及对应的不完全列举整理如下:
代码管理(SCM):GitHub、GitLab、BitBucket、SubVersion
构建工具:Ant、Gradle、maven
自动部署:Capistrano、CodeDeploy
持续集成(CI):Bamboo、Hudson、Jenkins
配置管理:Ansible、Chef、Puppet、SaltStack、ScriptRock GuardRail
容器:Docker、LXC、第三方厂商如AWS
编排:Kubernetes、Core、Apache Mesos、DC/OS
服务注册与发现:Zookeeper、etcd、Consul
脚本语言:python、ruby、shell
日志管理:ELK、Logentries
系统监控:Datadog、Graphite、Icinga、Nagios
性能监控:AppDynamics、New Relic、Splunk
压力测试:JMeter、Blaze Meter、loader.io
预警:PagerDuty、pingdom、厂商自带如AWS SNS
HTTP加速器:Varnish
消息总线:ActiveMQ、SQS
应用服务器:Tomcat、JBoss
Web服务器:Apache、Nginx、IIS
数据库:MySQL、Oracle、PostgreSQL等关系型数据库;cassandra、mongoDB、redis等NoSQL数据库
项目管理(PM):Jira、Asana、Taiga、Trello、Basecamp、Pivotal Tracker
在工具的选择上,需要结合公司业务需求和技术团队情况而定。(注:更多关于工具的详细介绍可以参见此文:51 Best DevOps Tools for #DevOps Engineers)
refer:
DevOps与Kubernetes 、容器的关系的更多相关文章
- Kubernetes容器集群管理环境 - Prometheus监控篇
一.Prometheus介绍之前已经详细介绍了Kubernetes集群部署篇,今天这里重点说下Kubernetes监控方案-Prometheus+Grafana.Prometheus(普罗米修斯)是一 ...
- Kubernetes 学习(十)Kubernetes 容器持久化存储
0. 前言 最近在学习张磊老师的 深入剖析Kubernetes 系列课程,最近学到了 Kubernetes 容器持久化存储部分 现对这一部分的相关学习和体会做一下整理,内容参考 深入剖析Kuberne ...
- 搭建Kubernetes容器集群管理系统
1.Kubernetes 概述 Kubernetes 是 Google 开源的容器集群管理系统,基于 Docker 构建一个容器的调度服务,提供资源调度.均衡容灾.服务注册.劢态扩缩容等功能套件. 基 ...
- spring容器和springmvc容器,以及web容器的关系
说到spring和springmvc,其实有很多人分不清他们有什么区别,认为它俩是一样的,如果你问他项目里用的什么MVC技术,他会说我们用的spring和mybatis,或者spring和hibern ...
- kubernetes容器删除时快速释放ip的方案
问题的来由 在kubernetes集群的生产中,经常遇到这样的一个问题,就是在应用大规模更新时,大量容器删除而后大量容器创建,创建的容器需要很长时间才能就绪.这其中一个可能的原因,就是大量容器删除释放 ...
- Kubernetes容器上下文环境
目录贴:Kubernetes学习系列 下面我们将主要介绍运行在Kubernetes集群中的容器所能够感知到的上下文环境,以及容器是如何获知这些信息的. 首先,Kubernetes提供了一个能够让容器感 ...
- Docker Kubernetes 容器扩容与缩容
Docker Kubernetes 容器扩容与缩容 环境: 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 管理节点:192.168.1.79 ...
- Docker Kubernetes 容器更新与回滚
Docker Kubernetes 容器更新与回滚 环境: 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 管理节点:192.168.1.79 ...
- Docker Kubernetes 容器重启策略
Docker Kubernetes 容器重启策略 当容器被创建时,容器会根据重启策略来进行容器重启. 支持三种策略: Always:当容器终止退出后,总是重启容器,默认策略. OnFailure:当容 ...
随机推荐
- Rose的四种视图模型
用例视图 用例视图中包括了系统中的所有参与者.用例和用例图,必要时还可以在用例视图中添加顺序图.活动图等 逻辑视图 逻辑系统关注系统是如何实现用例中所描述的功能的,主要是对系统功能性需求提供支持,即为 ...
- Nodejs源码系列
一直想着看Nodej源码,断断续续的折腾了一下,但总串不起来,太久不看又忘记.决心每天看一点,特地记录在这里,作为逼迫自己的动力. 2019/09/22 一.源码编译 之前在电脑上了下源码,源码目录截 ...
- java IO流的API
常用的IO流API有:[InputStream.OutputStream] [FileInputStream.FileOutputStream] [BufferedInputStream.Buffer ...
- dtcms 手机浏览
private string GetSitePath(string webPath, string requestPath, string requestDomain) { //获取当前域名包含的站点 ...
- SpringBoot: 4.SpringBoot整合listener(转)
整合方式一:通过注解扫描完成 Listener 组件的注册 1.编写listener package com.bjsxt.listener; import javax.servlet.ServletC ...
- K8S知识点总结
一.K8S介绍: Kubernetes(k8s)是Google开源的容器集群管理系统.在Docker技术的基础上,为容器化的应用提供部署运行.资源调度.服务发现和动态伸缩等一系列完整功能,提高了大规模 ...
- LeetCode刷题4——子集
一.要求 二.知识点 1.回溯算法 回溯算法相当于穷举法加剪枝,回溯算法总是和深度优先同时出现的,采用深度优先策略回溯到根,且根节点的所有子树都被搜索一遍才结束,并剪掉不符合要求的结果 三.解题思路 ...
- 在windows系统电脑上同时安装python2.x和python3.x版本
在同一个电脑机子(windows系统)上安装同时安装python2.x和python3.x版本. 一.python2.x和python3.x安装 步骤1:在python官网(https://www.p ...
- day23 xml模块、面向对象编程介绍
今日内容: 1.xml模块 2.面向对象编程 一.xml模块 什么是xml? xml是一种可扩展的标记语言 xml语言的语法: <person name="jack"> ...
- libmkl 学习笔记
libmkl 学习笔记 1.libkml下载地址为: https://github.com/libkml/libkml/releases 这里下载1.3.0版本 2.编译与安装 mkdir build ...