多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Incus 项目(Projects)完全指南:实例隔离、多用户管控与配额限制

Incus 项目(Projects)完全指南:实例隔离、多用户管控与配额限制 后端虚拟化容器运行时【免费下载链接】incusPowerful system container and virtual machine manager项目地址https://gitcode.com/gh_mirrors/inc/incus点击查看免费下载Incus 项目project是 Incus 用于组织实例、镜像、配置文件和网络的逻辑分组机制它让一台 Incus 服务器可以在同一命名空间内承载互不干扰的多组工作负载。本文以 doc/explanation/projects.md 为主线结合创建、使用、约束项目的实操文档与项目配置参考系统讲解项目的隔离模型、受限项目confined project的多用户方案以及features.*、limits.*、restricted.*等核心配置项的完整语义读完即可动手搭建隔离的多租户环境并配置资源配额与安全限制。为什么需要项目场景与价值你可以用项目让 Incus 服务器保持整洁把相关的实例分组管理。除了彼此隔离的实例每个项目还可以拥有自己独立的镜像、配置文件profile、网络和存储资源。以下两类场景最能体现项目的价值场景一按业务线隔离大批实例如果你运行着大量用途不同的实例例如为不同客户项目提供服务希望让这些实例互相隔离便于定位和维护同时出于一致性考虑还希望不同客户项目中的实例能复用相同的实例名。此时可以为每个客户项目创建一个 Incus 项目并为各项目配置不同的配置文件、网络和存储——同一实例名如web-01可以安全地出现在多个项目中互不冲突。场景二共享服务器上的多用户环境当一台 Incus 服务器被多个用户共享时每个用户运行自己的实例、配置自己的配置文件。管理员希望把用户实例约束在各自的范围内让每个用户只能操作自己的实例、看不到别人的实例同时限制每个用户的资源用量防止不同用户的实例相互干扰。这种情况下可以使用受限项目confined project搭建多用户环境。Incus 自带一个名为default的项目所有未显式切换项目的操作都落在其中。创建新项目的具体步骤见 创建项目。项目的隔离模型实例的隔离是强制的项目始终封装encapsulate其包含的实例实例不能跨项目共享同一实例名可以在多个项目中重复使用当你在某个项目内操作时只能看到属于该项目的实例。这一点在源码中也有直接体现——internal/server/project/project.go中Instance()函数会在项目名非default时给实例名加上project_前缀分隔符为_DNS()函数则把项目名作为 DNS 后缀追加为instance.project从底层保证实例与 DNS 名称在物理层面不会串扰InstanceParts()则负责从带前缀的名称中反向解析出项目与实例名。镜像卷作为缓存资源则始终关联到default项目见StorageVolumeProject的注释与实现。其他实体的隔离feature 开关镜像、配置文件、网络、存储这些实体则有两种归属方式在项目中隔离或者从default项目继承。由项目内的 feature 开关决定feature 开启true→ 对应实体在项目中隔离项目使用自己的一套资源feature 关闭false→ 对应实体从default项目继承。例如开启features.networks后项目使用独立的一套网络不再使用default项目中的网络关闭features.images后项目能访问default项目中的镜像且在该项目中添加的任何镜像也会被写入default项目。必须注意feature 要在开始使用新项目之前选定。一旦项目包含实例feature 即被锁定要修改就必须先删除项目内所有实例。此外升级带来的新增 feature 对既有项目默认是关闭的。全部 feature 选项的列表见 项目配置参考 与 doc/config_options.txtproject-features配置组。多用户环境下的受限项目Confined Projects当 Incus 服务器被多个用户共享例如实验室环境时可以用项目约束每个用户的活动范围。除按上文隔离实例及其他实体外受限项目还把用户限制在自己的空间内防止其访问其他用户的实例或数据任何影响服务器本身及其配置的变更如添加或移除存储都不被允许。更关键的是这一方案允许用户在不属于incus-admin组的情况下使用 Incus。incus-admin组成员拥有 Incus 的完全访问权包括挂载宿主文件系统路径、调整实例安全特性——这些能力理论上可以被利用来获得宿主机的 root 权限详见 安全文档。受限项目限制了用户在 Incus 内能做的事同时防止用户借此获取宿主机 root 权限从而实现能用、但越不了权的安全边界。项目的认证方式将项目限定到特定用户有两种认证方式可供选择客户端证书Client certificates在 TLS 证书认证 中可以把客户端证书限制为只允许访问特定项目。要求被限制的项目必须先存在。使用受限证书连接的客户端只能看到被授予访问权的项目。多用户 Incus 守护进程Multi-user Incus daemon守护进程支持按用户动态创建项目通常用于属于incus组、但不在权限更高的incus-admin组的用户。当这类用户开始使用 Incus 时Incus 会自动为该用户创建一个受限项目并切换过去。如果此时 Incus 尚未初始化会自动以默认配置完成初始化。两种认证方式的具体启用与配置步骤见 将项目限定到特定用户。创建与配置项目创建和配置项目的完整操作流程见 创建和配置项目下面提炼核心命令。创建项目使用incus project create命令例如创建名为my-project的项目incus project create my-project通过--config标志指定配置选项。例如创建隔离实例、但允许访问default项目镜像的项目incus project create my-project-shared-images --config features.imagesfalse再如创建阻止安全敏感特性如容器嵌套、但允许备份的受限项目incus project create my-restricted-project --config restrictedtrue --config restricted.backupsallow一个常见的坑创建项目时不指定任何配置选项时features.profiles会被置为true这是它的初始值意味着配置文件在项目中隔离——新项目将无法访问default项目的default配置文件从而缺少创建实例所需的配置如 root 磁盘。解决办法是给项目的default配置文件添加 root 磁盘设备incus profile device add default root disk path/ poolpool_name或在创建实例前把默认配置文件的磁盘配置补进去见下文跨项目复制配置文件。配置项目配置项目可以只设置某个具体选项也可以整体编辑项目。注意部分配置选项只能在项目不含任何实例时设置。设置单个配置选项使用incus project set。例如把my-project中可创建的容器数量限制为 5incus project set my-project limits.containers5取消配置选项使用incus project unset。注意unset 后选项会回到默认值而这个默认值可能与项目创建时的初始值不同典型例子就是features.profiles初始值为true默认值为false。整体编辑使用incus project edit会以交互式编辑器打开完整配置incus project edit my-project使用不同的项目当项目不止default一个时必须确保操作时使用或指向正确的项目。需要注意如果存在限定到特定用户的项目只有拥有 Incus 完全访问权的用户能看到全部项目没有完全访问权的用户只能看到自己有权限的项目的信息。列出项目incus project list默认输出为表格形式各列依次为NAME项目名、IMAGES/PROFILES/STORAGE VOLUMES/STORAGE BUCKETS/NETWORKS/NETWORK ZONES对应各 feature 是否开启YES表示隔离、DESCRIPTION描述、USED BY被引用数。当前所在项目会标注(current)。可以用--format标志切换输出格式详见incus project list --help。切换项目默认情况下发出的所有命令都作用于当前所在项目可用incus project list查看当前项目。切换项目incus project switch project_name指定项目不切换许多 Incus 命令支持--project标志在不切换当前项目的前提下把操作指向特定项目。注意只能指向你有权限的项目。列出某项目内的实例incus list --project my-project把实例移动到另一个项目incus move instance_name new_instance_name --project source_project --target-project target_project目标项目中不存在同名实例时可以保留原实例名。例如把my-instance从default项目移动到my-project并保留名称incus move my-instance my-instance --project default --target-project my-project跨项目复制配置文件如果项目按默认设置创建features.profilestrue配置文件隔离项目访问不到default项目的默认配置文件创建实例时会报错incus launch images:debian/12 my-instance Creating my-instance Error: Failed instance creation: Failed creating instance record: Failed initializing instance: Failed getting root disk: No root device could be found解决办法是把default项目默认配置文件的内容管道导入当前项目的默认配置文件incus profile show default --project default | incus profile edit default项目配置参考项目的键/值配置采用命名空间组织共四大类features.*、limits.*、restricted.*以及项目专属配置project-specific。完整清单见 项目配置参考以下逐类说明选项含义与默认值均来自 doc/config_options.txt 的对应配置组。项目特性features.*features 决定哪些实体在项目中隔离、哪些从default项目继承。某个feature.*选项为true时对应实体即在项目中隔离。创建时未显式配置的选项取初始值但 unset 后回到默认值且所有feature.*的默认值都是false。配置项初始值默认值说明features.imagestruefalse是否使用独立的镜像与镜像别名集合features.networksfalsefalse是否使用独立的网络集合需要服务器配置 OVNfeatures.networks.zonesfalsefalse是否使用独立的网络区域network zones集合features.profilestruefalse是否使用独立的配置文件集合features.storage.bucketstruefalse是否使用独立的存储桶storage buckets集合features.storage.volumestruefalse是否使用独立的存储卷storage volumes集合项目限制limits.*limits.*为项目内容器与虚拟机使用的资源定义硬上限。一部分选项限制项目内允许的实体数量如limits.containers、limits.networks另一部分限制项目内所有实例的资源用量总和如limits.cpu、limits.processes。后者通常作用于每个实例上配置的实例资源限制直接配置或经配置文件配置而非实际占用的资源。例如把项目的limits.memory设为50GiB则项目内所有实例的limits.memory配置值之和必须小于 50 GiB把limits.cpu设为100则所有实例的limits.cpu之和必须低于 100。使用 limits 时必须满足以下条件设置了某个limits.*且实例存在对应配置时项目内所有实例都必须定义对应配置直接或经配置文件limits.cpu不能与limits.cpu.allowance即 CPU 集合/范围形式的实例配置同时使用——项目内每个实例的limits.cpu必须是一个数字不能是集合或范围limits.memory必须设置为绝对值不能是百分比。配置项类型说明limits.containersinteger项目内最多可创建的容器数limits.cpuinteger项目内使用的 CPU 总数上限各实例limits.cpu之和limits.diskstring项目内所有实例卷、自定义卷与镜像的磁盘空间总量上限limits.disk.pool.POOL_NAMEstring项目在指定存储池上的磁盘空间上限limits.instancesinteger项目内最多可创建的实例容器虚拟机总数limits.memorystring项目内存用量上限各实例limits.memory之和绝对值limits.networksinteger项目可拥有的网络数上限limits.processesinteger项目内进程数上限各实例limits.processes之和limits.virtual-machinesinteger项目内最多可创建的虚拟机数项目限制安全向restricted.*要阻止项目内实例访问安全敏感特性如容器嵌套、raw LXC 配置把restricted设为true随后可用各种restricted.*选项单独放行被整体屏蔽的个别特性。注意三点restricted必须为truerestricted.*选项才生效restrictedfalse时修改restricted.*无效把全部restricted.*设为allow等价于把restricted设为false大多数restricted.*是二元开关block/allow少数支持更细粒度的取值。例如限制项目屏蔽所有安全敏感特性、但放行容器嵌套incus project set project_name restrictedtrue incus project set project_name restricted.containers.nestingallow主要选项一览默认值标注于括号内配置项默认值取值与语义restrictedfalse是否屏蔽安全敏感特性restricted.*生效的前提restricted.backupsblock是否阻止创建实例/卷备份allow/blockrestricted.cluster.groups—允许指定的集群组字符串列表未指定则全部可访问restricted.cluster.targetblock是否阻止指定集群成员allow/blockrestricted.containers.interceptionblock系统调用拦截选项allow/block/fullallow放行通常安全的拦截项文件系统挂载仍被阻止restricted.containers.lowlevelblock低层容器选项如raw.lxc、raw.idmap、volatile.*allow/blockrestricted.containers.nestingblock是否允许嵌套运行 Incusallow/block放行security.nestingrestricted.containers.privilegeunprivileged特权容器管控unprivileged禁止security.privilegedtrueisolated额外禁止security.idmap.isolatedfalseallow无限制restricted.devices.diskmanaged磁盘设备block除 root 外禁用全部managed仅允许带pool的磁盘allow无限制restricted.devices.disk.paths—restricted.devices.diskallow时用逗号分隔的路径前缀列表限制 disk 设备source留空则全部允许restricted.devices.gpublock是否禁用gpu类型设备allow/blockrestricted.devices.infinibandblock是否禁用infiniband类型设备restricted.devices.nicmanaged网络设备block禁用全部managed仅允许带network的 NICallow无限制restricted.devices.pciblock是否禁用pci类型设备restricted.devices.proxyblock是否禁用proxy类型设备restricted.devices.unix-blockblock是否禁用unix-block类型设备restricted.devices.unix-charblock是否禁用unix-char类型设备restricted.devices.unix-hotplugblock是否禁用unix-hotplug类型设备restricted.devices.usbblock是否禁用usb类型设备restricted.idmap.gid/restricted.idmap.uid—允许出现在实例raw.idmap中的宿主机 GID/UID 范围restricted.images.servers—允许使用的镜像服务器域名列表逗号分隔未设置则全部可访问restricted.networks.access—允许使用的网络名列表逗号分隔未设置则全部可访问开启features.networks时列出的 default 项目网络会被共享进本项目且其名称不可用于本项目自有网络依赖restricted.devices.nicrestricted.networks.integrations—允许项目网络使用的网络集成integrations列表restricted.networks.subnetsblock允许分配的上联uplink网络子网列表格式uplink:subnetrestricted.networks.uplinks—允许作为项目网络上联的网络名列表restricted.networks.zonesblock允许使用的网络区域或区域下条目列表restricted.snapshotsblock是否阻止创建实例/卷快照restricted.storage-pools.access—允许使用的存储池名列表未设置则全部可访问restricted.virtual-machines.lowlevelblock低层 VM 选项如raw.qemu、volatile.*allow/blockrestricted.virtual-machines.nestingallow嵌套虚拟化allow/blockblock时所有 VM 必须security.nestingfalse项目专属配置project-specific除上述三类外部分服务器选项可在项目级覆盖同时支持添加用户元数据配置项说明backups.compression_algorithm本项目备份使用的压缩算法bzip2/gzip/lz4/lzma/xz/zstd/noneimages.auto_update_cached是否自动更新项目内缓存的镜像images.auto_update_interval缓存镜像更新检查间隔小时设为0禁用images.compression_algorithm项目内新镜像的压缩算法取值同上images.default_architecture混合架构集群中的默认架构images.remote_cache_expiry未使用的远程缓存镜像在项目中的过期天数network.hwaddr_pattern集群内使用的 MAC 地址模板如10:66:6a:xx:xx:xx每个x由0–f随机字符替换需自行评估碰撞概率user.*用户提供的自由格式键/值对深入源码项目机制如何落地阅读 internal/server/project/project.go 可以直观理解项目隔离的底层设计命名空间前缀机制Instance()用project_前缀区分不同项目的同名实例DNS()用instance.project后缀区分 DNS 名StorageVolume()则统一用project_前缀处理存储卷。实例名不允许包含_分隔符而项目名可以因此InstanceParts()从右侧做一次分割即可可靠解析项目与实例名。卷归属的动态判定StorageVolumeProject()/StorageVolumeProjectFromRecord()展示了实体归属逻辑的复杂度——镜像卷作为缓存始终归default项目自定义卷只有在项目开启features.storage.volumes时才归本项目否则归default项目其余卷类型总是归指定项目。这说明继承 vs 隔离不是简单的布尔判断而是按实体类型精细化处理的。测试佐证internal/server/project/project_test.go 与权限相关测试覆盖了项目解析与权限校验逻辑cmd/incus/project.go 则是incus project系列子命令的 CLI 入口。常见问题速查问题解决办法新项目创建实例报No root device could be foundfeatures.profiles初始为true项目访问不到 default 项目的默认配置文件。执行incus profile show default --project default \| incus profile edit default复制配置或用incus profile device add补 root 磁盘项目内已创建实例想改 feature必须先把项目内所有实例删除feature 随实例存在而锁定unset 后配置与创建时不一致unset回到默认值而非初始值如features.profiles默认false、初始true想限制每个用户的资源但允许备份incus project create name --config restrictedtrue --config restricted.backupsallow再配合limits.*设置配额客户端只能看特定项目证书添加时用--restricted --projects或incus config trust edit fingerprint修改现有证书restrictedtrue 指定projects相关文档路径项目总览 doc/projects.md、创建与配置 doc/howto/projects_create.md、使用多项目 doc/howto/projects_work.md、按用户约束 doc/howto/projects_confine.md、配置参考 doc/reference/projects.md、配置选项源文件 doc/config_options.txt。赞分享后端虚拟化容器运行时【免费下载链接】incusPowerful system container and virtual machine manager项目地址https://gitcode.com/gh_mirrors/inc/incus点击查看免费下载相关推荐Apache DolphinScheduler多租户隔离用户权限与资源配额管控实践指南 Apache DolphinScheduler多租户隔离用户权限与资源配额管控实践指南 Apache DolphinScheduler作为现代化的数据编任务调度大数据后端微服务WaveTerm如何用零代码小部件系统重构你的终端工作流WaveTerm如何用零代码小部件系统重构你的终端工作流 在传统的终端工作流中开发者需要在命令行界面、文件管理器、Web浏览器和系统监控工具之间频繁切换这开发工具桌面应用AI 应用CLIKubeOperator多租户隔离项目级资源配额管理完全指南KubeOperator多租户隔离项目级资源配额管理完全指南 KubeOperator作为一款开源的轻量级Kubernetes发行版为企业用户提供了强大的多云原生容器编排运维后端上一篇KMS激活工具KMS_VL_ALL_AIO一个.cmd文件如何让Windows和Office自动续期激活下一篇SQLDelight 查询参数完全指南类型推断、命名参数与可变参数绑定创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表