持续部署

背景

旨在实体机资源不足的条件下,使用虚拟容器进行持续部署工作。

资源充足的条件下,可快速拉起多个部署环境进行验证,例如如下情况:

  • 满足多人的机器使用需求:每个组件或每个人都可拥有自己的测试环境进,可规避其他人的修改对自身的影响
  • 基于 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)

2、docker、LXC、LXD的区别及传统的虚拟机与操作系统虚拟化的区别_lxd容器-CSDN博客

3、LXC 和 LXD 容器总结_lxc lxd-CSDN博客

posted on 2024-03-14 08:41  circlelll  阅读(16)  评论(0编辑  收藏  举报