LXD 通识

Posted on September 11, 2023 (Last modified on June 19, 2024) • 6 min read • 2,825 words
Share via
 
 
 
 
 
 

关于 lxd 一些基础通识

LXD 通识
Photo by CHUTTERSNAP on Unsplash

背景  

对于本地私有云一直想弄一个工具包级别的解决方案,类似 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

网络映射访问  

在初始配置 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 两种,他们的区别

经过实测,

export 导出导入是完整的迁移,迁移运行后,待副本启动,IP也为之前的。 publish 导出导入,存储的文件、服务及包都在,只是些许配置不在,IP会重新分配生成。更多细微区别,待更多测试。

当然也可以把当前的容器实例发布为镜像供自己使用。举例:将实例提交为别名为 centos79_dk 的镜像。

lxc publish test-lxc-centos7-1 --alias centos79_dk

私有镜像的打包

docker inside lxd  

lxd launch 一个容器服务 test-lxc-centos7-1,在这个容器内部可以继续安装 docker-ce。若想在 lxd 内部使用 docker, 需要在加载容器服务后,增加如下的配置,否则会有权限报错。

lxc config set test-lxc-centos7-1 security.nesting=true

kubernetes inside lxd 也有很多的例子

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 的,非常方便。可能正是因为太灵活,自己目前没把握把他用到生产里面。


Comments

Follow me

I'm involved in Kubernetes coding and share developer memes.