生命不息,折腾不止。在折腾中成长,在踩坑中进步。
前言
不错,再一次折腾了一把,这次是把测试环境的hadoop集群从KVM中迁移到了LXD容器中。目前运行很稳定,这次就来分享一下这次的体会和一些感受吧。
由于这篇blog并不是纯技术文章详细介绍LXD搭建和维护的,只是谈谈使用的一些感受体会,所以不会有详细的安装和使用的过程了,感兴趣的读者可以找官方文档去实践。不过这玩意目前来看文档确实比较少,好在使用特别简单。
LXD vs KVM
关于KVM可能很多人都不陌生,谈到Linux下的虚拟机,津津乐道的就属KVM和XEN了。这里我不打算对KVM进行拓展了,关于市面上KVM的资料已经烂大街了。测试环境少不了虚拟机,通过虚拟化隔离资源的特性,可以充分利用物理机的资源,扩充机器数量。不过当初研究KVM的时候,着实痛苦了一把。配置相对繁琐,为了性能还需要启用部分硬件的半虚拟化支持,当时记得还买过一本《深度实践KVM》研读来着。
现在具体谈谈LXD吧。不得不说,宣传也是很重要的一项工作,Ubuntu对这玩意的宣传可以说不遗余力,很多地方都能看到LXD的消息。我个人比较喜欢Ubuntu的一些技术,平时也关注一些Ubuntu社区的动向。在我看来,ubuntu的更新节奏较快,总是能尽快的吸纳新的技术用于生产,跟着Ubuntu的节奏总是能尽快的接触到新奇有趣的东西。LXD也是ubuntu的母公司Canonical的开源项目,自然在Ubuntu的相关主页上是各种强推的(一样有此待遇的还有snaps安装包,不过我还没抽出时间去折腾,因为这玩意目前对我的吸引力还远没有达到LXD的地步)。而且又是容器级虚拟化的技术,在2013年底我开始自学Docker的时候就接触过容器虚拟化技术,对我而言也不算太陌生。由于docker的好感度,所以我对LXD的技术就比较容易接受,也比较信赖这玩意的性能(docker最早宣传的就是容器级虚拟化的性能)。于是就有了后来的逐步探索。
至于LXD的周边支持问题,当然现在还没法跟流行已久的KVM,XEN相比,更别提开源新星docker了,所以想大规模用于生产的话还需谨慎考虑。目前只有nova有LXD驱动支持,也就是说能用OpenStack管理,至于其他流行的管理工具,目前还是空白(不过看到社区已经有人给kubernetes递交issue请求支持LXD了)。未来也许会有更多的支持加入。
这是LXD官方(Ubuntu)的一篇吹嘘文章: https://insights.ubuntu.com/2015/05/18/lxd-crushes-kvm-in-density-and-speed/
老实说,也正是这些文章比较多(也许是软文?),让我下定决心实际应用一下。
关于使用体验
这篇blog我并没有打算详细介绍安装和使用方法,这些官方文档都有,也不难,我只说说体会。
首先是,简单,清爽。没错,安装过程确实简单,几乎0配置,配置项也不多,相比kvm和xen那些繁杂的配置项来看,的确清爽了许多(本来也就是直接使用了真机的硬件,自然相比全虚拟化和半虚拟化的技术要少了好多关于硬件的参数)。安装包容量也不大,装一个lxd
以及lxd-client
软件包就行了。使用也足够简单,命令行的那几个参数一眼就能看出含义,不用费心的去猜想含义。
其次,是管理的方便。直接在命令行下就可以同时操作本地和远程仓库。搭建私有仓库也极其便利,非常类似于git的那种分布式操作,子命令remote的使用方式和参数几乎也跟git remote
如出一辙。在这个节点上的镜像天生就能直接被其他节点访问,同时启动成容器。
最后,是胖容器本身的一些特点。同样是容器级虚拟化技术,docker是所谓的瘦容器
,讲究一个容器只跑一个进程,这个进程的pid是1
,更像是一种临时的,无状态的存在,并不考虑升级和更新,而是整个替换掉。所以docker的镜像要求一般是尽可能的精简,以减少传输的负载。可以发现docker的镜像仓库基本提供的都是服务。而LXD基于LXC这种胖容器技术改良,给你提供的镜像基本都是操作系统基本的rootfs,是没有docker的这种限制的,对外的表象更像是一个完整的虚拟机。你可以像KVM那样,把所有的依赖以及操作系统打包成一个镜像运行,某些依赖比较重的程序,无法用单进程运行,不适合在docker中跑,但在LXD的容器中就没问题了。
更令我震惊的是,LXD的镜像不但表现的像虚拟机一样,甚至还支持创建快照和dump内存这种虚拟机才有的功能。LXD的快照功能是可以连内存状态一并保存下来的,就是那种虚拟机基本都支持的快照恢复功能。同时还支持暂停/恢复容器(pause/start)的功能,简直虚拟机有的几个强大的功能这玩意几乎都有,而且比虚拟机更加轻量。
速度快。这个无需多言,用过docker的人都知道,秒级启动。
资源在线配置,无需停机重启。得益于容器虚拟化的轻量设计,完全可以在线调配资源不用重启。我试过对运行中的容器重新分配CPU,内存,甚至调整硬盘空间等,都不用重启容器,即改即生效。这个特性就已经比虚拟机爽太多了。
底层依赖十分前卫
这个话题单独拎出来说,因为这个是我最大的一个感受。
首先先看看官方对于LXD特性支持的表格,几乎LXD的主要特性都得ZFS来支持,同时ZFS还是LXD的推荐存储引擎。ZFS本身是一个非常先进的文件系统,但是一直没有稳定到投入生产环境使用,在我印象中似乎只有Ubuntu 16.04这个Linux发型版才把ZFS加入了默认支持的文件系统。
要想LXD玩的爽,只能在Ubuntu 16.04以上版本体验,想在14.04 LTS上运行,得加几个ppa仓库了,比如zfs-stable, lxd等等(顺带一提,中科大开源镜像站提供ppa的反向代理加速)。一些更cool的特性比如LXD容器中运行docker容器,在线迁移容器等,甚至还要Linux内核版本4.4以上(Ubuntu 16.04自带,Ubuntu 14.04需要安装linux-generic-lts-xenial),而某些特性即使Ubuntu 14.04 LTS从zfs-stable这个ppa安装了zfs模块之后,也无法使用。不过总体来说,Ubuntu 14.04运行LXD基本还是够用的,一些极少会用到的功能和特性并不影响实际体验。
目前遇到的几个问题
先要有一个前提认知,这是在容器中操作,资源会受到限制,不是什么文件都能改,什么资源都能读取的,这个和docker是一样的。有些权限需要开启security.privileged: "true"
这个参数的。总体并没有虚拟机那么自由,无拘无束。不过对于测试环境只是需要简单的隔离环境这种需求来说,是足够用的。
第一是swap的问题。目前的lxd的容器配置参数中并未提供swap容量限制的参数,仅有enable
和disable
,即使disable
,在容器中依旧会看到swap,我咨询过官方(见此issue),原来只是vm.swapiness=0
而已,并非卸载掉swap。
其次是有些软件识别可能会出现问题。比如我用的cloudera manager管理hadoop集群,会发现容器中的内存显示的不对,显示出来的每个节点都是真机的内存,而不是容器中用free
命令看到的内存,同时,群集IO也无法显示,日志中会报一些permission denied的错误。
最后是目前来看,提供LXD/LXC镜像的仓库实在是少。ubuntu自然不用多说,官方直接在ubuntu-clouds仓库提供官方支持与维护。而其他操作系统的镜像基本只能在linuxcontainers.org找到一份托管,大多还不是官方维护。(顺带一提,清华大学tuna镜像站提供LXD/LXC镜像仓库的镜像加速)
后记
总的来说,LXD还是给了我太多惊喜,大大超出了我的预期。我已经把个人环境使用的Linux虚拟机(主要是ubuntu和centos)都换成LXD了,启动速度快,功能一点不比虚拟机差。当然,没图形界面,容器中跑图形界面也没那么方便,还得跑个vnc服务。
至于参考资料,还是官方开发者的那个教学最有参考价值,国内有翻译版本,不过没有翻译完: https://www.stgraber.org/2016/03/11/lxd-2-0-blog-post-series-012/
以后等LXD操作更加便捷的时候也许会写个blog详细总结下LXD的一些操作使用。
来源:oschina
链接:https://my.oschina.net/u/1395553/blog/759213