关于虚拟化:LXD-虚拟化平台1简介

27次阅读

共计 7089 个字符,预计需要花费 18 分钟才能阅读完成。

一、虚拟化技术的简介

LXD 是目前市面上泛滥虚拟化的解决方案之一,在开始介绍 LXD 之前,须要对虚拟化技术进行简略的介绍。目前业界的虚拟化个别分为两种解决方案:内核虚拟化与硬件虚拟化。

1.1 内核虚拟化

硬件虚拟化字面义了解就是须要硬件设施来反对,须要在服务器上安装虚拟化管理软件(HyperVisor),而后通过 HyperVisor 提供的交互治理界面来创立虚拟机。市面上比拟常见的硬件虚拟化如:VMware、SmartX 等。

虚拟机在操作系统层面上和宿主机隔离,领有本人独立的内核,应用上和一般的主机没有任何区别,领有较高的安全性,然而因其独占式的资源应用形式,耗费的资源比拟多,容易产生节约。个别状况下调配的虚拟机资源不能超过宿主机的资源总量(例如 CPU 或者内存、磁盘容量),否则会引发宿主机解体。

硬件虚拟化须要在主板 BOIS 零碎开启 VE 虚拟化反对(Intel 主板为 Intel VT,AMD 主板为 AMD-V),能够通过执行以下的命令来查看是否已开启硬件虚拟化:

egrep -c '(vmx|svm)' /proc/cpuinfo

如果命令执行有输入,即代表反对硬件虚拟化。

留神,硬件的虚拟化技术分为 Type-1 和 Type-2:

  • Type-1 HyperVisor:间接运行在裸金属设施上,在内核空间实现硬件的虚拟化,例如能够间接把 vCPU 绑定到物理 CPU 上进行调配,vCPU 的指令无需通过 CPU 虚拟化的代码进行模仿转换,例如 VMware ESXi、Citrix XenServer 等;
  • Type-2 HyperVisor:运行在操作系统之上,在用户空间实现硬件的虚拟化,常见的如 QEMU、VirtualBox、VMwareWorkStation。在性能上相比 Type-1 较差,然而应用简略、不便。

1.2 内核虚拟化

内核虚拟化,顾名思义就是通过内核个性来实现虚拟化的操作,内核虚拟化的关键技术是 Cgroup 和 Namespace。Cgroup 负责对虚拟机应用资源的限度(虚拟机能用多少 CPU、内存和磁盘容量、磁盘 IO 速率等),Namespace 负责对虚拟机的视图进行隔离(虚拟机能看到什么不能看到什么),例如 LXC Container、Docker 等就是常见的内核虚拟化解决方案。

  • Cgroup 和 Namespace 技术细节较多,能够参考 Segmentfault 上的相干材料,例如:https://segmentfault.com/a/1190000040980305
  • Container 和 Docker 不是同一个概念,Container 代表的是容器自身,而 Docker 则是一种实现容器的技术,业界有十分多实现容器的技术,例如 Kata Container、Containerd 等等,切不可把两者一概而论。

内核虚拟化和硬件虚拟化相比:

  • 轻量:容器的实质上是一个应用了 Cgroup 和 Namespace 限度的操作系统过程,过程的创立、销毁等效率十分高。
  • 高效:内核虚拟化对资源的应用是共享式,能够对宿主机的资源(CPU、内存、磁盘容量、磁盘读写带宽等)进行充沛的利用,特地是磁盘的 IO 性能,例如:硬件虚拟化对磁盘的性能损失是十分重大的,没有通过优化的 KVM 磁盘 IOPS 相比宿主机会降落几十倍到几百倍。
  • 便携:容器镜像的大小个别就是操作系统内核 +Shell 相干程序的大小,几十 MB 到一百多 MB 左右,而虚拟机镜像大小动辄数十 GB,难以在生产环境疾速部署。
  • 危险:内核虚拟化的隔离性相比虚拟机差,没有通过平安配置的容器过程,容易被入侵从而导致宿主机的操作系统被攻打引发安全事故。

能够看出,硬件虚拟化和内核虚拟化实用于不同的场景,在许多生产环境上,硬件虚拟化 + 内核虚拟化是搭配应用的,硬件虚拟化用于硬性隔离宿主机的资源,调配多个独立的环境用于多套业务零碎应用;而后在虚拟机上,应用内核虚拟化技术的个性,疾速部署、散发业务程序。

二、LXD 的简介

与市面上的 VMware、SmartX 等虚拟化解决方案一样,LXD 是一个开源的零碎容器与虚拟机的 Linux 虚拟化治理平台。

LXD 能够同时反对对内核虚拟化和硬件虚拟化,内核虚拟化由 LXC Container 提供,硬件虚拟化目前只反对 KVM 虚拟化。

