Incus 0.1 已发布¶
2023 年 10 月 7 日
简介¶
Linux 容器团队非常高兴地宣布 Incus 的初始版本发布!
Incus 是 Canonical LXD 的社区分支,由 @cyphar 创建,现在是 Linux 容器项目的一部分。
这个初始版本大致相当于 LXD 5.18,但除了明显的重命名之外,还有一些重大变更。
您可以在线试用它:https://linuxcontainers.cn/incus/try-it/
变更¶
随着 Incus 的初始版本发布,我们有机会从 LXD 中删除了许多未使用的或有问题的功能。大多数这些变更都是我们想要在 LXD 中做但由于对向后兼容性的强烈保证而无法做的事情。
Incus 将在未来同样严格地保持向后兼容性,但由于这是分支的第一个版本,所以这是我们改变事物的唯一重大机会。
也就是说,API 和 CLI 仍然非常接近 LXD,使得从 LXD 移植到 Incus 变得非常简单,如果不是完全无缝的话。
API¶
删除 /1.0/containers
和 /1.0/virtual-machines
¶
LXD 最初是一个仅限容器的项目,因此它的 REST API 使用了 /1.0/containers
。
当虚拟机随后被引入时,一个新的 /1.0/instances
端点接管了所有容器和虚拟机的操作,但 /1.0/containers
为传统客户端保留了下来。除此之外,还添加了一个便捷的 /1.0/virtual-machines
端点,尽管从未使用过。
在 Incus 中,这两个传统端点现在已被删除,与实例交互的唯一支持方式是通过 /1.0/instances
。
将 /dev/lxd 替换为 /dev/incus¶
作为将所有内容从 LXD 重命名为 Incus 的一部分,来宾 API 也从 /dev/lxd 重命名为 /dev/incus。
目前提供便捷的符号链接,以便现有的工作负载在从 LXD 迁移后继续工作。
服务器配置的类型变更¶
LXD 服务器配置一直以一种奇怪的类型 map[string]any
而不是我们通常的 map[string]string
类型存在。这种不一致的原因是因为 core.trust_password
,这是 LXD 在早期使用的传统身份验证方法。
这是因为 LXD 从未以明文形式存储密码,而是对其进行哈希并存储哈希值。这使得无法将完整配置返回给用户。相反,当设置密码时,将返回 true
布尔值而不是字符串。
现在如上所述,core.trust_password
是一种处理身份验证的传统方式,应该用基于令牌的身份验证、TLS 证书信任或外部身份验证来替换。
Incus 完全删除了对 core.trust_password
的支持(见下文),因此所有服务器配置键现在可以放入标准的 map[string]string
中。
从 Go API 中删除传统 Container
函数¶
遵循上述删除 /1.0/containers
和 /1.0/virtual-machines
的更改,Go 客户端包中的匹配函数现在也都消失了。
相反,应该使用那些 Container
函数的 Instance
等价物。
(例如,使用 CreateInstance
而不是 CreateContainer
)
CLI¶
引入 incus snapshot
子命令¶
LXD CLI 中长期存在的烦人和不一致之处在于快照管理。虽然大多数其他操作都有自己的子命令(file
、config
、...),但快照被保留在顶层,使用 snapshot
和 restore
。
这迫使我们通过 lxc rename
和 lxc delete
函数处理快照的重命名或删除等操作。相反,使用 lxc snapshot
子命令,例如 lxc snapshot create
会更有意义,但无法做到这一点,因为这会导致所有使用 lxc snapshot
的脚本失效。
现在是时候修复这个问题了,所以 incus snapshot
现在是一个子命令,包含以下功能:
incus snapshot create
incus snapshot delete
incus snapshot list
incus snapshot rename
incus snapshot restore
处理 incus config trust add
和 incus cluster add
¶
随着 Incus 放弃基于密码的身份验证,并将更多注意力放在令牌上,让签发令牌的体验变得轻松一致至关重要。
因此,incus config trust add
和 incus cluster add
现在只接受一个名称作为参数并返回一个有效的令牌。
incus config trust add
的证书处理方面现在已移至 incus config trust add-certificate
。
引入 incus admin
子命令¶
LXD 世界中另一个长期存在的烦人事项是,必须同时使用 lxc
和 lxd
来设置服务器。在 Incus 中,incusd
二进制文件可以安全地隐藏起来,因为没有人应该直接与它交互。
相反,我们现在有了 incus admin
子命令:
incus admin cluster
incus admin init
incus admin recover
incus admin shutdown
incus admin waitready
依赖项¶
过渡到 Cowsql¶
https://github.com/cowsql/cowsql
在 @cyphar 将 LXD 分支为 Incus 之后不久,@freeekanayaka,Dqlite 的最初作者,也决定将 Dqlite 分支为 Cowsql。鉴于 @freeekanayaka 也是 Incus 的维护者,将 Incus 移植到 Cowsql 很有意义。
与 Incus 本身类似,Cowsql 是 Canonical Dqlite 的社区分支,在很大程度上与 Dqlite 兼容,允许 Incus 在迁移阶段轻松导入现有数据。
到目前为止,Cowsql 的重点一直是大幅提升性能测试,并在 Raft 和 Cowsql 层进行了一些更改,使其在 Incus 的使用模式下尽可能地高效。
最低 Go 版本¶
对于那些从源代码构建 Incus 的人来说,现在要求的最低 Go 版本是 Go 1.20。
总的来说,我们将尝试继续支持在当前和上一个 Go 版本上构建。
功能删除¶
一些 LXD 功能已从 Incus 中删除。
这些功能主要集中在由于生态系统原因而添加的功能,以及依赖于现在已弃用或维护不良的软件的功能。
删除 Ubuntu Fan 桥接¶
Ubuntu Fan 桥接依赖于 Ubuntu 专用的内核补丁和 iproute2 的用户空间更改。虽然此功能仍在 Ubuntu 内核中维护,但在主线内核或任何其他发行版的内核中都找不到它。
虽然在某些环境中很方便,但与 Incus 与 OVN 的集成相比,Ubuntu Fan 桥接相形见绌。
因此,以下网络配置键已被删除:
bridge.mode
fan.overlay_subnet
fan.underlay_subnet
fan.type
删除 Ubuntu shiftfs¶
另一个 Ubuntu 内核特有的功能是 shiftfs,它最初是在内核级别尝试实现灵活的 uid/gid 偏移。
虽然 LXD 多年来一直支持 shiftfs,但由于各种内核问题,它从未默认启用。相反,为此问题开发了一个更简洁的内核内解决方案,即 VFS idmap 偏移。现在它在最新的 Linux 内核中可用,并在存在时由 Incus 自动使用。
删除 Canonical Candid 身份验证¶
在过去,Canonical 开发了自己的基于 Macaroons 使用的身份验证系统。它的中心身份验证服务器是 Candid。
LXD 获得了 Candid 支持,允许它通过它对用户进行各种提供商的身份验证。
如今,Candid 基本上没有维护,重点已转移到行业标准,即 Open ID Connect。
因此,以下服务器配置键已被删除:
candid.api.key
candid.api.url
candid.domains
candid.expiry
Incus 已经拥有用于外部身份验证的 OpenID Connect 支持,并且有广泛可用的 OIDC 服务器,它们与 Candid 支持的功能相匹配,甚至在某些方面超越了 Candid。
删除 Canonical RBAC 授权¶
Canonical RBAC 是一个基于 Macaroons 和 Candid 构建的专有基于角色的访问控制解决方案。
它只被 MAAS 和 LXD 支持,而且采用率极低,主要是因为它是专有的,并且通常难以获得访问权限。
它基本上没有维护,现在主要集中在迁移到更符合行业标准的东西,即 OpenFGA。
因此,以下服务器配置键已被删除
rbac.agent.url
rbac.agent.username
rbac.agent.private_key
rbac.agent.public_key
rbac.api.expiry
rbac.api.key
rbac.api.url
rbac.expiry
Incus 目前不支持 OpenFGA,因此任何现有的 Canonical RBAC 用户应继续使用 LXD,直到 OIDC + OpenFGA 替代方案可用。
删除 Canonical MAAS 集成¶
LXD 支持与 MAAS API 集成,以使用 MAAS 作为某种 IPAM(IP 地址管理)解决方案。
这允许将特定的 LXD 网络映射到 MAAS 子网,然后让 MAAS 为该网络上的每个实例创建记录,并为其分配一个静态地址和 DNS 记录。
不幸的是,这种集成很少被采用,并且 MAAS 本身也存在一些限制,这使得这种集成存在问题。
- MAAS 中的 MAC 地址在全球范围内是唯一的,而在 LXD 中,它们必须在同一网络上的运行实例之间是唯一的。这种差异使得某些实例复制操作无法执行。
- 即使附加到完全不同的 DNS 区域,实例名称在 MAAS 中也应该在全球范围内是唯一的。这实际上使得使用 LXD 项目变得不可能,因为实例现在很容易发生冲突。
在这些问题以及此功能缺乏采用率的情况下,我们决定从 Incus 中删除 MAAS 支持,因此以下配置键已被删除
maas.api.key
maas.api.url
maas.subnet.ipv4
maas.subnet.ipv6
删除信任密码的概念¶
早在 LXD 的早期,连接到远程服务器的唯一方法是使用信任密码,这基本上是一个固定密钥,它允许客户端将它的 TLS 证书添加到服务器的信任存储中。
这实际上允许任何知道或可以找到信任密码的人将他们的客户端添加到信任存储中,之后信任存储不再需要进行进一步的操作。
因此,信任密码必须非常安全地保存,或者在添加新客户端后立即取消设置。不幸的是,这种情况很少发生,为对信任密码进行暴力破解攻击打开了大门,最终攻击者获得了对 LXD 及其运行的服务器的完全控制。
为了解决这个问题,一段时间前添加了对使用一次性信任令牌的支持,并且所有文档都更新为不鼓励用户使用信任密码。
在 Incus 中,我们更进一步,完全删除了对信任密码的支持。现在应该通过使用一次性令牌或通过使用 OIDC 进行外部身份验证来将新客户端或新服务器添加到集群中。
因此,以下服务器配置键已被删除
core.trust_password
其他¶
DMI 信息的更改¶
在 Incus 虚拟机中,供应商现在设置为 Linux Containers
,产品设置为 Incus
。
virtio-serial 标记的更改¶
用于在通过 vsock 建立完整的代理访问权限之前与 Incus 进行有限通信的 virtio-serial 设备现在是 org.linuxcontainers.incus
。
从 LXD 迁移¶
Incus 带有一个方便的 lxd-to-incus
工具,可用于将系统从 LXD 迁移到 Incus。
在此阶段的主要限制是
- LXD 的最低版本为 4.0
- LXD 的最高版本为 5.18
- 在此阶段不支持迁移集群(正在开发中)
文档¶
Incus 文档位于
https://linuxcontainers.cn/incus/docs/main/
软件包¶
没有官方的 Incus 软件包,因为 Incus 上游只发布常规的发布版 tarball。以下是获取 Incus 并运行的一些可用选项。
针对 Debian 和 Ubuntu 的 Zabbly 软件包¶
Zabbly 为 Debian 和 Ubuntu 用户提供 Incus 的每日构建和稳定构建
https://github.com/zabbly/incus
用于 Incus 客户端的 Homebrew 软件包¶
客户端工具可通过 HomeBrew 在 Linux 和 MacOS 上使用。
https://formulae.brew.sh.cn/formula/incus
用于 Incus 客户端的 Chocolatey 软件包¶
客户端工具将很快通过 Chocolatey 为 Windows 用户提供。
在此之前,二进制文件可以在这里找到:https://github.com/lxc/incus/releases/tag/v0.1.0
支持¶
在此早期阶段,每个 Incus 版本只支持到下一个版本发布为止。这种情况将在几个月内发生变化,因为我们计划发布一个 LTS 版本,以与 LXC 和 LXCFS 的 LTS 版本同时发布。
社区支持提供于:https://discuss.linuxcontainers.org
错误报告于:https://github.com/lxc/incus/issues