lxd容器
持续部署
背景
旨在实体机资源不足的条件下,使用虚拟容器进行持续部署工作。
资源充足的条件下,可快速拉起多个部署环境进行验证,例如如下情况:
- 满足多人的机器使用需求:每个组件或每个人都可拥有自己的测试环境进,可规避其他人的修改对自身的影响
- 基于 feature 的测试验证需求:针对每一个 feature ,可以进行环境部署进行验证
- 基于多分支的测试验证需求:同时有多版本和多分支的情况下,可进行不同环境的部署
同时,自动化简化了部署需要的中间过程,更加高效。
目标
系统部署条件需求:
- ubuntu18.04 系统
- 服务通过 systemd 进行管理
基于以上条件,需要选择合适的容器进行部署。
技术
此处选择 lxd 的容器进行部署
1 简介
1.1 lxd
lxd 全称是 Linux容器守护程序(Linux Container Daemon),其实就是一个提供了 REST API 的 lxc 容器管理器,可以通过 API 进行容器的管理和控制。
lxd 构建在 lxc(Linux Containers)之上。lxc提供了容器技术的基础,而 lxd则是对 lxc进行了更高级别的管理和控制,提供了更多的功能和工具。
1.2 lxc
lxc 是 Linux Container 的缩写,也就是 Linux 容器,用于通过单个 Linux 内核在受控主机上虚拟运行多个 Linux 系统。
LXC起源于cgroup和namespaces,使得进程之间相互隔离。
1、lxc 使用内核的 Cgroups 功能,来提供进程和网络空间的隔离,来替代通过创建一个完整的虚拟机来为应用程序提供隔离环境。
2、lxc 就是一种轻量级虚拟化,将 Linux 进程沙盒化,使用的是 Linux 中的 namespace 技术进行资源隔离:
- pid namespace 隔离了进程,
- mount namespace 隔离了文件系统,
- network namespace 隔离了网络
2 使用场景
lxd 的使用场景介于虚拟机和 docker 容器之间。如果需要一个完整的系统,要在这个系统里面执行较复杂的操
作,比如mount、systemctl、snap之类的,这个时候docker容器可能就无法满足,但是虚拟机又
大笨重,一台机器开几个实例,宿主机就吃不消了。也就是说在需要大量轻量虚拟机的场景下,lxd 比较合适。
为什么选择 lxd 容器而不是 docker 容器?
docker 容器是一个应用程序级容器,它将应用和其依赖环境全部打包到一个单一对象中,在不包含完整的操作系统的情况下就能运行普通应用。并且,docker 容器通常不直接运行 systemd,因为 systemd 是 Linux 系统的 init 管理器,用于启动和管理系统服务,而 docker 容器通常只运行单个应用程序。如果使用docker来进行部署,systemd管理需要单独处理。
lxd/lxc 是一个系统级别的容器,和 docker 容器最大的不同是提供了完整的操作系统虚拟化。
总结:docker 容器是面向应用程序的,而 lxd/lxc 是面向系统的,它提供了一个完整的系统。
3 基本使用
3.1 安装和初始化lxd
lxd 的实例包括容器和虚拟机,此处只介绍容器。
在 ubuntu 上通过 snap 进行安装:
①安装 snap
查看版本,看是否已安装
>snap version
snap 2.61.1
snapd 2.61.1
series 16
ubuntu 18.04
kernel 5.4.0-150-generic
若未安装
sudo apt update
sudo apt install snapd
②安装lxd
sudo snap install lxd
若错误说明已安装,更新以确保最新版本
sudo snap refresh lxd
③初始化lxd,此处使用最小化
lxd init --minimal
3.2 创建并启动容器
①创建并启动一个新的容器,ubuntu:22.04为镜像,first为容器名
lxc launch ubuntu:22.04 first
这步会慢,需要下载镜像,如果网络无法下载,可使用export和import进行导出和导入
②创建并启动容器second
lxc launch ubuntu:22.04 second
这步会快些,因为镜像已经下载过了
③拷贝容器
# 执行拷贝
lxc copy first third
# 查看容器列表,可见拷贝出来的容器third不会自动启动
lxc list
# 启动容器,此处使用restart会报错
lxc start third
④查看容器详细信息
lxc info first
3.3 配置容器
可在创建时分配资源,如内存、cpu、磁盘等
①创建容器:限制一个vCPU和192M内存,limited为容器名
lxc launch ubuntu:22.04 limited --config limits.cpu=1 --config limits.memory=192MiB
②查看配置
lxc config show limited
③查看实体机和容器中限制
# 内存
free -m
lxc exec limited -- free -m
# cpu
nproc
lxc exec limited -- nproc
④容器运行时可更新配置
# 设置配置:limited为配置名
lxc config set limited limits.memory=128MiB、
# 检查配置
lxc config show limited
lxc exec limited -- free -m
3.4 与容器交互
①命令交互
# 交互式
# 执行命令:进入交互界面
lxc exec first -- bash
# 执行命令
cat /etc/*release
# 退出交互shell
exit
# 非交互式
lxc exec first -- apt-get update
lxc exec first -- apt-get install sl -y
lxc exec first -- /usr/games/sl
②文件导入和导出
# 从 lxd 容器中拉取文件或目录到本地系统
lxc file pull <container_name>/<remote_path> [<local_path>]
# 用于将本地系统中的文件或目录推送到 lxd 容器中
lxc file push [<local_path>] <container_name>/<remote_path>
3.5 快照管理
①创建容器first的快照clean
lxc snapshot first clean
②恢复快照
lxc restore first clean
③删除快照
lxc delete first/clean
4 常用命令
一、镜像
查看镜像:lxc image list
删除镜像:lxc image delete <fingerprint-or-alias>
导出镜像:lxc image export <image-alias> /home/exported-image.tar.xz
此处会生成两个文件
导入镜像:lxc image import 文件1.xz 文件2.root --alias <new-image-alias>
二、容器
查看容器:lxc list
创建容器:lxc launch <image-name> <container-name>
或:lxc launch <fingerprint> <container-name>
容器交互:lxc exec first -- bash或者lxc shell 容器名
停止容器:lxc stop <container-name>
删除容器:lxc delete <container-name>
强制删除:lxc delete <container-name> --force
三、配置
1、设置端口映射:
lxc config device add <container-name> <device-name> proxy listen=tcp:0.0.0.0:8080 connect=tcp:127.0.0.1:80
- proxy: 设备类型,表示端口代理。
- listen=tcp:0.0.0.0:8080: 定义在主机上监听的地址和端口。
- connect=tcp:127.0.0.1:80: 定义连接到容器内部的地址和端口。
2、设置磁盘目录/挂载目录:
lxc config device add <container-name> <device-name>t disk source=/host/path/path/on/host path=/container/path
3、查看所有设备:lxc config device list
四、快照
创建快照:lxc snapshot first clean
查看快照:lsx list first/lsx info first
恢复快照:lxc restore first clean
删除快照:lxc delete first/clean
实现
实际部署方案:
资源受限:只使用两个容器
容器1:作为基础安装验证
容器2:进行各组件的替换更新
资源不限制:
容器1:作为基础安装验证
容器...:针对每个feature验证时,创建新容器进行验证
参考:
1、官方文档:Canonical LXD documentation (ubuntu.com)
本文来自博客园,作者:circlelll,转载请注明原文链接:https://www.cnblogs.com/circlelll/p/18072036