谈谈DevOps和虚拟化

其实DevOps和虚拟化并没有多大关系,为什么要把这两个东西放在一起呢?如果有人跟我突兀的讲这两个词,我会联想到docker。其实也就是因为docker才有了这篇文章。此文只是简单的介绍,以后会抽出时间专门来分别介绍虚拟化技术、DevOps还有Docker。

背景

因为需要在内网中搭建一个私有云,一方面是提高硬件的利用率,另外提高系统的可用性和伸缩性。如今有很多云平台可用,但是由于某些安全原因,我们不能使用开放的平台。之前是在几台bare metal上安装了Citrix xen server,使用一个Windows机器上安装xen Center来连接Xen server安装了一些CentOS6.4,之后在这些CentOS上使用Anbari部署Hadoop集群,用来处理的大量的GIS数据。然后有一天Hadoop的master节点无故宕机了,导致整个Hadoop集群就不可用了。老大想探索新方法来增强系统的可用性,另外的要求是系统宕了之后,如果可能,能够迅速的切换到其他的环境下,部署并运行,而不需要在部署Hadoop好之后才能重新运行集群。

总结起来就提出了以下几个要求:

  • 硬件高利用率
  • 高可用性
  • 伸缩性
  • 快速部署和运行

使用虚拟化技术可以从一定程度上提高硬件的利用率;在分布式环境中,提高可用性可使用反向代理和热备的方式;系统的伸缩性由Hadoop来控制,增加节点不是难事;至于快速部署运行,我首相想到的是Docker和vagrant,他们都是DevOps的有理工具。本文将简要介绍以上几个方面。

虚拟化技术

使用虚拟化技术能够提高硬件的利用率,因为如果一台物理机只跑一个应用或者服务的话,cpu的利用率的均值不会很高,当采用虚拟化技术,同时运行多个虚拟机OS的时候,可以提高cpu的利用率均值。

当今虚拟化技术可以分为以下三种:

  • Type1 Hypervisor
    • Xen (Citrix)
    • KVM (FOSS)
    • Hyper-v (MicroSoft)
  • Type2 Hypervisor
    • VMWare Fusion
    • Virtual Box (Oracle)
    • Parallels
  • Container
    • Docker
    • LXC (IBM Linux Containers)
    • nspawn

两种Hypervisor的区别如下图所示:

compare0.png

以上两种Hypervisor的最大区别是,Type1 Hypervisor是直接安装在裸机上的,然而Type2 Hypervisor是安装在桌面操作系统上的。

Docker与LXC和Hypervisor的关系如图所示:
compare.png

Hypervisor虚拟化技术添加了一个Hypervisor层,Hypervisor层来模拟虚拟机运行所需要的硬件功能,然后虚拟机跑在这些Hypervisor之上,也就是说Hypervisor是硬件级别的虚拟化。Hypervisor需要对整个硬件设备进行抽象(包括cpu,网络,外部设备等)。
然而Container虚拟化则是操作系统级别的虚拟化。每一个Guest container操作系统与Host主机共享同样的内核,有时候甚至可以共享部分操作系统,正因为如此container可以扔掉hypervisor VM中99%的虚拟机垃圾,保持一个瘦小,简单的容器来保持你的应用。container值需要对操作系统进行抽象。
另外,Google在很早以前就开始投入到容器的研发和使用中了,现在Google几乎所有的应用都是跑在container里的,比如google search, Gmail, Google Docs等等。

container的这种方式有以下优点:

  • 虚拟机与Hypervisor相比更小
  • container之间共享资源效率更高(多个container打开一个文件,只需要在HOST内核中管理一个打开句柄,二Hypervisor则每个VM中需要各自打开)
  • container更节约内存(Hypervisor需要为各个vm的内核分配内存,而且启动VM之前需要预先分配好内存大小)
  • 启动和关闭更快(因为在HOST眼中就是一些进程,秒级别)

由于以上几点,那么:

  • 同样的物理机,可以打开更多的container
  • 由于更轻量级,并且资源利用率更高,如果用container来搭建VPS服务,或者PaaS的时候则更节省资源
  • Hypervisor更适合用来搭建IaaS(个人观点)
  • 随着container的出现,产生了微服务架构的概念。

