LXD 通识
Posted on September 11, 2023 (Last modified on June 19, 2024) • 6 min read • 2,825 words关于 lxd 一些基础通识
对于本地私有云一直想弄一个工具包级别的解决方案,类似 vultr 的实例创建方案。原本考虑集成 kvm/qemu 的轻量化 openstack 的开源框架去实现。 考虑到轻量和技术迭代趋势,Vagrantfile 自己用了很久了,想换换口味。openstack 的笨重,可能在小规模的场景下并不适合,仅针对自己测试开发环境。 想过是否要用 pve 去替代。看了一些博文后,结合自己的需求,大致有两个重点方向:
一、kvm allinone,配置化的 cli 二、lxd
kvm 部署维护过,就探索下 lxd , 想感受对比下两者的差异。 部署 lxd 的部分,过程略。部署不像 vagrant 一样设置和安装很多东西。lxd 的概念,似乎与 lxc 一直不能摆脱。要说他们的异同。根据资料总结,lxd 就是增强版本的 lxc。 lxd 主要是为构建完整的操作系统容器而存在。所以相比与单纯的 docker Ubuntu/Centos 等镜像,针对操作系统这个方面,lxd 的容器镜像兼容性会更好一些。注意,lxd container image 和 docker image 是两种类型的东西。
本地使用的 Ubuntu 20 的测试机器,使用源安装 lxd 4.0.4 的 stable 版本,并未选择安装 latest 5.0 的版本。 根据 4.0 版本文档,源查找镜像,安装镜像也非常容器,下面简单举例:
root@agub20 ~ $ lxc remote ls
+-----------------+------------------------------------------+---------------+-------------+--------+--------+
| NAME | URL | PROTOCOL | AUTH TYPE | PUBLIC | STATIC |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+
| images | https://images.linuxcontainers.org | simplestreams | none | YES | NO |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+
| local (current) | unix:// | lxd | file access | NO | YES |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+
| ubuntu | https://cloud-images.ubuntu.com/releases | simplestreams | none | YES | YES |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+
| ubuntu-daily | https://cloud-images.ubuntu.com/daily | simplestreams | none | YES | YES |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+
# lxc image list images:
# lxc image list images: | grep -i ubuntu
# lxc image list images: | grep -i debian
## 部署 centos7 实例
lxc launch images:centos/7/amd64 test-lxc-centos7
当然你也可以使用指定配置 -p,或者指定挂载目录 -s 去启动容器实例。
lxc image 的镜像主要分为两类:CONTAINER,VIRTUAL-MACHINE
lxd 可以部署 container 容器实例,也可以部署 virtual-machine 实例。如需部署 virtual-machine 实例的话,需要在 launch 后加 --vm
参数。
举例(部署 centos7 虚拟机):
lxc launch images:centos/7/amd64 --vm test-lxc-centos7-vm
注意:部署 vm 实例,需要满足虚拟化的条件,可使用命令查询当前环境是否支持(有输出表示支持):
egrep -o '(vmx|svm)' /proc/cpuinfo
在初始配置 init 的时候,会需要选择 lxd container 需要的网络 IP 段问题, 可以自行指定任意网段。 比如使用了 192.168.61.1/24 的网段。
## 格式:lxc config device <container name> <config name> proxy <listen option> <connect option >
## 临时暴露 container ssh port 22 给宿主机 10000 端口方便外部服务器访问
## lxc config device add test proxy_ssh proxy listen=tcp:0.0.0.0:10000 connect=tcp:0.0.0.0:22
## 将本地的 lxd container test-lxc-centos7 22 端口映射给宿主机 10.66.253.248 的 10000 端口,并把这条映射规则命名为 proxyssh-test-lxc-centos7
lxc config device add test-lxc-centos7 proxyssh-test-lxc-centos7 proxy listen=tcp:10.66.253.248:10000 connect=tcp:192.168.61.119:22
## 还可以做更进一步的限制,比如仅允许通过当前宿主机作为跳板,在ssh访问容器
lxc config device add test-lxc-centos7 proxyssh-test-lxc-centos7 proxy listen=tcp:10.66.253.248:10000 connect=tcp:192.168.61.119:22 bind=host
## 如果你更改了 lxd container 实例IP,想跟新配置,可以参考如下的命令:
lxc config device list test-lxc-centos7-1 ## 获取当前实例的proxy的名称为:proxyssh-test-lxc-centos7
lxc config device set test-lxc-centos7-1 proxyssh-test-lxc-centos7 listen=tcp:10.66.253.248:10000 connect=tcp:192.168.61.127:22
## 在 RUNNING 状态下更换IP,可参考
lxc config device override test-lxc-centos7 eth0 ipv4.address=192.168.61.123
lxc restart test-lxc-centos7
lxc ls
除此外,lxd container 也可以设置使用宿主机的 dhcp server, 不用考虑映射层面的问题。
## 举例,打包名为 test-lxc-centos7-1 虚拟容器, 加 --optimized-storage 参数,做数据压缩。
lxc export test-lxc-centos7-1 test-lxc-centos7.tar.gz --optimized-storage
lxc import test-lxc-centos7.tar.gz
lxc start test-lxc-centos7-1
## 宿主机本地直接克隆 test-lxc-centos7-1 生成 test-lxc-centos7-2,并给新副本设置 IP
lxc copy test-lxc-centos7-1 test-lxc-centos7-2 -d eth0,ipv4.address=192.168.61.34
容器实例导出有其实有 export , publish 两种,他们的区别,
lxc publish
does not retain the instance’s configuration, where aslxc export
does.
Also
lxc export
will also backup snapshots, thatlxc publish
does not. Solxc export
is for backing up a particular instance so it can be restored in the event of data loss.lxc publish
isn’t for backup at all, and is for publishing an image from an existing instance so it can be used to create one or more instances from it.
经过实测,
export
导出导入是完整的迁移,迁移运行后,待副本启动,IP也为之前的。
publish
导出导入,存储的文件、服务及包都在,只是些许配置不在,IP会重新分配生成。更多细微区别,待更多测试。
当然也可以把当前的容器实例发布为镜像供自己使用。举例:将实例提交为别名为 centos79_dk 的镜像。
lxc publish test-lxc-centos7-1 --alias centos79_dk
私有镜像的打包
lxc image export centos79_dk lxc409_image_centos79dk
导入的时候,也可以自定义镜像别名:
lxc image import <image_name>.tar --alias <image_alias>
lxd launch 一个容器服务 test-lxc-centos7-1,在这个容器内部可以继续安装 docker-ce。若想在 lxd 内部使用 docker, 需要在加载容器服务后,增加如下的配置,否则会有权限报错。
lxc config set test-lxc-centos7-1 security.nesting=true
kubernetes inside lxd 也有很多的例子。
为了用的更好,更舒服。lxd 比较依赖模板和私有化的定制镜像。官方和三方的源,仅提供标准容器镜像,模板私有化使用的时候,需要自行做 publish(commits) 的包定制。
root@agub20 ~ $ lxc remote ls
+-----------------+------------------------------------------+---------------+-------------+--------+--------+
| NAME | URL | PROTOCOL | AUTH TYPE | PUBLIC | STATIC |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+
| images | https://images.linuxcontainers.org | simplestreams | none | YES | NO |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+
| local (current) | unix:// | lxd | file access | NO | YES |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+
| ubuntu | https://cloud-images.ubuntu.com/releases | simplestreams | none | YES | YES |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+
| ubuntu-daily | https://cloud-images.ubuntu.com/daily | simplestreams | none | YES | YES |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+
lxc image list images: |grep -i centos
## 查看本地images镜像的信息
lxc image info 5f0f7a9589c6
## 查看remote远程仓库镜像的信息
lxc image info mirror-images:01a2eaafd432
lxc-images 清华大学开源软件镜像站 lxc-images tencent Image server infrastructure - News - Linux Containers Forum
比如我想找一个 centos7.2, centos7.6 的 container image, 其实不好找到的。官方 centos7 的镜像,跟新到了 7.9。且 centos7 镜像标识没有精确到 7.x。 而 Ubuntu 和 别的镜像源,都有具体的版本 tag 标签。所以当你需要找到指定 centos 7.x 或者国内特殊的镜像比如麒麟,龙蜥等等镜像,这个是没有的,就需要自己定制。
你说他有啥优势,几个例子展现下。
例子1:多人使用一台GPU服务器,怎么最简单方便分配大家各自所需的资源并保持隔离?
以往会考虑 allinone 的 Ubuntu18 宿主机,kvm 虚拟化的办法。现在直接使用 lxd, 部署效率和分配效率会快很多。
例子2:想快速在服务器上虚拟化分出一台 linux 机器,用来临时测试,又不用在云界面手动 clone 机器?
底层几条简单的 copy 命令就可以直接实现了。因为轻量化,高效和便捷是他的特性,不需要一堆的预配置,几条安装命令,就可以直接用了。真的属于开箱即用的产品。 如果有 lxc profile 模板配置,那就更方便了,这点类似 Vagrantfile。根据配置文件,即可快速拉起指定配置的测试机器。
注意 lxd 的版本,在版本4和版本5上的 storage 设置有区别。因为支持 btrfs, zfs, lvm ,dir 等等 drive 格式。不同类型的磁盘设置类型,扩容和设置的方法都有区别。
在 lxd 容器实例内部,看不到当前容器实例内部准确的内存、磁盘大小情况。具体表现在,限制一个容器实例的磁盘大小,进入容器后,df -h 看不到对应限制后的大小,仍然会显示未限制的大小。内存也会如此。资源限制很方便,但是不能在容器内部同步看到限制后的大小,这算一个缺点把。docker image 可以很轻松的转换为 lxd container image 去使用, 但是不能反着来。
对于 lxd 的概念,刚开始总会想到 docker, containerd。 实际上三者还是有点区别的,使用场景也不一样。比如因为 dockershim 在 kubernetes 社区的维护变的越发的臃肿和困难后,k8s 1.20 版本的逐步放弃对 docker 的支持,改投了 containerd。docker run 容器实例,和 lxd 启动的容器实例,两者在维护使用方式上,区别也非常的大。
三者其实都是容器,但是针对具体的场景区别,造就了三者的差异。就像红帽的 podman 一样,也是容器。只是平时自己的业务场景下,几乎见不到,自然不会把这个交织到当前的对比列表里面。仅当前有限的使用时间来看,lxd 替换 Vagrantfile 作临时测试环境还是很 nice 的,非常方便。可能正是因为太灵活,自己目前没把握把他用到生产里面。