第三方容器管理工具 LXD 简介

1,894 阅读9分钟
原文链接: dockone.io

【编者的话】第三方调查报告显示LXD有潜质成为一款受欢迎的第三方容器管理工具。本文是LXD核心维护者、加拿大程序员Stéphane Graber有关LXD连载博文的第一篇。

@Container容器技术大会将于6月4日在上海光大会展中心国际大酒店举办,来自携程、PPTV、蚂蚁金服、京东、浙江移动、海尔电器、唯品会、eBay、道富银行、麻袋理财、土豆网、阿里百川、点融网等公司的技术负责人将带来实践经验分享,3月21日之前购票只需238元,欢迎感兴趣的同学抢购。
containers.png


[LXD 2.0系列开篇:是时候讨论LXD的一切了]
[LXD 2.0系列之一:LXD简介]
[LXD 2.0系列之二:LXD安装和配置]
[LXD 2.0系列之三:你的第一个LXD容器]
[LXD 2.0系列之四:资源管理]
[LXD 2.0系列之五:镜像管理]
[LXD 2.0系列之六:远程主机和容器迁移]
[LXD 2.0系列之七:LXD中的Docker]
[LXD 2.0系列之八:LXD中的LXD]
[LXD 2.0系列之九:在线迁移]
[LXD 2.0系列之十:LXD和Juju]
[LXD 2.0系列之十一:LXD和OpenStack]
[LXD 2.0系列之十二:调试和改进LXD]

LXD 2.0系列的第一篇博文,关于LXD的一些常见的问题。

LXD是什么?

简单来说,LXD是一个守护进程,为LXC容器的管理提供一组REST API。主要目标是提供一种类虚拟机的用户体验,当然用的是Linux容器而不是硬件虚拟化。

LXD和Docker以及Rkt之间的关系是什么?

这个是我们收到最多的问题,所以让我们赶紧把它解释清楚。LXD着重在于系统容器,也叫基础设施容器。即一个LXD容器上运行了一个完整的Linux系统,和它跑在物理机或者虚拟机上面时几乎一模一样。这些容器基于一个干净的发行版镜像,长期运行。传统的配置管理和部署工具都可以和LXD容器一起使用,这和你在虚拟机、云实例或者物理机上面使用时一样。区别在于,Docker关注点在临时的、无状态的、最小化容器上面,通常不会升级或重新配置,而是整个被替换掉。这使得Docker及相关的项目,不同于机器管理工具,而更接近于软件发行版的某些机制。当然,这两种模式并不是相互排斥的。可以肯定的是,你可以使用LXD为你的用户提供一个完整的Linux系统,然后又可在LXD容器之上安装Docker,来运行他们需要的软件。

为何要去做LXD?

我们在LXC上做了很多年。LXC的重要价值在于它提供了一套完整的底层工具库集来创建和管理容器。但是这套底层工具集使用起来并不是很方便。因为需要一些基本的知识,来理解能拿它来做什么且怎么使用。加上对老版容器和部署方法要进行向后兼容,使得LXC无法默认开启某些安全功能,这导致用户需要进行很多的手工配置。LXD就是这样一个机会来解决这些缺陷。利用长期运行的守护进程来解决LXC的很多限制,例如动态资源限制,容器有效的在线迁移,借助于这个守护进程,我们就能提供一个新的安全的用户体验,这也是很多用户所关注的。

LXD主要的组件有哪些?

这些主要的组件,在LXD代码目录结构中,以命令行客户端和API结构的形式呈现。

容器

LXD容器的组成
  • 根文件系统
  • 配置选项,包括资源限制,环境,安全选项等等
  • 设备,像硬盘,字符/块Unix设备,网络接口
  • 容器的配置组
  • 某些特征(容器的体系结构,非持久或持久性,容器名)
  • 某些运行时状态(当使用CRIU来做恢复)


快照

容器快照,也是容器,除了一个事实,即它们是不可变的,可以被重命名、销毁或恢复,但不能以任何方式修改。值得注意的是,由于允许存储容器的运行时状态,实际上给我们带来一个“有状态”快照的概念,即快照的回滚也包括CPU和内存的状态。

镜像

