【Release】Longhorn v1.12.2 正式发布!

Longhorn v1.12.2 Release Notes

Longhorn v1.12.2 带来了一系列重要改进和 Bug 修复,用于提升系统质量、韧性、稳定性和安全性。

我们欢迎大家继续提供反馈和贡献,帮助 Longhorn 持续改进。

有关 Longhorn Release 的术语和背景,请参阅 Releases。

[!IMPORTANT]
不支持将 V2 Data Engine 从 v1.12.2 在线升级到 v1.13.0

在 V2 Data Engine 在线升级期间,volume 仍在提供 I/O 服务,同时 replica 会被重建。由于 Longhorn v1.13.0 发布早于多个关键的 V2 重建与在线升级修复(这些修复已包含在 v1.12.2 和 v1.13.1 中),v1.13.0 instance-manager pod 中的 spdk_tgt 可能崩溃或卡住,导致升级无法完成。这些问题包括 Instance Manager Pod Crashes、Issue #14425,以及本版本修复的其他稳定性问题(参见 Important Improvements and Fixes)。

  • 从 v1.12.2 升级到 v1.13.0: 升级前请先分离所有 V2 volumes。随后 V2 instance-manager pods 会使用新的 instance-manager 镜像重启。
  • 从 v1.12.2 升级到 v1.13.1 或更高版本: 支持 V2 Data Engine 在线升级。操作说明请参阅 V2 Instance Manager Upgrade。

建议为 V2 volumes 配置定期备份

