DeviceLink 的状态
主要流程
在 DeviceLink
的状态中,有下列几种条件可用于跟踪其链接的状态:
- NodeExisted:节点是否可用
- ModelExisted:设备模型是否存在
- AdaptorExisted:适配器是否可用
- DeviceCreated:是否已创建设备
- DeviceConnected:是否已连接设备
这是 DeviceLink
的示例:
当我们将上述DeviceLink
部署到集群中时,brain
负载校验NodeExisted
和ModelExisted
,limb
负载校验AdaptorExisted
、DeviceCreated
和DeviceConnected
:
首先,brain
会验证spec.adaptor.node
中指定的节点是否可用:
如果该节点可用,brain
会验证CRD对应的spec.model
(设备模型)是否存在:
说明
用作设备模型的CRD需要包含注释:devices.edge.cattle.io/enable:true
。
如果CRD(设备模型)验证通过,则limb
将验证适配器(Adaptor)对应的spec.adaptor.name
是否可用:
您可以检查Adaptor的设计来了解limb
如何检测适配器。 如果适配器可用,那么limb
将尝试创建与spec.model
相关的设备实例:
成功创建设备实例后,limb
将使用spec.template.spec
通过适配器(Adaptor)连接该实际设备:
如果连接状态是healthy
,则相应的设备实例将从实际物理设备同步其状态。 以下是所有状态的完整过程:
说明
DeviceLink的状态流是有序执行的,如果前一个状态未准备就绪(不成功或错误),则不会进入到下一个状态。
流程与行为
主要流程并不一定总是向前发展,某些检测逻辑可以对其进行调整以显示当前状态,我们称它们为更正
。 有些更正是自动的,但有些需要手动干预。
状态 | 控制器 | 逻辑描述 |
---|---|---|
NodeExisted | brain | 如果该节点已被删除、驱逐或束缚,则Octopus的brain 会将主流重新调整为NodeExisted ,并将其标记为不可用。 当节点再次可用时,brain 将触发主流重新开始。 |
ModelExisted | brain | 如果CRD(设备模型)已被删除或禁用,则brain 会将主流调整回ModelExisted 并标记为不可用。当CRD再次可用时,brain 将触发主要流程,从模型检测开始。 |
AdaptorExisted | limb | 如果已删除适配器,则limbs 会将主流调整回AdaptorExisted 并标记为不可用。当适配器再次可用时,limb 将触发主要流程,从适配器检测开始。 |
DeviceConnected | limb | limbs 不会立即察觉到设备实例的意外删除,因为limbs 通过适配器控制设备,无法监视到这些真实设备的实例。如果删除处于已经连接状态(DeviceConnected: healthy )的设备,并且适配器的实现是实时或定时地同步实际设备的状态,则它可能有机会由limb 重新创建。 limb 将触发主要流程再次从设备创建开始。否则,该链接需要手动修改或重新创建该设备。 |
设备连接状态
在谈论DeviceConnected
之前,需要知道Octopus的设备连接管理分为两部分,一个是limb
与适配器之间的连接(c1),另一个是适配器与真实设备之间的连接(c2),如下图所示:
c1基于gRPC,而c2由适配器确定。 当c1和c2都健康时,limb
会将DeviceConnected状态设置为healthy
。
limb
可以观察到c1
的变化,如果c1
意外关闭,则limb
会触发主流从设备连接重新开始。
但是,limb
无法感知 c2
是否意外关闭,因此适配器需要负责通知其状态,通常,适配器需要向limb
发送ERROR
状态的消息。 然后,limb
会将 DeviceConnected
状态设置为unhealthy
。
如果中断的c2
没有重新连接,则链接将保持unhealthy
的状态。