LXD是基于镜像的,所有的LXD容器都来自镜像。这里的镜像,类似于用作虚拟机或云实例的干净Linux发行版镜像。“发布”容器是可行的,通过容器的镜像生成,然后被本地或远程LXD主机使用。镜像是由唯一的SHA256哈希值标识,并可引用全部或部分的哈希值。因为长的哈希值不是特别人性化,镜像可用任意的长度来标识,并允许通过镜像商店进行简单的搜索。别名可用来设置一对一的映射,即在对用户友好的唯一字符串和镜像的哈希值之间的映射。LXD会预先配置三个远程镜像服务器:
  • Ubuntu:提供稳定的Ubuntu镜像
  • ubuntu-daily:提供Ubuntu每天的build
  • images:是一个社区运行的镜像服务器,使用上游的LXC模板提供其他Linux发行版镜像。


远程镜像由LXD守护程序自动缓存,自上次使用开始到过期之前,保持若干天(默认为10)。额外地,LXD也会自动更新得到远程镜像(除非另有说法),这样在本地也能保证镜像的最新版本。

配置组

配置组是预先定义好的一组容器的配置和设备,然后将它应用到任何数量的一组容器上。由于容器还可以应用多个不同的配置文件,所以当构建最终的容器配置(称为扩展过的配置)时,配置组将根据定义好的次序来依次应用,当出现彼此相同的键值或设备时按优先级覆盖。由于本地容器配置文件优先级最高,所以来自于配置组的文件会被覆盖。LXD附带两个预先定义好的配置组:
  • “默认”自动应用于所有容器,除非用户提供了另一个配置组。目前这个配置组只做一件事,为容器定义了一个“eth0”网络设备。
  • “Docker”该配置组可以应用到那些允许运行Docker的容器。它要求LXD加载一些必需的内核模块,打开容器嵌套,并设置了一些设备条目。


远端服务器

正如我前面提到的, LXD是一个网络守护进程。因此,命令行客户端,可以与多个远程LXD服务器,以及镜像服务器交互。默认情况下,LXD命令行客户端自带的定义如下:
  • local:默认,通过unix套接字和本地的LXD守护进程交互
  • Ubuntu:Ubuntu镜像服务器提供稳定的build
  • ubuntu-daily:Ubuntu镜像服务器提供每天的build
  • images:images.linuxcontainers.org镜像服务器


这些远端服务器的任意组合,均可以通过命令行客户端使用。您还可以添加任意数量的已配置网络监听的远程LXD主机。若公共镜像服务器,可以匿名;若远程管理容器时,则要通过身份验证。这种远程机制,可以通过与远程镜像服务器的交互来复制或迁移主机之间的容器。

安全性

这是LXD的核心设计,即保证尽可能的安全性,同时又能使现代Linux发行版可以不做任何修改直接运行。通过使用LXC库,LXD获得主要的安全功能包括:
  • 内核命名空间。特别是用户的命名空间,以此来保证容器所做的一切和系统隔离开来。 LXD默认使用用户命名空间(这和LXC不同),并允许用户按单个容器(标记为“特权”的容器 )来进行关闭。
  • Seccomp:筛选出具有潜在危险的系统调用。
  • AppArmor:对挂载,套接字,ptrace的和文件访问提供额外的限制,特别是限制跨容器通信。
  • Capabilities:以防止容器加载内核模块,改变主机系统的时间等等。
  • CGroup:限制资源使用和防止对主机的DoS攻击。


在LXC中,这些功能会直接暴露给客户。而我们已经建立了这种抽象,提供更人性化的配置语言。例如,一看就知道LXD传递哪个主机设备到容器中,而无需另外查找其主/次编号,手动更新该cgroup策略。LXD自身的通信,均使用TLS 1.2,且仅支持有限的密码组。当处理的主机的系统证书不属于合法颁发机构时, LXD会提示用户远程验证指纹(SSH的方式) ,然后将其缓存以供将来使用。

REST API

LXD做的一切都通过它的REST API完成。客户端与守护程序之间没有其他的通信方式。该REST API可以通过本地Unix套接字的访问,只需要进行身份验证,或者通过HTTPS套接字使用客户端证书进行验证。当需要更复杂的通信机制时,LXD将会使用WebSockets进行交互。这种方式会用于交互式控制台会话,容器迁移和事件通知。随着LXD 2.0带来稳定的/1.0 API,我们不会打破/1.0 API的向后兼容性,但是会通过额外的API扩展来增加新的功能。

容器的伸缩

虽然LXD提供了一个很好的命令行客户端,但是有了该客户端,并不意味着可以在多台主机上管理成千上万的容器。对于这种用例,我们建议使用nova-lxd,这是一个OpenStack的插件,用管理虚拟机的方式,来管理OpenStack上的LXD容器。当然这需要在大量主机上大规模部署LXD,并使用OpenStack API来管理网络,存储和负载平衡。

参考文献