LXD 的次要性能如下:

  • 镜像治理
  • 实例治理
  • 存储管理
  • 网络管理

在开始应用 LXD 之前,须要对 LXD 进行装置与初始化。

2.1 初始化 LXD

LXD 作为虚拟化治理服务,在宿主机上启动 LXD Daemon 和 LXCFS Daemon 2 个外围过程:

  • LXC Daemon:负责保护 LXD 平台下的所有虚拟化服务,包含实例治理、镜像治理、存储管理、网络管理等等;
  • LXCFS Daemon:负责保护 LXC Container 的文件系统;
  • lxc 命令行:负责与 LXD Daemon 进行通信,执行虚拟化平台的各项的治理操作。

本文基于 Ubuntu 22.04 零碎,提供一个 LXD 装置的案例。

2.1.1 优化内核参数

编辑 /etc/sysctl.d/99-sysctl.conf 文件,增加以下的内容:

net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_reuse = 1

## The following changes have been made for LXD ##
# fs.inotify.max_queued_events specifies an upper limit on the number of events that can be queued to the corresponding inotify instance - (default is 16384)
fs.inotify.max_queued_events = 1048576

# fs.inotify.max_user_instances This specifies an upper limit on the number of inotify instances that can be created per real user ID - (default value is 128)
fs.inotify.max_user_instances = 1048576

# fs.inotify.max_user_watches specifies an upper limit on the number of watches that can be created per real user ID - (default is 8192)
fs.inotify.max_user_watches = 1048576

# vm.max_map_count contains the maximum number of memory map areas a process may have. Memory map areas are used as a side-effect of calling malloc, directly by mmap and mprotect, and also when loading shared libraries - (default is 65530)
vm.max_map_count = 262144

# kernel.dmesg_restrict denies container access to the messages in the kernel ring buffer. Please note that this also will deny access to non-root users on the host system - (default is 0)
kernel.dmesg_restrict = 1

# This is the maximum number of entries in ARP table (IPv4). You should increase this if you create over 1024 containers.
net.ipv4.neigh.default.gc_thresh3 = 8192

# This is the maximum number of entries in ARP table (IPv6). You should increase this if you plan to create over 1024 containers.Not needed if not using IPv6, but...
net.ipv6.neigh.default.gc_thresh3 = 8192

# This is a limit on the size of eBPF JIT allocations which is usually set to PAGE_SIZE * 40000.
#net.core.bpf_jit_limit = 3000000000

# This is the maximum number of keys a non-root user can use, should be higher than the number of containers
kernel.keys.maxkeys = 2000

# This is the maximum size of the keyring non-root users can use
kernel.keys.maxbytes = 2000000

# This is the maximum number of concurrent async I/O operations. You might need to increase it further if you have a lot of workloads that use the AIO subsystem (e.g. MySQL)
fs.aio-max-nr = 524288

vm.swappiness = 0
vm.oom_kill_allocating_task = 1
vm.overcommit_memory = 0
vm.panic_on_oom = 0

执行以下的指令失效:
sysctl -p

2.1.2 优化 LXD 系统资源应用下限

编辑 /etc/security/limits.conf 文件,增加以下内容:

* soft nofile 655360
* hard nofile 655360
root soft nofile unlimited
root hard nofile unlimited

2.1.3 更新操作系统软件版本
执行以下的指令,更新操作系统:

apt-get update
apt-get upgrade

# 可选,如果应用 ZFS 作为存储池,须要执行
apt install zfsutils-linux

2.1.4 批改 Cgroup 版本为 v1

目前许多较新版本的 Linux 发行版曾经内置并且默认启用 CgroupV2 的版本,笔主在编写本文时 LXD 目前仍然只能运行 CgroupV1 的 LXC Container,因而须要设置内核应用 v1 版本。

编辑 /etc/default/grub 文件,增加以下的参数:

GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=0"

编辑结束后,须要执行 update-grub 指令更新内核和 grub 疏导器。

最初执行 reboot 重启操作系统,让所有配置失效。

2.1.5(可选)敞开 swap 文件系统

执行命令 swapoff -a 关闭系统上的替换内存,尽可能疏导操作系统应用物理内存,而后编辑 /etc/fstab 文件,把 swap 相干的文件系统正文掉,防止开机启动:

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
......
#/swap.img      none    swap    sw      0       0

2.1.6 装置 LXD 服务

LXD 的服务曾经被打包为 snap 软件包,能够很不便地通过 snap 进行软件装置和服务过程治理。

执行指令 snap install lxd 即可实现装置,装置结束后执行指令 lxd init 进行 LXD 服务的初始化,该过程是交换式的,上面简要解说一下:

