3. 控制平面组件详解(上)

Longhorn 的控制平面由 Longhorn Manager 驱动,它是整个系统的“大脑”。本章深入剖析 Longhorn Manager 的核心职责、与 Kubernetes API Server 的交互机制,以及支撑整个系统的 CRD 资源模型(Volume、Engine、Replica)。理解这些组件是排查控制平面故障的基础。

3.1 Longhorn Manager 的核心职责

Longhorn Manager 以 DaemonSet 形式运行在每个 Kubernetes 节点上,但只有其中一个实例(Leader)执行全局协调任务。其核心职责可归纳为以下五点:

职责 说明 故障影响
CRD 控制器 监听 Volume、Engine、Replica 等 CRD 对象的变化,驱动实际状态向期望状态收敛。 CRD 状态停滞,卷无法创建/挂载
调度决策 为新卷选择最优节点放置 Engine 和 Replica,考虑磁盘容量、节点标签、反亲和性等。 卷调度失败,Replica 分布不均
健康监控 定期检查 Engine 和 Replica 进程的健康状态,触发故障转移或重建。 故障无法自动恢复,数据冗余降低
API 网关 对外暴露 Longhorn API(默认端口 9500),供 UI、CLI 和外部系统调用。 UI 无法访问,自动化工具失效
事件与指标 将系统事件写入 Kubernetes Event,暴露 Prometheus 指标用于监控。 监控数据缺失,告警失灵
排查提示: 当卷操作卡住时,首先检查 Longhorn Manager Pod 的日志(kubectl logs -n longhorn-system <pod> -c longhorn-manager),重点关注 CRD 控制器循环的报错信息。

3.2 与 Kubernetes API Server 的交互

Longhorn Manager 与 Kubernetes API Server 的交互是控制平面工作的核心。它通过 Informer 机制 监听 CRD 和原生资源(Pod、Node、PV、PVC)的变化,并利用 WorkQueue 进行异步处理。

下图展示了 Longhorn Manager 与 API Server 之间的主要交互流程:

Longhorn Manager 与 Kubernetes API Server 交互流程 Longhorn Manager 与 Kubernetes API Server 交互流程 Kubernetes API Server Informer (List/Watch) WorkQueue (Delta FIFO) Longhorn Manager Watch CRD/Resource Pop & Reconcile Update Status / Create Objects 交互关键点: 1. Informer 通过 List/Watch 机制监听 CRD 和原生资源变化。 2. 变化事件被放入 WorkQueue,控制器从队列中取出并执行调和循环。 3. 调和完成后,通过 API Server 更新 CRD 状态或创建新的资源对象。 4. 如果 API Server 响应缓慢或 Informer 缓存失效,会导致控制平面延迟。
故障排查要点: 如果 Longhorn Manager 无法连接到 API Server(例如 RBAC 权限不足或网络隔离),Informer 将无法同步,CRD 状态会停留在旧版本。检查 kubectl describe pod -n longhorn-system <longhorn-manager-pod> 中的 Events 部分,寻找与 API Server 通信相关的错误。

3.3 CRD 资源模型详解

Longhorn 通过自定义资源定义(CRD)将存储系统的状态映射到 Kubernetes 原生对象上。核心 CRD 包括 Volume、Engine、Replica、Node、Disk 等。本节重点讲解 Volume、Engine 和 Replica 三个核心资源。

3.3.1 Volume CRD

Volume CRD 是用户最直接接触的资源,它定义了逻辑卷的规格和当前状态。一个 Volume 对应一个 Kubernetes PV。

字段 类型 说明
spec.size string 卷大小,例如 "10Gi"
spec.numberOfReplicas int 期望的副本数,默认 3
spec.staleReplicaTimeout int 副本失效超时时间(分钟)
spec.accessMode string 访问模式:ReadWriteOnce / ReadWriteMany
status.state string 当前状态:creating / attached / detached / faulted
status.robustness string 健康度:healthy / degraded / faulted
常见故障: 如果 Volume 状态长期停留在 creating 或 detached,检查 Engine 和 Replica 的 CRD 状态是否正常。Volume 的 status.conditions 字段会提供详细的错误原因。

3.3.2 Engine CRD

Engine CRD 代表卷的 数据平面控制器。每个 Volume 对应一个 Engine 实例(故障转移时可能短暂存在多个)。Engine 负责处理来自前端(iSCSI/NFS)的 I/O 请求,并将数据复制到所有健康的 Replica。

  • 关键字段:
    • spec.volumeName:关联的 Volume 名称。
    • spec.replicaAddressMap:当前管理的 Replica 地址列表(IP:Port)。
    • status.currentState:running / stopped / error。
    • status.endpoint:Engine 暴露的前端端点(例如 iSCSI IQN)。
  • 故障场景: 如果 Engine 状态为 error,通常意味着 Engine 进程崩溃或与所有 Replica 失去连接。检查 Engine Pod 日志(kubectl logs -n longhorn-system <engine-pod>)定位具体原因。

3.3.3 Replica CRD

Replica CRD 代表数据的 物理副本。每个 Replica 运行在一个单独的 Pod 中,负责将数据持久化到宿主机的磁盘上。

字段 类型 说明
spec.volumeName string 所属 Volume 名称
spec.engineName string 所属 Engine 名称
spec.diskUUID string 数据存放的磁盘 UUID
spec.nodeID string 运行 Replica 的节点
status.currentState string running / stopped / rebuilding / error
status.failedAt string 故障时间戳(如果 Replica 失败)
排查技巧: 当卷性能下降时,检查所有 Replica 的 status.currentState。如果某个 Replica 处于 rebuilding 状态,说明系统正在重建副本,此时 I/O 可能受到影响。使用 kubectl get replica -n longhorn-system -o wide 快速查看所有 Replica 的状态和分布。

3.4 资源模型关系图

下图展示了 Volume、Engine、Replica 三者之间的逻辑关系:

Volume、Engine、Replica 资源关系 Volume、Engine、Replica 资源关系 Volume (CRD) 逻辑卷定义 Engine (CRD) 数据平面控制器 Replica 1 (CRD) 副本数据 Replica 2 (CRD) 副本数据 Replica 3 (CRD) 副本数据 1:1 关联 1:N 复制关系 每个 Volume 对应 1 个 Engine 每个 Engine 管理 N 个 Replica

3.5 控制平面故障排查清单

基于以上组件分析,当控制平面出现问题时,可以按照以下清单进行排查:

  1. 检查 Longhorn Manager Pod 状态:
    kubectl get pods -n longhorn-system -l app=longhorn-manager
    kubectl logs -n longhorn-system <pod> -c longhorn-manager --tail=100
  2. 检查 CRD 资源状态:
    kubectl get volume -n longhorn-system
    kubectl get engine -n longhorn-system
    kubectl get replica -n longhorn-system
  3. 检查 API Server 连通性:
    kubectl get apiservice | grep longhorn
    kubectl describe pod -n longhorn-system <longhorn-manager-pod> | grep -A5 Events
  4. 检查 Informer 同步状态: 查看 Longhorn Manager 日志中是否有 Failed to list 或 Watch channel closed 等关键字。
  5. 检查 RBAC 权限:
    kubectl get clusterrole longhorn-manager-role -o yaml
    kubectl get clusterrolebinding longhorn-manager-binding -o yaml
核心原则: 控制平面故障排查应遵循“从外到内”的顺序——先确认 API Server 可达,再检查 Informer 同步,最后分析 CRD 状态。大多数控制平面问题都可以通过重启 Longhorn Manager Pod 或重新创建异常的 CRD 对象来临时恢复。