17.3. 使用 PTP 硬件快速事件通知框架
虚拟 RAN (vRAN) 等云原生应用需要访问对整个网络运行至关重要的硬件计时事件通知。Precision Time Protocol (PTP) 时钟同步错误可能会对低延迟应用程序的性能和可靠性造成负面影响,例如:在一个分布式单元 (DU) 中运行的 vRAN 应用程序。
17.3.1. 关于 PTP 和时钟同步错误事件 复制链接链接已复制到粘贴板!
丢失 PTP 同步是 RAN 网络的一个关键错误。如果在节点上丢失同步,则可能会关闭无线广播,并且网络 Over the Air (OTA) 流量可能会转移到无线网络中的另一个节点。快速事件通知允许集群节点与 DU 中运行的 vRAN 应用程序通信 PTP 时钟同步状态,从而缓解工作负载错误。
事件通知可用于在同一 DU 节点上运行的 vRAN 应用。发布/订阅 REST API 将事件通知传递到消息传递总线。发布-订阅消息传递或发布-订阅消息传递是服务通信架构的异步服务,通过服务通信架构,所有订阅者会立即收到发布到某一主题的消息。
PTP Operator 为每个支持 PTP 的网络接口生成快速事件通知。您可以通过 HTTP 或 Advanced Message Queuing Protocol (AMQP) 消息总线使用 cloud-event-proxy
sidecar 容器来访问事件。
PTP 快速事件通知可用于配置为使用 PTP 普通时钟、PTP grandmaster 时钟或 PTP 边界时钟。
HTTP 传输是 PTP 和裸机事件的默认传输。在可能的情况下,使用 HTTP 传输而不是 AMQP 用于 PTP 和裸机事件。AMQ Interconnect 于 2024 年 6 月 30 日结束生命周期(EOL)。AMQ Interconnect 的延长生命周期支持 (ELS) 于 2029 年 11 月 29 日结束。如需更多信息,请参阅 Red Hat AMQ Interconnect 支持状态。
17.3.2. 关于 PTP 快速事件通知框架 复制链接链接已复制到粘贴板!
使用 Precision Time Protocol (PTP) 快速事件通知框架,将集群应用程序订阅到裸机集群节点的 PTP 事件。
快速事件通知框架使用 REST API 进行通信。REST API 基于 O-RAN O-Cloud Notification API Specification for Event Consumers 3.0,它包括在 O-RAN ALLIANCE Specifications 中。
框架由发布者、订阅者和 AMQ 或 HTTP 消息传递协议组成,用于处理发布者和订阅者应用程序之间的通信。应用程序以 sidecar 模式运行 cloud-event-proxy
容器,以订阅 PTP 事件。cloud-event-proxy
sidecar 容器可以访问与主应用程序容器相同的资源,而无需使用主应用程序的任何资源,且没有大量延迟。
HTTP 传输是 PTP 和裸机事件的默认传输。在可能的情况下,使用 HTTP 传输而不是 AMQP 用于 PTP 和裸机事件。AMQ Interconnect 于 2024 年 6 月 30 日结束生命周期(EOL)。AMQ Interconnect 的延长生命周期支持 (ELS) 于 2029 年 11 月 29 日结束。如需更多信息,请参阅 Red Hat AMQ Interconnect 支持状态。
图 17.4. PTP 快速事件概述
-
事件在集群主机上生成
-
PTP Operator 管理的 pod 中的
linuxptp-daemon
作为 KubernetesDaemonSet
运行,并管理各种linuxptp
进程 (ptp4l
、phc2sys
,以及可选的用于 grandmaster 时钟ts2phc
)。linuxptp-daemon
将事件传递给 UNIX 域套接字。 -
事件传递给 cloud-event-proxy sidecar
-
PTP 插件从 UNIX 域套接字读取事件,并将其传递给 PTP Operator 管理的 pod 中的
cloud-event-proxy
sidecar。cloud-event-proxy
将 Kubernetes 基础架构的事件提供给具有低延迟的 Cloud-Native Network Function (CNF)。 -
事件是持久的
-
PTP Operator 管理的 pod 中的
cloud-event-proxy
sidecar 处理事件,并使用 REST API 发布云原生事件。 -
消息已传输
-
消息传输程序通过 HTTP 或 AMQP 1.0 QPID 将事件传送到应用程序 pod 中的
cloud-event-proxy
sidecar。 -
来自 REST API 的事件
-
Application pod 中的
cloud-event-proxy
sidecar 处理事件并使用 REST API 使其可用。 -
消费者应用程序请求订阅并接收订阅的事件
-
消费者应用程序向应用程序 pod 中的
cloud-event-proxy
sidecar 发送 API 请求,以创建 PTP 事件订阅。cloud-event-proxy
sidecar 为订阅中指定的资源创建一个 AMQ 或 HTTP 消息传递监听程序协议。
应用程序 pod 中的 cloud-event-proxy
sidecar 接收来自 PTP Operator 管理的 pod 的事件,取消封装云事件对象以检索数据,并将事件发布到消费者应用程序。消费者应用程序侦听资源限定符中指定的地址,并接收和处理 PTP 事件。
17.3.3. 配置 PTP 快速事件通知发布程序 复制链接链接已复制到粘贴板!
要为集群中的网络接口启动使用 PTP fast 事件通知,您必须在 PTP Operator PtpOperatorConfig
自定义资源 (CR) 中启用快速事件发布程序,并在您创建的 PtpConfig
CR 中配置 ptpClockThreshold
值。
先决条件
-
已安装 OpenShift Container Platform CLI (
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。 - 已安装 PTP Operator。
流程
修改默认 PTP Operator 配置以启用 PTP 快速事件。
在
ptp-operatorconfig.yaml
文件中保存以下 YAML:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
enableEventPublisher
设置为true
以启用 PTP 快速事件通知。
注意在 OpenShift Container Platform 4.13 或更高版本中,当将 HTTP 传输用于 PTP 事件时,您不需要在
PtpOperatorConfig
资源中设置spec.ptpEventConfig.transportHost
字段。仅在 PTP 事件中使用 AMQP 传输时设置transportHost
。更新
PtpOperatorConfig
CR:oc apply -f ptp-operatorconfig.yaml
$ oc apply -f ptp-operatorconfig.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
为 PTP 启用接口创建
PtpConfig
自定义资源(CR),并设置ptpClockThreshold
和ptp4lOpts
所需的值。以下 YAML 演示了您必须在PtpConfig
CR 中设置的必要值:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 附加
--summary_interval -4
以使用 PTP 快速事件。 - 2
- 所需的
phc2sysOpts
值。-m
将消息输出到stdout
。linuxptp-daemon
DaemonSet
解析日志并生成 Prometheus 指标。 - 3
- 指定一个字符串,其中包含要替换默认的
/etc/ptp4l.conf
文件的配置。要使用默认配置,请将字段留空。 - 4
- 可选。如果
ptpClockThreshold
小节不存在,则默认值用于ptpClockThreshold
字段。小节显示默认的ptpClockThreshold
值。ptpClockThreshold
值配置 PTP master 时钟在触发 PTP 事件前的时长。holdOverTimeout
是在 PTP master clock 断开连接时,PTP 时钟事件状态更改为FREERUN
前的时间值(以秒为单位)。maxOffsetThreshold
和minOffsetThreshold
设置以纳秒为单位,它们与CLOCK_REALTIME
(phc2sys
) 或 master 偏移 (ptp4l
) 的值进行比较。当ptp4l
或phc2sys
偏移值超出这个范围时,PTP 时钟状态被设置为FREERUN
。当偏移值在这个范围内时,PTP 时钟状态被设置为LOCKED
。
17.3.4. 迁移消费者应用程序,以使用 PTP 或裸机事件的 HTTP 传输 复制链接链接已复制到粘贴板!
如果您之前部署了 PTP 或裸机事件消费者应用程序,您需要更新应用程序以使用 HTTP 消息传输。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。 - 您已将 PTP Operator 或 Bare Metal Event Relay 更新至使用 HTTP 传输的版本 4.13+。
流程
更新您的事件消费者应用以使用 HTTP 传输。为云事件 sidecar 部署设置
http-event-publishers
变量。例如,在配置了 PTP 事件的集群中,以下 YAML 片断演示了一个云事件 sidecar 部署:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- PTP Operator 会自动将
NODE_NAME
解析为正在生成 PTP 事件的主机。例如,compute-1.example.com
。
在配置了裸机事件的集群中,在云事件 sidecar 部署 CR 中将
http-event-publishers
字段设置为hw-event-publisher-service.openshift-bare-metal-events.svc.cluster.local:9043
。将
consumer-events-subscription-service
服务与事件消费者应用程序一起部署。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
17.3.5. 安装 AMQ 消息传递总线 复制链接链接已复制到粘贴板!
要在节点上的发布程序与订阅者之间传递 PTP 快速事件通知,您必须安装和配置 AMQ 消息传递总线,以便在节点上本地运行。要使用 AMQ 消息传递,您必须安装 AMQ Interconnect Operator。
HTTP 传输是 PTP 和裸机事件的默认传输。在可能的情况下,使用 HTTP 传输而不是 AMQP 用于 PTP 和裸机事件。AMQ Interconnect 于 2024 年 6 月 30 日结束生命周期(EOL)。AMQ Interconnect 的延长生命周期支持 (ELS) 于 2029 年 11 月 29 日结束。如需更多信息,请参阅 Red Hat AMQ Interconnect 支持状态。
先决条件
-
安装 OpenShift Container Platform CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
-
将 AMQ Interconnect Operator 安装到其自己的
amq-interconnect
命名空间。请参阅添加 Red Hat Integration - AMQ Interconnect Operator。
验证
检查 AMQ Interconnect Operator 是否可用,且所需的 pod 是否正在运行:
oc get pods -n amq-interconnect
$ oc get pods -n amq-interconnect
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE amq-interconnect-645db76c76-k8ghs 1/1 Running 0 23h interconnect-operator-5cb5fc7cc-4v7qm 1/1 Running 0 23h
NAME READY STATUS RESTARTS AGE amq-interconnect-645db76c76-k8ghs 1/1 Running 0 23h interconnect-operator-5cb5fc7cc-4v7qm 1/1 Running 0 23h
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查所需的
linuxptp-daemon
PTP 事件制作者 pod 是否在openshift-ptp
命名空间中运行。oc get pods -n openshift-ptp
$ oc get pods -n openshift-ptp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE linuxptp-daemon-2t78p 3/3 Running 0 12h linuxptp-daemon-k8n88 3/3 Running 0 12h
NAME READY STATUS RESTARTS AGE linuxptp-daemon-2t78p 3/3 Running 0 12h linuxptp-daemon-k8n88 3/3 Running 0 12h
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
17.3.6. 使用 REST API 将 DU 应用程序订阅到 PTP 事件 复制链接链接已复制到粘贴板!
使用资源地址 /cluster/node/<node_name>/ptp
将应用程序订阅到 PTP 事件,其中 <node_name>
是运行 DU 应用程序的集群节点。
在单独的 DU 应用程序 pod 中部署 cloud-event-consumer
DU 应用程序容器和 cloud-event-proxy
sidecar 容器。cloud-event-consumer
DU 应用程序订阅应用程序 Pod 中的 cloud-event-proxy
容器。
使用以下 API 端点,将 cloud-event-consumer
DU 应用程序订阅到 PTP 事件,这些事件由 cloud-event-proxy
容器发布,位于 DU 应用程序 pod 中的 http://localhost:8089/api/ocloudNotifications/v1/
:
/api/ocloudNotifications/v1/subscriptions
-
POST
:创建新订阅 -
GET
:删除订阅列表 -
DELETE
:删除所有订阅
-
/api/ocloudNotifications/v1/subscriptions/{subscription_id}
-
GET
:返回指定订阅 ID 的详情 -
DELETE
:删除与指定订阅 ID 关联的订阅
-
/api/ocloudNotifications/v1/health
-
GET
:返回ocloudNotifications
API 的健康状况
-
api/ocloudNotifications/v1/publishers
-
GET
:为集群节点返回数组os-clock-sync-state
、ptp-clock-class-change
、lock-state
和gnss-sync-status
消息
-
/api/ocloudnotifications/v1/{resource_address}/CurrentState
-
GET
:返回以下事件类型的当前状态:os-clock-sync-state
、ptp-clock-class-change
、lock-state
或gnss-state-change
事件
-
9089
是在应用程序 Pod 中部署的 cloud-event-consumer
容器的默认端口。您可以根据需要为 DU 应用程序配置不同的端口。
17.3.6.1. PTP 事件 REST API 参考 复制链接链接已复制到粘贴板!
使用 PTP 事件通知 REST API 将集群应用程序订阅到父节点上生成的 PTP 事件。
17.3.6.1.1. api/ocloudNotifications/v1/subscriptions 复制链接链接已复制到粘贴板!
HTTP 方法
GET api/ocloudNotifications/v1/subscriptions
描述
返回订阅列表。如果订阅存在,则返回 200 OK
状态代码以及订阅列表。
API 响应示例
HTTP 方法
POST api/ocloudNotifications/v1/subscriptions
描述
创建新订阅。如果订阅成功创建,或者已存在,则返回 201 Created
状态代码。
参数 | 类型 |
---|---|
subscription | data |
有效负载示例
{ "endpointUri": "http://localhost:8989/event", "resource": "/cluster/node/compute-1.example.com/ptp" }
{
"endpointUri": "http://localhost:8989/event",
"resource": "/cluster/node/compute-1.example.com/ptp"
}
HTTP 方法
DELETE api/ocloudNotifications/v1/subscriptions
描述
删除所有订阅。
API 响应示例
{ "status": "deleted all subscriptions" }
{
"status": "deleted all subscriptions"
}
HTTP 方法
GET api/ocloudNotifications/v1/subscriptions/{subscription_id}
描述
返回 ID 为 subscription_id
的订阅详情。
参数 | 类型 |
---|---|
| string |
API 响应示例
HTTP 方法
DELETE api/ocloudNotifications/v1/subscriptions/{subscription_id}
描述
使用 ID subscription_id
删除订阅。
参数 | 类型 |
---|---|
| string |
API 响应示例
{ "status": "OK" }
{
"status": "OK"
}
17.3.6.1.3. api/ocloudNotifications/v1/health 复制链接链接已复制到粘贴板!
HTTP 方法
GET api/ocloudNotifications/v1/health/
描述
返回 ocloudNotifications
REST API 的健康状况。
API 响应示例
OK
OK
17.3.6.1.4. api/ocloudNotifications/v1/publishers 复制链接链接已复制到粘贴板!
HTTP 方法
GET api/ocloudNotifications/v1/publishers
描述
返回集群节点的 os-clock-sync-state
、ptp-clock-class-change
、lock-state
和 gnss-sync-status
详情的数组。当相关的设备状态改变时,系统会生成通知。
-
os-clock-sync-state
通知描述了主机操作系统时钟同步状态。有效的状态是LOCKED
或FREERUN
。 -
ptp-clock-class-change
通知描述了 PTP 时钟类的当前状态。 -
lock-state
通知描述了 PTP 设备锁定状态的当前状态。有效状态是LOCKED
、HOLDOVER
或FREERUN
。 -
gNSS-sync-status
通知描述了与外部 GNSS 时钟信号相关的 GPS 同步状态。有效状态是SYNCHRONIZED
、ANTENNA_DISCONNECTED
或ACQUIRING_SYNC
。
您可以组合使用设备同步状态订阅,以提供有关系统总体同步健康状况的详细视图。
API 响应示例
您可以在 cloud-event-proxy
容器的日志中找到 os-clock-sync-state
、ptp-clock-class-change
、lock-state
和 gnss-sync-status
事件。例如:
oc logs -f linuxptp-daemon-cvgr6 -n openshift-ptp -c cloud-event-proxy
$ oc logs -f linuxptp-daemon-cvgr6 -n openshift-ptp -c cloud-event-proxy
os-clock-sync-state 事件示例
ptp-clock-class-change 事件示例
lock-state 事件示例
gnss-sync-status 事件示例
HTTP 方法
GET api/ocloudNotifications/v1/cluster/node/<node_name>/sync/ptp-status/lock-state/CurrentState
GET api/ocloudNotifications/v1/cluster/node/<node_name>/sync/sync-status/os-clock-sync-state/CurrentState
GET api/ocloudNotifications/v1/cluster/node/<node_name>/sync/ptp-status/ptp-clock-class-change/CurrentState
描述
配置 CurrentState
API 端点,以返回 os-clock-sync-state
、ptp-clock-class-change
、lock-state
事件的当前状态。
-
os-clock-sync-state
通知描述了主机操作系统时钟同步状态。可以是LOCKED
或FREERUN
状态。 -
ptp-clock-class-change
通知描述了 PTP 时钟类的当前状态。 -
lock-state
通知描述了 PTP 设备锁定状态的当前状态。可以处于LOCKED
、HOLDOVER
或FREERUN
状态。
参数 | 类型 |
---|---|
| string |
lock-state API 响应示例
os-clock-sync-state API 响应示例
ptp-clock-class-change API 响应示例
17.3.7. 监控 PTP 快速事件指标 复制链接链接已复制到粘贴板!
您可以从运行 linuxptp-daemon
的集群节点监控 PTP 快速事件指标。您还可以使用预先配置和自我更新的 Prometheus 监控堆栈来监控 OpenShift Container Platform Web 控制台中的 PTP 快速事件指标。
先决条件
-
安装 OpenShift Container Platform CLI
oc
。 -
以具有
cluster-admin
特权的用户身份登录。 - 在具有 PTP 功能硬件的节点上安装和配置 PTP Operator。
流程
运行以下命令,为节点启动 debug pod:
oc debug node/<node_name>
$ oc debug node/<node_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查
linuxptp-daemon
容器公开的 PTP 指标。例如,运行以下命令:curl http://localhost:9091/metrics
sh-4.4# curl http://localhost:9091/metrics
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
要在 OpenShift Container Platform web 控制台中查看 PTP 事件,请复制您要查询的 PTP 指标的名称,如
openshift_ptp_offset_ns
。 -
在 OpenShift Container Platform web 控制台中点 Observe
Metrics。 - 将 PTP 指标名称粘贴到 Expression 字段中,然后点 Run query。
17.3.8. PTP 快速事件指标参考 复制链接链接已复制到粘贴板!
下表描述了运行 linuxptp-daemon
服务的集群节点可用的 PTP 快速事件指标。
指标 | 描述 | Example |
---|---|---|
|
返回接口的 PTP 时钟类。对于 PTP 时钟类的可能值为:6 ( |
|
|
返回接口的当前 PTP 时钟状态。PTP 时钟状态的可能值为 |
|
| 返回主时钟发送计时数据包和接收计时数据包之间的延迟(以纳秒为单位)。 |
|
|
当不同 NIC 上有多个时间源时,返回高可用性系统时钟的当前状态。可能的值为 0 ( |
|
|
以纳秒为单位返回 2 PTP 时钟之间的频率调整。例如,在上游时钟和 NIC 之间,系统时钟和 NIC 之间,或在 PTP 硬件时钟( |
|
|
返回为接口配置的 PTP 时钟角色。可能的值包括 0 ( |
|
|
返回 2 时钟或接口之间的最大偏移量(以纳秒为单位)。例如,在上游 GNSS 时钟和 NIC ( |
|
| 返回 DPLL 时钟或 GNSS 时钟源和 NIC 硬件时钟之间的偏移量。 |
|
|
返回 |
|
| 返回显示 PTP 进程是否正在运行的状态代码。 |
|
|
为
|
|
只有在启用 T-GM 时,PTP 快速事件指标
下表描述了仅在启用 PTP grandmaster 时钟 (T-GM) 时可用的 PTP 快速事件指标。
指标 | 描述 | Example |
---|---|---|
|
返回 NIC 的数字阶段锁定循环(DPLL)频率的当前状态。可能的值为 -1 ( |
|
|
返回 NMEA 连接的当前状态。NMEA 是 1PPS NIC 连接使用的协议。可能的值有 0 ( |
|
|
返回 NIC 的 DPLL 阶段的状态。可能的值为 -1 ( |
|
|
返回 NIC 1PPS 连接的当前状态。您可以使用 1PPS 连接在连接的 NIC 之间同步计时。可能的值有 0 ( |
|
|
返回全局导航 Satellite 系统(GNSS)连接的当前状态。GNSS 在全局范围内提供基于 satellite 的位置、导航和计时服务。可能的值包括 0 ( |
|