# 启用 LXD 的集群模式,开发体验可抉择 no,生产环境倡议配置为 yes
Would you like to use LXD clustering? (yes/no) [default=no]: no

# Ubuntu 提供的裸金属服务,不应用时配置为 no
Would you like to connect to a MAAS server? (yes/no) [default=no]: no

# 创立一个新的网桥,作为宿主机和虚拟机的桥接通信网卡,开发体验配置为 yes
# 如果生产应用,个别应用已配置好的宿主机网桥,尽量不要主动创立
Would you like to create a new local network bridge? (yes/no) [default=yes]: yes

# 配置一个新的存储池给虚拟机应用,如果抉择 yes,默认状况下会应用 zfs 初始化一个存储池,抉择 no 的话能够初始化后,自行添加存储池(生产应用个别为 no)Do you want to configure a new storage pool? (yes/no) [default=yes]: yes
Name of the new storage pool [default=default]: default
Name of the storage backend to use (btrfs, dir, lvm, zfs) [default=zfs]: zfs
Create a new ZFS pool? (yes/no) [default=yes]: yes
Would you like to use an existing block device? (yes/no) [default=no]: yes
Path to the existing block device: /dev/disk/by-id/scsi-0DO_Volume_volume-fra1-01

# LXD Daemon 默认只提供 unix socket 的通信形式,如果心愿通过 API 等进行治理,须要配置为 yes
Would you like LXD to be available over the network? (yes/no) [default=no]: no

# 自动更新本地镜像缓存,默认配置文件 yes
Would you like stale cached images to be updated automatically? (yes/no) [default=yes] yes

# 打印主动生成的 LXD 服务配置信息,能够抉择 yes 进行查看
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: no

初始化结束后,执行以下指令创立一个 LXC 虚拟机来验证装置过程:

# 启动一个 LXC Container,名称叫 myServer
# CPU 配置为 1 核,256MiB 内存
lxc launch ubuntu:20.04 myServer -c limits.cpu=1 -c limits.memory=256MiB

# 查看虚拟机列表
lxc list

# 进入并应用 myServer 虚拟机
lxc exec myServer -- bash

2.2 比照 LXC Container 与 Docker

正如之前所提及的,容器实现的技术有很多种,LXC Container 和 Docker 都是容器的实现技术,而 LXD 反对则是 LXC Container。

绝对于 Docker,LXC Container 的容器技术对公众来说并不常见,也较少在生产环境应用,其实两者师出同源:Docker 在 v0.9 版本开始,应用 libcontainer 来实现容器,而在此版本之前的所有版本,始终都是应用 LXC 容器技术来实现。

Docker 和 LXC 各奔前程的根本原因在于利用场景的不统一:

  • Docker 的指标是平安、疾速、牢靠的散发和部署应用程序,通过实现 Docker Engine,增强了应用程序在日志、存储、网络方面的应用能力;通过实现容器镜像、仓库机制以及联结文件系统,增强了本身的散发和部署能力。在设计上,Docker 容器默认状况下只容许容许主过程,如果主过程被杀死,那么容器自身也会被终止。
  • LXC 的指标仍然是比照虚拟机,在内核虚拟化上尽可能地实现对一个虚拟机的残缺模仿,因而他自身利用了内核的十分多的个性来实现这个指标。例如应用 Process Namespace 隔离过程视图,应用 Mount Namespace 隔离文件系统视图等。
  • 从安全性的角度看,LXC 的安全性要更高,LXC 的虚拟机默认启用 LXCFS 个性,并且 LXC Profile 有十分丰盛的安全策略配置可供配置。因为 Docker 须要为容器管理网络、存储等要害的资源,所以 Docker Engine 在宿主机的权限特地高,容易被恶意软件辨认和攻打;另外,在设计上指标是运行微服务,Docker 并没有像 LXC Container 那样,应用 LXCFS 文件系统来进行安全性方面的视图隔离,容器如果调配了较高的权限,容易引发生产安全事故。

所以,并不能间接把 Docker 看作是一种虚拟化能力,而是应用程序的生产编排解决方案。配合 Kubernetes 的编排技术,云原生利用已达到一个新的高度。

只管比拟小众,LXC 的应用场景仍然集中虚拟化的解决方案上,LXD 对 Container 和 VM 的并行治理也是尽可能为生产应用提供更多的抉择。

三、结语

本文从虚拟化技术的概念登程,引申出 LXD 平台根本能力介绍,以及 LXD 治理的内核虚拟化技术 LXC Container 和 Docker 的区别。

后续章节会针对 LXD 的各项性能,例如镜像治理、实例治理、网络和存储管理等进行具体的介绍。

正文完
 0