Docker环境的条件

比较了Hypervisor和container之后,显示出了container的优势,然后安装Docker也需要一些基本的前提条件。

  • 目前只支持64位CPU架构的计算机(目前只能是x86_64和amd64),不支持32位CPU
  • Linux3.8或者更高的内核版本,2.6.x或者之后的或许也能运行,但是可能出现问题
  • 内核必须支持一种合适的存储驱动,例如Device Manager/AUFS/vfs/btrfs等
  • 内核必须支持并开启cgroup和命名空间namespace功能。

DevOps

vs.png

Wikipedia对DevOps的解释如下:

DevOps is a software development method that emphasizes communication, collaboration (information sharing and web service usage),integration, automation, and measurement of cooperation between software developers and other IT professionals. The method acknowledges the interdependence of software development, quality assurance (QA), and IT operations, and aims to help an organization rapidly produce software products and services and to improve operations performance.

devopsguys.jpg

我理解的DevOps是一个团队角色。即懂开发、测试又懂运维。传统的团队,开发团队、测试团队和运维团队往往是分开的,这往往降低了交流与合作的效率,然而DevOps角色的出现能够有效解决这方面的问题。

DevOps这个词和full stack有些像,是颇具争议的。Jeff Knupp就对DevOps持反对意见,可见他的文章《How ‘DevOps’ is killing the Developer》,最近玉伯和耗子在微博中的辩论也与这个有关,耗子就倾向于小而美的团队,一人掌握多技能和职责.

从Developer到DevOps

timeline.jpg

Developer非运维人员,一般只专注于代码部分,职能中不会涉及到代码完了之后的过程,这些过程包括持续集成中的自动构建和测试、服务器配置、部署、发布等。DevOps除了写好代码之外还应该能够掌握从代码完成到上线的整个过程。

作为一名开发人员,需要突破自己的局限,向DevOps方向扩展自己。这个过程中除了需要了解从代码到产品上线的整个流程之外,就只剩下学习一些常用的工具了。我觉得从Developer到DevOps需要学习以下几个方面的知识:

  • 自动化(Automation)
  • 持续集成(Continuous Integration)
  • 持续测试(Continuous Testing)
  • 持续交付(Continuous Delivery)
  • 持续监控(Continuous Monitoring)

总结起来就是学习一堆运维方面的工具。

自动化配置管理

  • Ansible
  • CFEngine
  • Chef
  • Puppet
  • SaltStack
  • RANCID
  • Ubuntu Juju

持续集成

  • 版本控制 SVN/Git
  • simicity
  • Jenkins
  • Travis
  • BuildHive

持续交付

  • Capistrano
  • Fabric
  • Ansible
  • Jenkins

持续监控

  • New Relic APM(code-level,监控性能问题)
  • New Relic Server (infrastructure-level,监控cpu内存之类)

其他

  • Vagrant
  • Docker

Vagrant & Docker

差点跑题了,立马打住,以上只是为了介绍DevOps这个概念,其实主要是为了引出Vagrant和Docker,这两个DevOps工具。这两个工具的核心思想就是,”一次配置,到处运行”,这个正好能够解决背景中提出的第四个需求。

Vagrant是一个虚拟机管理软件,然而并没有什么卵高级的,但是他还是给DevOps提供了不少帮助,它与普通的虚拟机(像VMWare/VritualBox/Parallels)相比,它的虚拟机经过裁剪,更节省内存,所有的操作通过vagrant命令进行,非常适合喜爱命令行的用户。与Docker相比,它的使用逻辑更符合传统的虚拟机的做法。

Docker的使用不像是传统的虚拟机桌面软件,并且默认不支持ssh登陆,所以使用逻辑有点怪异,毕竟Docker较Vagrant的优势在于在生产环境下的高效性能。

关于Vagrant和Docker该用哪个,其实两者并不冲突,或者某些场景两个可以结合起来使用。
StackOverflow上有Vagrant作者Mitchell和Docker作者Solomon关于他们的对比和应用场景介绍。见Should I use Vagrant or Docker.io for creating an isolated environment?

Reference