ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Talos Linux 中的 LVMLogicalVolumeConfig:在卷组内声明式定义逻辑卷

Talos Linux 中的 LVMLogicalVolumeConfig:在卷组内声明式定义逻辑卷 云原生操作系统容器编排【免费下载链接】talosTalos Linux is a modern Linux distribution built for Kubernetes.项目地址https://gitcode.com/gh_mirrors/ta/talos点击查看免费下载LVMLogicalVolumeConfig 是 Talos Linux 引入的一种 v1alpha1 配置文档config document用于在已存在的 LVM 卷组volume group内声明式地定义逻辑卷logical volume。本文将围绕该配置文档展开完整覆盖其全部字段、取值约束与校验规则并结合仓库源码剖析配置文档 → 期望状态资源 → 逻辑卷状态的完整链路帮助你在 Talos Linux 集群中通过机器配置管理 LVM 逻辑卷的创建与布局。为什么需要 LVMLogicalVolumeConfigTalos Linux 将 LVM 能力以配置文档config documents的形式接入机器配置每个文档拥有独立的apiVersion/kind可以像 YAML 清单一样被追加到机器配置中由machined内置控制器消费。在这个体系中有两个相互配合的文档类型LVMVolumeGroupConfig声明物理卷PV并创建卷组LVMLogicalVolumeConfig在既有的卷组内声明逻辑卷LV的布局与供应方式。两者在接口层面分别对应 config/lvm.go 中的LVMVolumeGroupConfig与LVMLogicalVolumeConfig接口。后者的职责可以概括为给定一个卷组名定义一个逻辑卷——包括名称、RAID 布局、镜像/条带参数以及最小/最大尺寸。完整配置示例与字段速查参考文档 lvmlogicalvolumeconfig.md 给出的最小可用示例一个典型的LVMLogicalVolumeConfig如下apiVersion: v1alpha1 kind: LVMLogicalVolumeConfig name: lv-data # Logical volume name. type: linear # Logical volume layout. # Describes how the logical volume is provisioned. provisioning: volumeGroup: vg-pool # Name of the volume group that backs the logical volume. maxSize: 50GiB # The maximum size of the volume.该示例与仓库中的测试样例 testdata/lvmlogicalvolumeconfig_basic.yaml 完全一致同时对应源码 lvm_logical_volume_config.go 中的exampleLVMLogicalVolumeConfigV1Alpha1()示例函数可直接作为起点。全部字段速查如下字段类型说明取值namestring逻辑卷名称必须为 1–63 个字符ASCII 字母、数字、连字符、下划线typeLVMLogicalVolumeType逻辑卷布局linear、raid0、raid1、raid10mirrorsuint32raid1/raid10布局的镜像副本数未设置时默认为 1即两路镜像对linear/raid0无效stripesuint32raid0/raid10布局的条带数未设置时默认为使用全部可用物理卷至少为 2对linear/raid1无效provisioningLVMLogicalVolumeProvisioningSpec逻辑卷的供应方式描述—provisioning {#LVMLogicalVolumeConfig.provisioning}LVMLogicalVolumeProvisioningSpec描述了逻辑卷如何在卷组中被供应字段如下字段类型说明volumeGroupstring支撑该逻辑卷的卷组名称必填minSizeByteSize卷的最小尺寸。按字节指定但可写成人类可读格式例如100MBmaxSizeSize卷的最大尺寸必填。按字节或卷组百分比指定可写成人类可读格式例如100MB或80%字段逐一详解name逻辑卷名称name同时是逻辑卷在 LVM 中的短名称和配置文档的标识。源码中对其约束定义得非常明确lvm_logical_volume_config.goLVM2NAME_LEN为 128为获得稳定的资源 IDLV 名称被限制在 63 个字符以内。注释揭示了约束背后的工程考量Talos 会把卷组名/逻辑卷名拼接为资源 ID见下文控制器部分短名称有助于保持资源 ID 的稳定与可读。type逻辑卷布局type字段使用storageres.LVMLogicalVolumeType枚举类型定义见 resources/storage/lvmlogicalvolumetype.goLVMLogicalVolumeTypeLinear LVMLogicalVolumeType iota // linear LVMLogicalVolumeTypeRAID1 // raid1 LVMLogicalVolumeTypeRAID0 // raid0 LVMLogicalVolumeTypeRAID10 // raid10该枚举带有linecomment标签见 lvmlogicalvolumetype_enumer.go因此 YAML 中可直接写linear、raid1等字符串。选择布局时需结合卷组内物理卷的数量raid0/raid10需要足够多的 PV 才能发挥条带化效果raid1需要至少两块 PV 才能构成镜像。mirrors镜像副本数mirrors仅对raid1/raid10有效。关键默认值逻辑位于 lvm_logical_volume_config.go显式设置时返回所设值未设置且布局为raid1/raid10时返回1即两路镜像1 表示额外的一份副本加上原始数据共两份对linear/raid0及其他布局返回0不适用。stripes条带数stripes仅对raid0/raid10有效。值得注意的是未设置时接口返回0而真正的默认值由下游控制器解析——接口注释明确写道config/lvm.goStripes 返回 raid0/raid10 的条带数未设置时返回 0由 reconcile controller 解析为使用全部可用 PV。也就是说默认使用所有可用物理卷这一行为是在控制器层实现的而不是在配置解析层。provisioning.volumeGroup卷组归属volumeGroup声明逻辑卷属于哪个卷组是必填项。在控制器中它会与name一起组成资源的唯一 ID格式为卷组名/逻辑卷名因此一个卷组内的逻辑卷名称必须唯一。provisioning.minSize / maxSize尺寸语义minSize使用meta.ByteSize类型按字节解析支持100MB这类人类可读写法仅表示绝对尺寸maxSize使用meta.Size类型既支持绝对字节/可读格式如50GiB也支持卷组百分比如80%。两者在接口层面的取法分别是MinSizeBytes()、MaxSizeBytes()与MaxSizePercentVG()config/lvm.go后两者二选一maxSize写成绝对值时MaxSizePercentVG()返回 0写成百分比时MaxSizeBytes()返回 0。校验规则源码级约束清单LVMLogicalVolumeConfigV1Alpha1实现了config.Validator接口全部校验逻辑集中在 lvm_logical_volume_config.go归纳如下约束说明name必填空名称直接报name is requiredname长度必须在 1–63 字符之间超出报错name字符集仅允许 ASCII 字母、数字、连字符、下划线出现其他字符即报错mirrors布局匹配仅raid1/raid10可用在linear/raid0上设置会报mirrors is only valid for raid1/raid10, not typemirrors最小值显式设置时必须 ≥ 1stripes布局匹配仅raid0/raid10可用在raid1上设置会报stripes is only valid for raid0/raid10, not typestripes最小值显式设置时必须 ≥ 2provisioning.volumeGroup必填缺失报provisioning.volumeGroup is requiredprovisioning.maxSize必填缺失报provisioning.maxSize is requiredmaxSize非负不允许负值minSize≤maxSize当两者均为绝对尺寸时minSize不得大于maxSize若maxSize为百分比则不适用此比较这些规则在 lvm_logical_volume_config_test.go 中有逐条对应的测试用例例如no name期望错误name is required\nname must be between 1 and 63 characters longmissing volume group期望错误provisioning.volumeGroup is requiredmin greater than maxminSize: 100GiB、maxSize: 50GiB时报provisioning.minSize must not exceed provisioning.maxSizevalid percentmaxSize: 80%与raid1组合可通过校验stripes too low on raid0stripes: 1时报stripes must be at least 2。另外值得注意type是带TextUnmarshaler的强类型枚举任何不支持的字符串会在 YAML 解码阶段就被拒绝因此校验函数中无需再重复检查枚举合法性。从配置到资源控制器如何消费该文档配置文档本身并不会直接创建逻辑卷中间隔着 Talos 的 COSI 资源系统。核心转换控制器位于 internal/app/machined/pkg/controllers/storage/lvm_logical_volume_spec.go控制器storage.LVMLogicalVolumeSpecController监听config.NamespaceName命名空间下 ID 为ActiveID的MachineConfig资源遍历machineCfg.Config().LVMLogicalVolumeConfigs()对每个文档取出卷组名、LV 名、布局、尺寸、镜像、条带等字段以卷组名/逻辑卷名为 ID写出LVMLogicalVolumeSpec期望状态资源类型为LVMLogicalVolumeSpecs.storage.talos.dev定义见 lvm_logical_volume_spec.go通过CleanupOutputs清理已从配置中移除的 LV 对应资源实现声明式收敛。当配置中删除某个LVMLogicalVolumeConfig文档时对应的期望状态资源会被自动清理后续的 LVM 控制器便会据此移除/释放该逻辑卷从而实现配置即状态。逻辑卷创建完成后的实际运行状态则通过另一个资源暴露LVMLogicalVolumeStatusLVMLogicalVolumeStatuses.storage.talos.dev其 spec 镜像了lvs命令的精选列lvm_logical_volume_status.go包括Pathlv_path如/dev/vg0/data与DMPathdevice-mapper 路径Name/FullName/VGName/UUIDLayout如linear、raid1与Role如publicActive、Suspended、DeviceOpen等激活状态列Sizelv_size字节数、ReadAhead、KernelMajor/KernelMinor等。也就是说从配置文档到最终磁盘布局的完整链路是LVMLogicalVolumeConfig 文档 → LVMLogicalVolumeSpec 期望资源 →LVM 执行层→ LVMLogicalVolumeStatus 状态资源每一环都可以用 Talos 的资源命令观测验证。实战为不同布局编写配置基础线性卷单块 PV 或对冗余无要求的场景使用最简单的linearapiVersion: v1alpha1 kind: LVMLogicalVolumeConfig name: lv-data type: linear provisioning: volumeGroup: vg-pool maxSize: 50GiB条带化卷raid0在卷组包含多块 PV 时用raid0提升吞吐并显式声明条带数apiVersion: v1alpha1 kind: LVMLogicalVolumeConfig name: lv-striped type: raid0 stripes: 3 # 至少 2未设置则使用全部可用 PV provisioning: volumeGroup: vg-pool maxSize: 200GiB镜像卷raid1需要数据冗余时使用raid1未设置mirrors即为两路镜像apiVersion: v1alpha1 kind: LVMLogicalVolumeConfig name: lv-mirrored type: raid1 mirrors: 1 # 默认即为 1两路镜像此处为显式声明 provisioning: volumeGroup: vg-pool maxSize: 80%注意这里maxSize使用百分比形式表示占用卷组 80% 的空间百分比与绝对尺寸只能二选一二者同时出现时以各自的接口方法取值。镜像 条带raid10需要同时兼顾性能与冗余时使用raid10mirrors与stripes均生效apiVersion: v1alpha1 kind: LVMLogicalVolumeConfig name: lv-db type: raid10 mirrors: 1 stripes: 2 provisioning: volumeGroup: vg-pool minSize: 10GiB maxSize: 50GiB这里同时设置了minSize与绝对maxSize且满足minSize 不得大于 maxSize的校验约束。使用注意事项卷组必须先存在LVMLogicalVolumeConfig只负责在卷组内定义逻辑卷卷组本身的创建由LVMVolumeGroupConfig文档完成请参阅同目录下的 lvmvolumegroupconfig.md名称唯一性同一卷组内逻辑卷名称必须唯一因为资源 ID 由卷组名/逻辑卷名拼接而成布局与 PV 数量匹配raid1/raid10需要足够的物理卷承载镜像副本raid0/raid10的条带数上限受 PV 数量约束尺寸语义差异minSize只支持绝对尺寸maxSize支持绝对尺寸或卷组百分比两者同时为绝对值时受minSize ≤ maxSize约束声明式收敛删除配置文档后对应逻辑卷的期望状态资源会被控制器清理逻辑卷随之进入回收流程务必在修改前评估数据影响。延伸阅读配置文档源码与校验pkg/machinery/config/types/storage/lvm_logical_volume_config.go接口抽象pkg/machinery/config/config/lvm.go校验测试用例pkg/machinery/config/types/storage/lvm_logical_volume_config_test.go期望状态控制器internal/app/machined/pkg/controllers/storage/lvm_logical_volume_spec.go布局枚举与状态资源resources/storage/lvmlogicalvolumetype.go、resources/storage/lvm_logical_volume_status.go赞分享云原生操作系统容器编排【免费下载链接】talosTalos Linux is a modern Linux distribution built for Kubernetes.项目地址https://gitcode.com/gh_mirrors/ta/talos点击查看免费下载相关推荐NocoBase AI 员工「选择区块」上下文Pick block 使用指南与实现原理NocoBase AI 员工「选择区块」上下文Pick block 使用指南与实现原理 在与 NocoBase AI 员工对话时除了上传文件你还可以把页面运维配置管理后端Telegraf LVM 输入插件完全指南采集 Linux 物理卷、卷组与逻辑卷监控指标Telegraf LVM 输入插件完全指南采集 Linux 物理卷、卷组与逻辑卷监控指标 Telegraf 的 inputs.lvm 插件通过调用 Linux可观测性指标监控运维Talos Linux KubeClusterConfig 配置指南声明式定义集群名称与 Kubernetes API EndpointTalos Linux KubeClusterConfig 配置指南声明式定义集群名称与 Kubernetes API Endpoint KubeCluste云原生操作系统容器编排创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表