在 V2 Data Engine 中,如果 snapshot 删除或 system-snapshot 清理失败,或在中途被打断(例如磁盘 I/O 错误、metadata page 耗尽、spdk_tgt 崩溃、instance-manager pod 重启或 Node 重启),不一致的 blobstore metadata 可能导致 V2 volume 数据损坏、spdk_tgt 崩溃,或 disk lvstore 加载失败(Issue #14474)。为避免潜在数据丢失,请为 V2 volumes 配置定期备份,并避免在 snapshot 删除或清理期间重启 V2 instance-manager pods 或 Node。

Breaking Changes

弃用旧版 V2 Linked Clone Volumes

从 v1.12.1 开始,在 v1.12.0 或更早版本中创建的 V2 linked-clone volumes 会被标记为 legacy 并弃用。Issue #12552 中引入的新 linked-clone 架构与旧设计不兼容。

升级到 v1.12.1 或更高版本后,legacy linked-clone volumes 除了分离和删除外,不能执行其他操作。

如需替换,请基于相同的源 volume 创建新的 linked-clone volume。只要 legacy volume 仍存在,其源 volume 就保证仍然存在,因此可以直接创建替代 linked clone,无需复制数据。

更多信息请参阅 Issue #12552。

Important Improvements and Fixes

本版本包含多个重要改进和关键稳定性修复。

V1 Data Engine

Backing Images 支持 IPv6 和 Dual-Stack

backing image manager 和 data source 现在会遵循 Longhorn 的 IP family 选择逻辑,并在与 cluster 或 storage network 匹配的 IPv4 或 IPv6 地址上提供服务,包括 IPv4 优先和 IPv6 优先的 dual-stack 集群。此前它们始终使用 IPv4。

更多信息请参阅 Issue #14148 和 Issue #13864。

Replica 重建期间并发非对齐写入导致数据丢失

修复了 replica 重建期间已确认写入可能静默丢失的问题。对同一个 4 KiB sector 进行小于 4 KiB 的并发写入时(例如数据库事务日志使用 512-byte 写入),由于 read-modify-write 流程没有加锁,写入可能相互覆盖。Longhorn 现在使用 range lock 串行化这些写入。强烈建议在 V1 volumes 上运行此类工作负载的用户升级。

更多信息请参阅 Issue #14451 和 Issue #14447。

gRPC TCP Keepalive 丢失导致 Replica 重建失败

修复了在繁忙网络中 replica 重建随机失败的问题:单次 TCP keepalive 丢失会在 20 秒后终止空闲的 sync-agent gRPC 连接。sync-agent 现在使用操作系统默认的 keepalive 参数。

更多信息请参阅 Issue #13768 和 Issue #13703。

V2 Data Engine

为 SPDK Admin Reactor 分配专用 CPU Core

SPDK CPU mask 的第一个 core 现在只运行 admin reactor,其他 core 运行 I/O pollers(NVMe-oF target poll groups 和 ublk target)。这可以避免 I/O 负载影响 admin reactor。若 mask 只有单个 core,则 admin reactor 和 pollers 会共享该 core。

[!IMPORTANT]
为保证稳定性,请为 V2 Data Engine 至少配置 2 个 CPU cores。使用多 core mask 时,其中一个 core 会预留给 admin reactor,因此实际服务 I/O 的 core 数会少一个。

更多信息请参阅 Issue #14443 和 Issue #14190。

可配置 NVMe-TCP Initiator I/O Queue 数量

现在可以限制 kernel NVMe-TCP initiator 为 V2 volumes 创建的 I/O queues 数量,而不是按每个 CPU core 创建一个,从而降低高 core 数 Node 上的内存占用。可通过 default-nvme-tcp-nr-io-queues 进行全局设置(默认 0,即 kernel 默认值),也可通过 nvmeTcpNrIoQueues 为单个 volume 设置。有效值为 0 或 1-128,变更会在下次 attach 时生效。

更多信息请参阅 Issue #13725 和 Issue #13706。

Instance Manager Pod 崩溃

修复了多个会导致 spdk_tgt abort 并拉垮 V2 instance-manager pod 的关键问题。这些问题会使该 Node 上所有 V2 volumes 离线:

  • Replica 在 I/O 下完成重建: 如果暂停 engine frontend 超时,重建流程会在仍在服务 I/O 的情况下切换目标 replica head 的 parent,导致 bdev_channel_destroy_resource: Assertion 'TAILQ_EMPTY(&ch->io_submitted)' failed abort。大量 replica 在负载下重建时(例如在线升级期间)更容易发生。参见 Issue #14495 和 Issue #14411。
  • Replica 重建: replica 重建期间 spdk_tgt 可能因 double free or corruption (fasttop) abort。参见 Issue #14484 和 Issue #14482。
  • Interrupt mode 下的大块读取: 大块读取(例如高 queue depth 下的 1 MiB 读取)可能使 NVMe-oF TCP target 被 flush retry 淹没,并且某次 retry 可能在连接被释放后执行,导致 spdk_for_each_channel: Assertion 'false' failed abort。参见 Issue #14162 和 Issue #14095。
  • 删除扩容 volume 的 snapshot: 删除小于其 child 且大小不是 512 MiB 整数倍的 snapshot,可能留下 SPDK 无法加载的 lvol metadata,导致 instance-manager pod 在下次重启或 Node 重启后 crash-loop。参见 Issue #14347 和 Issue #14344。

Replica 重建目标失败导致 Engine Fault

修复了一个关键问题:当目标 replica 上的重建初始化失败时,整个 engine 会被标记为 fault 并重建 frontend,即使仍有健康 replica 存在。现在只有失败的目标 replica 会被标记为 ERR,engine、frontend 和 I/O 会保持可用。

更多信息请参阅 Issue #13780 和 Issue #13673。

Storage Sharding(实验性)

arm64 上 Erasure-Coded Volume 写入卡住

修复了 SPDK erasure-coding bdev 中的 lost wakeup 问题,该问题可能导致写入卡住,并使 SPDK target 无响应,直到 instance-manager pod 重启前都无法删除 volume。该竞态在 arm64 上更容易发生。

更多信息请参阅 Issue #13895 和 Issue #13789。

Installation

[!IMPORTANT]
安装 Longhorn v1.12.2 前,请确保你的集群运行 Kubernetes v1.25 或更高版本。

你可以使用 Rancher、Kubectl、Helm 等多种工具安装 Longhorn。有关安装方法和要求,请参阅 Longhorn 文档中的 Quick Installation。

Upgrade

[!IMPORTANT]
升级到 Longhorn v1.12.2 前,请确保你的集群运行 Kubernetes v1.25 或更高版本。

Longhorn 只允许从受支持版本升级。有关升级路径和流程,请参阅 Longhorn 文档中的 Upgrade。

Post-Release Known Issues

有关此版本发布后发现的问题,请参阅 Release-Known-Issues。

Resolved Issues in this release

Feature

  • [BACKPORT][v1.12.2][FEATURE] Backing image 支持 IPv6 和 dual-stack IP families 14148 - @COLDTURNIP @yangchiu

Improvement

  • [BACKPORT][v1.12.2][IMPROVEMENT] 调优 V2 engine 的 SPDK 和 nvme-tcp CPU 使用 14443 - @yangchiu @shuo-wu
  • [BACKPORT][v1.12.2][IMPROVEMENT] 为 replica rebuilding 暂停 frontend 时跳过 filesystem sync 14419 - @derekbit @roger-ryao
  • [BACKPORT][v1.12.2][IMPROVEMENT] 升级后同步 V2 volume 和 engine image 字段 14318 - @davidcheng0922
  • [BACKPORT][v1.12.2][IMPROVEMENT] disk health collection 失败时 disk monitor 重复记录错误 14300 - @derekbit
  • [BACKPORT][v1.12.2][IMPROVEMENT] CSI 忽略 EC StorageClass 参数并静默回退为 replicated 13793 - @apoorvajagtap @chriscchien
  • [BACKPORT][v1.12.2][IMPROVEMENT] volume clone 或 restore 后 CSI Resize 可能长时间空闲 14108 - @shuo-wu @roger-ryao
  • [BACKPORT][v1.12.2][IMPROVEMENT] 为 V2 Data Engine 启用 CPU Isolation 14034 - @derekbit @roger-ryao
  • [BACKPORT][v1.12.2][IMPROVEMENT] backup target availability status metric 13981 - @yangchiu
  • [BACKPORT][v1.12.2][IMPROVEMENT] (chart) image.*.*.registry 优先级 13738 - @bachmanity1 @roger-ryao
  • [BACKPORT][v1.12.2][IMPROVEMENT] V2 volumes 支持配置 NVMe-TCP initiator I/O queue count(nr-io-queues)13725 - @hookak @chriscchien

Bug

  • [BACKPORT][v1.12.2][BUG] replica rebuild 期间 spdk_tgt 因 “double free or corruption (fasttop)” 崩溃 14484 - @derekbit @chriscchien
  • [BACKPORT][v1.12.2][BUG] replica rebuild 期间并发非对齐写入导致数据丢失(writeInWOMode 中未加锁的 read-modify-write)14451 - @yangchiu @derekbit
  • [BACKPORT][v1.12.2][BUG] SPDK disk recovery failure 导致 V2 instance-manager 崩溃 14347 - @shuo-wu @chriscchien
  • [BACKPORT][v1.12.2][BUG] rebuilding replica 有时会从 Engine.Status.ReplicaModeMap 中消失 13917 - @mantissahz @roger-ryao
  • [BACKPORT][v1.12.2][BUG] 并发 volume attachments 可能创建多个 NVMe-oF transports 并导致 spdk_tgt 崩溃 14400 - @derekbit @chriscchien
  • [BACKPORT][v1.12.2][BUG] V2 instance manager 在线升级卡在 relocating-engines,因为 EngineFrontend switchover 持续针对重建后的 target engine 重试 promoting 14425 - @davidcheng0922 @chriscchien
  • [BACKPORT][v1.12.2][BUG] V2 instance-manager spdk_tgt 通过 /host 从另一个 pod 的 hugetlbfs mount 分配 hugepages,阻塞该 pod 清理 14430 - @yangchiu @derekbit
  • [BACKPORT][v1.12.2][BUG] stalled NVMe device 会导致不相关 V2 volume 的 engine frontend 校验失败并被重建 14373 - @hookak @roger-ryao
  • [BACKPORT][v1.12.2][BUG] NVMe admin queue 返回 EAGAIN 时 nvme list zombie process 泄漏(V2 Data Engine)13764 - @chriscchien
  • [BACKPORT][v1.12.2][BUG] SystemBackup 卡在 CreatingVolumeBackups:controller 在所有 volume backup 完成后静默停止 reconcile,或因 snapshot not found 自动清理竞态无限循环 14375 - @yangchiu @c3y1huang
  • [BACKPORT][v1.12.2][BUG] extent page race 导致 V2 spdk_tgt 在 blob_insert_cluster_msg assertion abort 14370 - @davidcheng0922 @chriscchien
  • [BACKPORT][v1.12.2][BUG] Fast replica rebuild 跳过被 purge/coalesce 修改过的 snapshot 文件(stale .img.checksum),导致重建后的 replica 缺失数据;snapshot-data-integrity fast-check 未能检测 14335 - @derekbit @chriscchien
  • [BACKPORT][v1.12.2][BUG] 瞬时 status RPC failure 会将健康 replica 标记为 failed,并可能导致 volume fault 14332 - @yangchiu
  • [BACKPORT][v1.12.2][BUG] V1 filesystem disk 的 path 本身不是 mount point 时无法采集 disk health data(“mount path … not found”)14311 - @derekbit @chriscchien
  • [BACKPORT][v1.12.2][BUG] 测试用例 Test Encrypted RWO Block Volume Online Expansion 失败 14296 - @yangchiu @mantissahz
  • [BACKPORT][v1.12.2][BUG] Force-deleted pod VolumeAttachment cleanup 忽略 “Waiting for detach” events(Kubernetes v1.35.9+, v1.36.4+, v1.37)14218 - @roger-ryao
  • [BUG] csi-resizer 使用 csi-resizer:v2.3.0 在 v1.12.x-head 中因 “unrecognized feature gate: RecoverVolumeExpansionFailure” 启动失败 14249 - @c3y1huang @roger-ryao
  • [BACKPORT][v1.12.2][BUG] backupstore lock 被占用时 V2 DR volume restore 不重试 14220 - @derekbit @roger-ryao
  • [BACKPORT][v1.12.2][BUG] Rocky Linux 9.7 / RKE2 上 longhorn-engine v1.7.1 至 v1.9.2 的所有 V1 volume I/O 静默卡住(iSCSI login timeout、attach/detach loop);engine v1.7.0 和 v1.6.4 在各平台版本正常 13927 - @davidcheng0922
  • [BACKPORT][v1.12.2][BUG] Sharded/EC volume:arm64/AIO 上写入降至约 0 并卡住 SPDK target,阻塞 volume 删除;同时 CSI 丢弃 EC StorageClass 参数 13895 - @c3y1huang @roger-ryao
  • [BACKPORT][v1.12.2][BUG] volume expansion snapshot CR 名称 expand-<size> 在不同 volumes 间冲突 13824 - @derekbit @roger-ryao
  • [BACKPORT][v1.12.2][BUG] Longhorn V2 engine 在 interrupt mode 下大块读取时崩溃:spdk_for_each_channel “Assertion ‘false’ failed” 14162 - @derekbit @chriscchien
  • [BACKPORT][v1.12.2][BUG] IPv6 storage network 环境中 V2 volume 卡在 Attaching 13955 - @yangchiu @derekbit
  • [BACKPORT][v1.12.2][BUG] 从 ECDSA(dynamiclistener)CA 升级时,v1.11.3 会重新生成 webhook CA,导致所有 longhorn-manager 死锁 14192
  • [BACKPORT][v1.12.2][BUG] snapshot 的 status.creationTime 为空时 SystemBackup 失败 14140 - @yangchiu
  • [BACKPORT][v1.12.2][BUG] volume clone 进行中时 Longhorn 可能不会拒绝 expansion request 14066 - @yangchiu @shuo-wu
  • [BACKPORT][v1.12.2][BUG] invalid block disk 不应阻止 Longhorn system uninstallation 13925 - @yangchiu @apoorvajagtap
  • [BACKPORT][v1.12.2][BUG] 因 KubernetesNodeGone 删除 nodes.longhorn.io 失败 14029 - @COLDTURNIP @yangchiu
  • [BACKPORT][v1.12.2][BUG] v1.12.1 chart:默认开启的 networkPolicies.restrictInternalTraffic 静默破坏 Prometheus 对 longhorn-manager 的 scraping(patch upgrade 后 metrics/alerting 中断)13741 - @COLDTURNIP @yangchiu
  • [BACKPORT][v1.12.2][BUG] V2 replica rebuild destination failure 导致整个 engine fault 13780 - @roger-ryao
  • [BACKPORT][v1.12.2][BUG] 临时 I/O 错误期间 NodeStageVolume 可能触发对现有 volume 的破坏性 mkfs,存在数据丢失风险 14060
  • [BACKPORT][v1.12.2][BUG] 测试用例 Test V2 Volume Engine Live Switchover 在 v1.13.x-head 上可能失败 13987 - @davidcheng0922 @chriscchien
  • [BACKPORT][v1.12.2][BUG] ProcessList 中 Process.Conditions 与 response 共享导致 instance-manager 因 “concurrent map iteration and map write” 崩溃 14115 - @derekbit @chriscchien
  • [BACKPORT][v1.12.2][BUG] SystemRestore job 忽略 registry-secret setting 13969 - @chriscchien @bachmanity1
  • [BACKPORT][v1.12.2][BUG] DR replicas 异常 14057 - @derekbit @chriscchien
  • [BACKPORT][v1.12.2][BUG] clone 完成后 cloned volume 卡在 “not ready for workloads”(v1.12.0, V1 engine)13978 - @yangchiu @chriscchien
  • [BACKPORT][v1.12.2][BUG] 测试用例 test_csi_block_volume_online_expansion 在 V2 volume 上因 md5sum assertion 失败(仅 AMD64)14050 - @derekbit @roger-ryao
  • [BACKPORT][v1.12.2][BUG] Runtime container images 包含 development(-devel)packages 14051
  • [BACKPORT][v1.12.2][BUG] 使用 “Default Data Path” /dev/disk/by-id/scsi-* path 添加 V2 disk 失败 13870 - @davidcheng0922 @roger-ryao
  • [BACKPORT][v1.12.2][BUG] Upgrade Responder 中的 Request Schema 过期 14049 - @mantissahz @roger-ryao
  • [BACKPORT][v1.12.2][BUG] 单次 gRPC TCP keepalive 丢失后 V1 replica rebuild 失败 13768 - @chriscchien
  • [BACKPORT][v1.12.2][BUG] 测试 test_single_replica_failed_during_engine_start 失败 13862 - @davidcheng0922
  • [BACKPORT][v1.12.2][BUG] 测试用例 V2 Volume Should Cleanup Resources When Instance Manager Is Deleted 失败 13988 - @roger-ryao @carterli0407-cell
  • [BACKPORT][v1.12.2][BUG] V2 volume expansion 在 frontend dm device resize 前就报告完成 14002 - @derekbit @chriscchien
  • [BACKPORT][v1.12.2][BUG] Terminal workload pods 导致 NodePublishVolume 因 “no Pending workload pods” abort 13995 - @yangchiu
  • [BACKPORT][v1.12.2][BUG] stale stopped process record 导致 createInstance 静默 no-op,使 V1 engine 永远无法启动,volume 一直 stuck in attaching 13850 - @derekbit @roger-ryao
  • [BACKPORT][v1.12.2][BUG] v1.12.1 默认 NetworkPolicies 遗漏合法的非 pod-labeled 和 host-originated 调用方,静默破坏 CSI attach/detach 13804 - @COLDTURNIP @roger-ryao
  • [BACKPORT][v1.12.2][BUG] Recurring-job pods 在启动或 volume 执行错误后仍报告 success 13752 - @christophersherman @roger-ryao
  • [BACKPORT][v1.12.2][BUG] 测试用例 Power Off Replica Node Should Not Rebuild New Replica On Same Node 失败 13819 - @yangchiu @derekbit
  • [BACKPORT][v1.12.2][BUG] 集群关机后 V1 volumes 未重建 13751 - @COLDTURNIP @yangchiu
  • [BACKPORT][v1.12.2][BUG] rebuild finish 在 I/O 下设置 dst replica parent 时,V2 spdk_tgt 因 bdev_channel_destroy_resource assertion abort 14495 - @davidcheng0922 @chriscchien

Performance

  • [BACKPORT][v1.12.2][IMPROVEMENT] nsmounter:在 Talos 上 kubelet PID lookup 每次调用耗时数秒 14174 - @yangchiu

Resilience

  • [BACKPORT][v1.12.2][BUG] V2 instance-manager liveness probe error(‘test: -eq: unary operator expected’)导致自杀式退出,并在 rebuild load 下造成 Node 级 replica fault 13959 - @yangchiu @mantissahz
  • [BACKPORT][v1.12.2][BUG] S3 volume.cfg 缺失时,V2 Instance Manager 在 backupstore 中 panic,导致该 Node 上所有 volumes 离线 13805 - @mantissahz @chriscchien

Stability

  • [BACKPORT][v1.12.2][BUG] 某一资源类型(backups.longhorn.io)的 Admission webhook 调用 instant EOF 且无网络 I/O;确定性、全局性,并且在 apiserver 重启和 egress-selector 模式切换后仍存在 14316 - @COLDTURNIP @roger-ryao
  • [BACKPORT][v1.12.2][BUG] 任一 volume replica 正在 rebuilding 时,recurring snapshot-cleanup 会中止整个执行 13781 - @derekbit @chriscchien
  • [BACKPORT][v1.12.2][BUG] V2 backup readers 与 snapshot cleanup 竞态导致 instance manager panic 14021 - @yangchiu
  • [BACKPORT][v1.12.2][IMPROVEMENT] 避免重复发送未变化的 Node status update 14145 - @hookak @chriscchien

Misc

  • [BACKPORT][v1.12.2][TASK] 添加 Helm chart image HIP-0015 annotations 14204 - @roger-ryao @carterli0407-cell
  • [BACKPORT][v1.12.2][BUG] Node uncordon 后 live migration 与 replica rebuild 进入循环等待 14154 - @chriscchien @carterli0407-cell
  • [BACKPORT][v1.12.2][BUG] replica 正在 rebuilding 时,instance-manager 在 sync.(*Task).HashSnapshotStatus 中因 nil pointer panic(isRebuilding 分支中 err 被 shadow)14252 - @chriscchien
  • [BACKPORT][v1.12.2][BUG] share manager 反复 stop/start(如被 CronJob 触发)时,RWX volume mount 延迟最高 2 分钟 14178 - @roger-ryao
  • [BACKPORT][v1.12.2][BUG] NVMe device 绑定到 vfio-pci 时,Longhorn block disk 持续 Ready=False 且 Schedulable=False 13934 - @derekbit @chriscchien
  • [BACKPORT][v1.12.2][IMPROVEMENT] chart value:允许 metrics scraper 通过 longhorn-manager NetworkPolicy 13989 - @yangchiu
  • [BACKPORT][v1.12.2][BUG] CSI method-level request logs 绕过 secret sanitization 13727 - @yangchiu

Contributors

  • @COLDTURNIP
  • @apoorvajagtap
  • @bachmanity1
  • @c3y1huang
  • @carterli0407-cell
  • @chriscchien
  • @christophersherman
  • @davidcheng0922
  • @derekbit
  • @hookak
  • @innobead
  • @mantissahz
  • @roger-ryao
  • @shuo-wu
  • @yangchiu
  • @sushant-suse
  • @rebeccazzzz
  • @forbesguthrie
  • @asettle

原文发布地址: longhorn/longhorn v1.12.2