18.2. 配置 PTP 设备
PTP Operator 将 NodePtpDevice.ptp.openshift.io
自定义资源定义(CRD)添加到 OpenShift Container Platform。
安装后,PTP Operator 会在每个节点中搜索具有 PTP 功能的网络设备。它为提供兼容 PTP 的网络设备的每个节点创建并更新 NodePtpDevice
自定义资源(CR)对象。
18.2.1. 使用 CLI 安装 PTP Operator
作为集群管理员,您可以使用 CLI 安装 Operator。
先决条件
- 在裸机中安装有支持 PTP 硬件的节点的集群。
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
为 PTP Operator 创建命名空间。
将以下 YAML 保存到
ptp-namespace.yaml
文件中:apiVersion: v1 kind: Namespace metadata: name: openshift-ptp annotations: workload.openshift.io/allowed: management labels: name: openshift-ptp openshift.io/cluster-monitoring: "true"
创建
Namespace
CR:$ oc create -f ptp-namespace.yaml
为 PTP Operator 创建 Operator 组。
在
ptp-operatorgroup.yaml
文件中保存以下 YAML:apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: ptp-operators namespace: openshift-ptp spec: targetNamespaces: - openshift-ptp
创建
OperatorGroup
CR:$ oc create -f ptp-operatorgroup.yaml
订阅 PTP Operator。
将以下 YAML 保存到
ptp-sub.yaml
文件中:apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: ptp-operator-subscription namespace: openshift-ptp spec: channel: "stable" name: ptp-operator source: redhat-operators sourceNamespace: openshift-marketplace
创建
Subscription
CR:$ oc create -f ptp-sub.yaml
要验证是否已安装 Operator,请输入以下命令:
$ oc get csv -n openshift-ptp -o custom-columns=Name:.metadata.name,Phase:.status.phase
输出示例
Name Phase 4.16.0-202301261535 Succeeded
18.2.2. 使用 Web 控制台安装 PTP Operator
作为集群管理员,您可以使用 Web 控制台安装 PTP Operator。
如上一节所述,您必须创建命名空间和 operator 组。
流程
使用 OpenShift Container Platform Web 控制台安装 PTP Operator:
-
在 OpenShift Container Platform Web 控制台中,点击 Operators
OperatorHub。 - 从可用的 Operator 列表中选择 PTP Operator,然后点 Install。
- 在 Install Operator 页面中,在 A specific namespace on the cluster 下选择 openshift-ptp。然后点击 Install。
-
在 OpenShift Container Platform Web 控制台中,点击 Operators
可选:验证是否成功安装了 PTP Operator:
-
切换到 Operators
Installed Operators 页面。 确保 openshift-ptp 项目中列出的 PTP Operator 的 Status 为 InstallSucceeded。
注意在安装过程中,Operator 可能会显示 Failed 状态。如果安装过程结束后有 InstallSucceeded 信息,您可以忽略这个 Failed 信息。
如果 Operator 没有被成功安装,请按照以下步骤进行故障排除:
-
进入 Operators
Installed Operators 页面,检查 Operator Subscriptions 和 Install Plans 选项卡中的 Status 项中是否有任何错误。 -
进入 Workloads
Pods 页面,检查 openshift-ptp
项目中 pod 的日志。
-
进入 Operators
-
切换到 Operators
18.2.3. 在集群中发现具有 PTP 功能网络设备
要返回集群中具有 PTP 功能网络设备的完整列表,请运行以下命令:
$ oc get NodePtpDevice -n openshift-ptp -o yaml
输出示例
apiVersion: v1 items: - apiVersion: ptp.openshift.io/v1 kind: NodePtpDevice metadata: creationTimestamp: "2022-01-27T15:16:28Z" generation: 1 name: dev-worker-0 1 namespace: openshift-ptp resourceVersion: "6538103" uid: d42fc9ad-bcbf-4590-b6d8-b676c642781a spec: {} status: devices: 2 - name: eno1 - name: eno2 - name: eno3 - name: eno4 - name: enp5s0f0 - name: enp5s0f1 ...
18.2.4. 在 PTP Operator 中使用特定于硬件的 NIC 功能
带有内置 PTP 功能的 NIC 硬件有时需要特定于设备的配置。您可以通过在 PtpConfig
自定义资源(CR)中配置插件,将特定于硬件的 NIC 功能用于 PTP Operator 支持的硬件。linuxptp-daemon
服务使用 plugin
小节中的指定参数根据特定的硬件配置启动 linuxptp
进程(ptp4l
和 phc2sys
)。
在 OpenShift Container Platform 4.16 中,通过 PtpConfig
插件支持 Intel E810 NIC。
18.2.5. 将 linuxptp 服务配置为 grandmaster 时钟
您可以通过创建一个配置主机 NIC 的 PtpConfig
自定义资源(CR)将 linuxptp
服务(ptp4l
、phc2sys
、ts2phc
)配置为 grandmaster 时钟(T-GM)。
ts2phc
工具允许您将系统时钟与 PTP grandmaster 时钟同步,以便节点可以将精度时钟信号流传输到下游 PTP 普通时钟和边界时钟。
使用 PtpConfig
CR 示例,将 linuxptp
服务配置为 Intel Westport Channel E810-XXVDA4T 网络接口的 T-GM。
要配置 PTP 快速事件,请为 ptp4lOpts
、ptp4lConf
和 ptpClockThreshold
设置适当的值。ptpClockThreshold
仅在启用事件时使用。如需更多信息,请参阅"配置 PTP 快速事件通知发布程序"。
先决条件
- 对于生产环境中的 T-GM 时钟,请在裸机集群主机上安装 Intel E810 Westport Channel NIC。
-
安装 OpenShift CLI (
oc
) 。 -
以具有
cluster-admin
特权的用户身份登录。 - 安装 PTP Operator。
流程
创建
PtpConfig
CR。例如:根据您的要求,为您的部署使用以下 T-GM 配置之一。将 YAML 保存到
grandmaster-clock-ptp-config.yaml
文件中:例 18.1. E810 NIC 的 PTP grandmaster 时钟配置
apiVersion: ptp.openshift.io/v1 kind: PtpConfig metadata: name: grandmaster namespace: openshift-ptp annotations: {} spec: profile: - name: "grandmaster" ptp4lOpts: "-2 --summary_interval -4" phc2sysOpts: -r -u 0 -m -w -N 8 -R 16 -s $iface_master -n 24 ptpSchedulingPolicy: SCHED_FIFO ptpSchedulingPriority: 10 ptpSettings: logReduce: "true" plugins: e810: enableDefaultConfig: false settings: LocalMaxHoldoverOffSet: 1500 LocalHoldoverTimeout: 14400 MaxInSpecOffset: 100 pins: $e810_pins # "$iface_master": # "U.FL2": "0 2" # "U.FL1": "0 1" # "SMA2": "0 2" # "SMA1": "0 1" ublxCmds: - args: #ubxtool -P 29.20 -z CFG-HW-ANT_CFG_VOLTCTRL,1 - "-P" - "29.20" - "-z" - "CFG-HW-ANT_CFG_VOLTCTRL,1" reportOutput: false - args: #ubxtool -P 29.20 -e GPS - "-P" - "29.20" - "-e" - "GPS" reportOutput: false - args: #ubxtool -P 29.20 -d Galileo - "-P" - "29.20" - "-d" - "Galileo" reportOutput: false - args: #ubxtool -P 29.20 -d GLONASS - "-P" - "29.20" - "-d" - "GLONASS" reportOutput: false - args: #ubxtool -P 29.20 -d BeiDou - "-P" - "29.20" - "-d" - "BeiDou" reportOutput: false - args: #ubxtool -P 29.20 -d SBAS - "-P" - "29.20" - "-d" - "SBAS" reportOutput: false - args: #ubxtool -P 29.20 -t -w 5 -v 1 -e SURVEYIN,600,50000 - "-P" - "29.20" - "-t" - "-w" - "5" - "-v" - "1" - "-e" - "SURVEYIN,600,50000" reportOutput: true - args: #ubxtool -P 29.20 -p MON-HW - "-P" - "29.20" - "-p" - "MON-HW" reportOutput: true - args: #ubxtool -P 29.20 -p CFG-MSG,1,38,248 - "-P" - "29.20" - "-p" - "CFG-MSG,1,38,248" reportOutput: true ts2phcOpts: " " ts2phcConf: | [nmea] ts2phc.master 1 [global] use_syslog 0 verbose 1 logging_level 7 ts2phc.pulsewidth 100000000 #cat /dev/GNSS to find available serial port #example value of gnss_serialport is /dev/ttyGNSS_1700_0 ts2phc.nmea_serialport $gnss_serialport [$iface_master] ts2phc.extts_polarity rising ts2phc.extts_correction 0 ptp4lConf: | [$iface_master] masterOnly 1 [$iface_master_1] masterOnly 1 [$iface_master_2] masterOnly 1 [$iface_master_3] masterOnly 1 [global] # # Default Data Set # twoStepFlag 1 priority1 128 priority2 128 domainNumber 24 #utc_offset 37 clockClass 6 clockAccuracy 0x27 offsetScaledLogVariance 0xFFFF free_running 0 freq_est_interval 1 dscp_event 0 dscp_general 0 dataset_comparison G.8275.x G.8275.defaultDS.localPriority 128 # # Port Data Set # logAnnounceInterval -3 logSyncInterval -4 logMinDelayReqInterval -4 logMinPdelayReqInterval 0 announceReceiptTimeout 3 syncReceiptTimeout 0 delayAsymmetry 0 fault_reset_interval -4 neighborPropDelayThresh 20000000 masterOnly 0 G.8275.portDS.localPriority 128 # # Run time options # assume_two_step 0 logging_level 6 path_trace_enabled 0 follow_up_info 0 hybrid_e2e 0 inhibit_multicast_service 0 net_sync_monitor 0 tc_spanning_tree 0 tx_timestamp_timeout 50 unicast_listen 0 unicast_master_table 0 unicast_req_duration 3600 use_syslog 1 verbose 0 summary_interval -4 kernel_leap 1 check_fup_sync 0 clock_class_threshold 7 # # Servo Options # pi_proportional_const 0.0 pi_integral_const 0.0 pi_proportional_scale 0.0 pi_proportional_exponent -0.3 pi_proportional_norm_max 0.7 pi_integral_scale 0.0 pi_integral_exponent 0.4 pi_integral_norm_max 0.3 step_threshold 2.0 first_step_threshold 0.00002 clock_servo pi sanity_freq_limit 200000000 ntpshm_segment 0 # # Transport options # transportSpecific 0x0 ptp_dst_mac 01:1B:19:00:00:00 p2p_dst_mac 01:80:C2:00:00:0E udp_ttl 1 udp6_scope 0x0E uds_address /var/run/ptp4l # # Default interface options # clock_type BC network_transport L2 delay_mechanism E2E time_stamping hardware tsproc_mode filter delay_filter moving_median delay_filter_length 10 egressLatency 0 ingressLatency 0 boundary_clock_jbod 0 # # Clock description # productDescription ;; revisionData ;; manufacturerIdentity 00:00:00 userDescription ; timeSource 0x20 recommend: - profile: "grandmaster" priority: 4 match: - nodeLabel: "node-role.kubernetes.io/$mcp"
注意对于 E810 Westport Channel NIC,将
ts2phc.nmea_serialport
的值设置为/dev/gnss0
。运行以下命令来创建 CR:
$ oc create -f grandmaster-clock-ptp-config.yaml
验证
检查
PtpConfig
配置集是否已应用到节点。运行以下命令,获取
openshift-ptp
命名空间中的 pod 列表:$ oc get pods -n openshift-ptp -o wide
输出示例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-74m2g 3/3 Running 3 4d15h 10.16.230.7 compute-1.example.com ptp-operator-5f4f48d7c-x7zkf 1/1 Running 1 4d15h 10.128.1.145 compute-1.example.com
检查配置集是否正确。检查与
PtpConfig
配置集中指定的节点对应的linuxptp
守护进程的日志。运行以下命令:$ oc logs linuxptp-daemon-74m2g -n openshift-ptp -c linuxptp-daemon-container
输出示例
ts2phc[94980.334]: [ts2phc.0.config] nmea delay: 98690975 ns ts2phc[94980.334]: [ts2phc.0.config] ens3f0 extts index 0 at 1676577329.999999999 corr 0 src 1676577330.901342528 diff -1 ts2phc[94980.334]: [ts2phc.0.config] ens3f0 master offset -1 s2 freq -1 ts2phc[94980.441]: [ts2phc.0.config] nmea sentence: GNRMC,195453.00,A,4233.24427,N,07126.64420,W,0.008,,160223,,,A,V phc2sys[94980.450]: [ptp4l.0.config] CLOCK_REALTIME phc offset 943 s2 freq -89604 delay 504 phc2sys[94980.512]: [ptp4l.0.config] CLOCK_REALTIME phc offset 1000 s2 freq -89264 delay 474
18.2.6. 将 linuxptp 服务配置为双 E810 Westport Channel NIC 的 grandmaster 时钟
您可以通过创建一个 PtpConfig
自定义资源(CR)来为双 E810 Westport Channel NIC 将 linuxptp
服务(ptp4l
、phc2sys
、ts2phc
)配置为 grandmaster 时钟(T-GM)。
对于分布式 RAN (D-RAN)用例,您可以为双 NIC 配置 PTP,如下所示:
- NIC 一个与全局导航 Satellite 系统(GNSS)时间源同步。
-
NIC 2 将同步到 NIC 提供的 1PPS 时间输出。此配置由
PtpConfig
CR 中的 PTP 硬件插件提供。
双 NIC PTP T-GM 配置使用单个 ptp4l
实例,一个 ts2phc
进程报告两个 ts2phc
实例,每个 NIC 都有一个 ts2phc 实例。主机系统时钟与连接到 GNSS 时间源的 NIC 同步。
使用 PtpConfig
CR 示例,将 linuxptp
服务配置为双 Intel Westport Channel E810-XXVDA4T 网络接口的 T-GM。
要配置 PTP 快速事件,请为 ptp4lOpts
、ptp4lConf
和 ptpClockThreshold
设置适当的值。ptpClockThreshold
仅在启用事件时使用。如需更多信息,请参阅"配置 PTP 快速事件通知发布程序"。
先决条件
- 对于生产环境中的 T-GM 时钟,请在裸机集群主机上安装两个 Intel E810 Westport Channel NIC。
-
安装 OpenShift CLI (
oc
) 。 -
以具有
cluster-admin
特权的用户身份登录。 - 安装 PTP Operator。
流程
创建
PtpConfig
CR。例如:将以下 YAML 保存到
grandmaster-clock-ptp-config-dual-nics.yaml
文件中:例 18.2. 用于双 E810 NIC 的 PTP grandmaster 时钟配置
# In this example two cards $iface_nic1 and $iface_nic2 are connected via # SMA1 ports by a cable and $iface_nic2 receives 1PPS signals from $iface_nic1 apiVersion: ptp.openshift.io/v1 kind: PtpConfig metadata: name: grandmaster namespace: openshift-ptp annotations: {} spec: profile: - name: "grandmaster" ptp4lOpts: "-2 --summary_interval -4" phc2sysOpts: -r -u 0 -m -w -N 8 -R 16 -s $iface_nic1 -n 24 ptpSchedulingPolicy: SCHED_FIFO ptpSchedulingPriority: 10 ptpSettings: logReduce: "true" plugins: e810: enableDefaultConfig: false settings: LocalMaxHoldoverOffSet: 1500 LocalHoldoverTimeout: 14400 MaxInSpecOffset: 100 pins: $e810_pins # "$iface_nic1": # "U.FL2": "0 2" # "U.FL1": "0 1" # "SMA2": "0 2" # "SMA1": "2 1" # "$iface_nic2": # "U.FL2": "0 2" # "U.FL1": "0 1" # "SMA2": "0 2" # "SMA1": "1 1" ublxCmds: - args: #ubxtool -P 29.20 -z CFG-HW-ANT_CFG_VOLTCTRL,1 - "-P" - "29.20" - "-z" - "CFG-HW-ANT_CFG_VOLTCTRL,1" reportOutput: false - args: #ubxtool -P 29.20 -e GPS - "-P" - "29.20" - "-e" - "GPS" reportOutput: false - args: #ubxtool -P 29.20 -d Galileo - "-P" - "29.20" - "-d" - "Galileo" reportOutput: false - args: #ubxtool -P 29.20 -d GLONASS - "-P" - "29.20" - "-d" - "GLONASS" reportOutput: false - args: #ubxtool -P 29.20 -d BeiDou - "-P" - "29.20" - "-d" - "BeiDou" reportOutput: false - args: #ubxtool -P 29.20 -d SBAS - "-P" - "29.20" - "-d" - "SBAS" reportOutput: false - args: #ubxtool -P 29.20 -t -w 5 -v 1 -e SURVEYIN,600,50000 - "-P" - "29.20" - "-t" - "-w" - "5" - "-v" - "1" - "-e" - "SURVEYIN,600,50000" reportOutput: true - args: #ubxtool -P 29.20 -p MON-HW - "-P" - "29.20" - "-p" - "MON-HW" reportOutput: true - args: #ubxtool -P 29.20 -p CFG-MSG,1,38,248 - "-P" - "29.20" - "-p" - "CFG-MSG,1,38,248" reportOutput: true ts2phcOpts: " " ts2phcConf: | [nmea] ts2phc.master 1 [global] use_syslog 0 verbose 1 logging_level 7 ts2phc.pulsewidth 100000000 #cat /dev/GNSS to find available serial port #example value of gnss_serialport is /dev/ttyGNSS_1700_0 ts2phc.nmea_serialport $gnss_serialport [$iface_nic1] ts2phc.extts_polarity rising ts2phc.extts_correction 0 [$iface_nic2] ts2phc.master 0 ts2phc.extts_polarity rising #this is a measured value in nanoseconds to compensate for SMA cable delay ts2phc.extts_correction -10 ptp4lConf: | [$iface_nic1] masterOnly 1 [$iface_nic1_1] masterOnly 1 [$iface_nic1_2] masterOnly 1 [$iface_nic1_3] masterOnly 1 [$iface_nic2] masterOnly 1 [$iface_nic2_1] masterOnly 1 [$iface_nic2_2] masterOnly 1 [$iface_nic2_3] masterOnly 1 [global] # # Default Data Set # twoStepFlag 1 priority1 128 priority2 128 domainNumber 24 #utc_offset 37 clockClass 6 clockAccuracy 0x27 offsetScaledLogVariance 0xFFFF free_running 0 freq_est_interval 1 dscp_event 0 dscp_general 0 dataset_comparison G.8275.x G.8275.defaultDS.localPriority 128 # # Port Data Set # logAnnounceInterval -3 logSyncInterval -4 logMinDelayReqInterval -4 logMinPdelayReqInterval 0 announceReceiptTimeout 3 syncReceiptTimeout 0 delayAsymmetry 0 fault_reset_interval -4 neighborPropDelayThresh 20000000 masterOnly 0 G.8275.portDS.localPriority 128 # # Run time options # assume_two_step 0 logging_level 6 path_trace_enabled 0 follow_up_info 0 hybrid_e2e 0 inhibit_multicast_service 0 net_sync_monitor 0 tc_spanning_tree 0 tx_timestamp_timeout 50 unicast_listen 0 unicast_master_table 0 unicast_req_duration 3600 use_syslog 1 verbose 0 summary_interval -4 kernel_leap 1 check_fup_sync 0 clock_class_threshold 7 # # Servo Options # pi_proportional_const 0.0 pi_integral_const 0.0 pi_proportional_scale 0.0 pi_proportional_exponent -0.3 pi_proportional_norm_max 0.7 pi_integral_scale 0.0 pi_integral_exponent 0.4 pi_integral_norm_max 0.3 step_threshold 2.0 first_step_threshold 0.00002 clock_servo pi sanity_freq_limit 200000000 ntpshm_segment 0 # # Transport options # transportSpecific 0x0 ptp_dst_mac 01:1B:19:00:00:00 p2p_dst_mac 01:80:C2:00:00:0E udp_ttl 1 udp6_scope 0x0E uds_address /var/run/ptp4l # # Default interface options # clock_type BC network_transport L2 delay_mechanism E2E time_stamping hardware tsproc_mode filter delay_filter moving_median delay_filter_length 10 egressLatency 0 ingressLatency 0 boundary_clock_jbod 1 # # Clock description # productDescription ;; revisionData ;; manufacturerIdentity 00:00:00 userDescription ; timeSource 0x20 recommend: - profile: "grandmaster" priority: 4 match: - nodeLabel: "node-role.kubernetes.io/$mcp"
注意对于 E810 Westport Channel NIC,将
ts2phc.nmea_serialport
的值设置为/dev/gnss0
。运行以下命令来创建 CR:
$ oc create -f grandmaster-clock-ptp-config-dual-nics.yaml
验证
检查
PtpConfig
配置集是否已应用到节点。运行以下命令,获取
openshift-ptp
命名空间中的 pod 列表:$ oc get pods -n openshift-ptp -o wide
输出示例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-74m2g 3/3 Running 3 4d15h 10.16.230.7 compute-1.example.com ptp-operator-5f4f48d7c-x7zkf 1/1 Running 1 4d15h 10.128.1.145 compute-1.example.com
检查配置集是否正确。检查与
PtpConfig
配置集中指定的节点对应的linuxptp
守护进程的日志。运行以下命令:$ oc logs linuxptp-daemon-74m2g -n openshift-ptp -c linuxptp-daemon-container
输出示例
ts2phc[509863.660]: [ts2phc.0.config] nmea delay: 347527248 ns ts2phc[509863.660]: [ts2phc.0.config] ens2f0 extts index 0 at 1705516553.000000000 corr 0 src 1705516553.652499081 diff 0 ts2phc[509863.660]: [ts2phc.0.config] ens2f0 master offset 0 s2 freq -0 I0117 18:35:16.000146 1633226 stats.go:57] state updated for ts2phc =s2 I0117 18:35:16.000163 1633226 event.go:417] dpll State s2, gnss State s2, tsphc state s2, gm state s2, ts2phc[1705516516]:[ts2phc.0.config] ens2f0 nmea_status 1 offset 0 s2 GM[1705516516]:[ts2phc.0.config] ens2f0 T-GM-STATUS s2 ts2phc[509863.677]: [ts2phc.0.config] ens7f0 extts index 0 at 1705516553.000000010 corr -10 src 1705516553.652499081 diff 0 ts2phc[509863.677]: [ts2phc.0.config] ens7f0 master offset 0 s2 freq -0 I0117 18:35:16.016597 1633226 stats.go:57] state updated for ts2phc =s2 phc2sys[509863.719]: [ptp4l.0.config] CLOCK_REALTIME phc offset -6 s2 freq +15441 delay 510 phc2sys[509863.782]: [ptp4l.0.config] CLOCK_REALTIME phc offset -7 s2 freq +15438 delay 502
其他资源
18.2.6.1. grandmaster clock PtpConfig 配置参考
以下参考信息描述了 PtpConfig
自定义资源(CR)的配置选项,将 linuxptp
服务(ptp4l
、phc2sys
、ts2phc
)配置为 grandmaster 时钟。
PtpConfig CR 字段 | 描述 |
---|---|
|
指定一组
插件机制允许 PTP Operator 进行自动硬件配置。对于 Intel Westport Channel NIC,当 |
|
为 |
|
指定启动 |
| 指定丢弃数据前从发送方等待传输 (TX) 时间戳的最长时间。 |
| 指定 JBOD 边界时钟时间延迟值。这个值用于更正网络时间设备之间传递的时间值。 |
|
为 注意
确保此处列出的网络接口配置为 grandmaster,并在 |
|
为 |
|
当 |
|
可选。如果 |
|
设置
|
|
为 |
|
指定包括一个或多个 |
|
指定在 |
|
使用 |
|
使用 |
|
通过 |
|
使用 |
18.2.6.2. grandmaster 时钟类同步状态参考
下表描述了 PTP grandmaster 时钟(T-GM) gm.ClockClass
状态。时钟类状态根据其准确性和稳定性根据主要参考时间时钟(PRTC)或其他计时来源对 T-GM 时钟进行分类。
holdover 规格是 PTP 时钟可以维护同步的时间,而无需从主时间源接收更新。
时钟类状态 | 描述 |
---|---|
|
T-GM 时钟在 |
|
T-GM 时钟处于 |
|
T-GM 时钟处于 |
|
T-GM 时钟处于 |
如需更多信息,请参阅 "Phase/time traceability information", ITU-T G.8275.1/Y.1369.1 Recommendations.
18.2.6.3. Intel Westport Channel E810 硬件配置参考
使用这些信息了解如何使用 Intel E810-XXVDA4T 硬件插件 将 E810 网络接口配置为 PTP grandmaster 时钟。硬件固定配置决定了网络接口如何与系统中的其他组件和设备进行交互。E810-XXVDA4T NIC 有四个连接器用于外部 1PPS 信号:SMA1
, SMA2
, U.FL1
, 和 U.FL2
。
硬件固定 | 推荐的设置 | 描述 |
---|---|---|
|
|
禁用 |
|
|
禁用 |
|
|
禁用 |
|
|
禁用 |
SMA1
和 U.FL1
连接器共享通道。SMA2
和 U.FL2
连接器共享通道二。
设置 spec.profile.plugins.e810.ublxCmds
参数,以在 PtpConfig
自定义资源(CR) 中配置 GNSS 时钟。这些 ublxCmds
小节各自对应于使用 ubxtool
命令应用到主机 NIC 的配置。例如:
ublxCmds: - args: #ubxtool -P 29.20 -z CFG-HW-ANT_CFG_VOLTCTRL,1 - "-P" - "29.20" - "-z" - "CFG-HW-ANT_CFG_VOLTCTRL,1" reportOutput: false
下表描述了等效的 ubxtool
命令:
ubxtool 命令 | 描述 |
---|---|
|
启用 atenna voltage 控制。启用在 |
| 启用 atenna 接收 GPS 信号。 |
| 配置 atenna 以接收来自 Galileo GPS satellite 的信号。 |
| 禁用 atenna 从 GLONASS GPS satellite 接收信号。 |
| 禁用 atenna 从 BeiDou GPS satellite 接收信号。 |
| 禁用 atenna 从 SBAS GPS satellite 接收信号。 |
| 配置 GNSS 接收器调查进程,以提高其初始位置估算。这可能需要 24 小时才能获得最佳结果。 |
| 对硬件运行单个自动扫描,并报告 NIC 状态和配置设置。 |
E810 插件实现以下接口:
Interface | 描述 |
---|---|
|
每当您更新 |
|
启动 PTP 进程并运行 |
|
根据 |
E810 插件有以下 struct 和变量:
Struct | 描述 |
---|---|
| 代表 E810 插件的选项,包括布尔值标志和网络设备固定映射。 |
|
代表带有布尔值标志和命令参数字符串片段的 |
| 包含插件执行期间使用的特定于插件的数据。 |
18.2.6.4. 双 E810 Westport Channel NIC 配置参考
使用这些信息了解如何使用 Intel E810-XXVDA4T 硬件插件将 E810 网络接口配置为 PTP grandmaster 时钟(T-GM)。
在配置双 NIC 集群主机前,您必须使用 1PPS faceplace 连接将两个 NIC 与 SMA1 电缆连接。
当您配置双 NIC T-GM 时,您需要补补使用 SMA1 连接端口连接 NIC 时发生的 1PPS 信号延迟。电缆长度、基线温度、组件和制造容错等各种因素可能会影响信号延迟。要满足延迟要求,您必须计算用于偏移信号延迟的特定值。
PtpConfig 字段 | 描述 |
---|---|
| 使用 PTP Operator E810 硬件插件配置 E810 硬件固定。
|
|
使用 |
|
将 |
18.2.7. 为 PTP grandmaster 时钟配置动态秒处理
PTP Operator 容器镜像包含最新的 leap-seconds.list
文件,该文件在发布时可用。您可以使用全局位置系统(GPS)公告将 PTP Operator 配置为自动更新闰秒文件。
闰秒信息存储在 openshift-ptp
命名空间中的名为 leap-configmap
的自动生成的 ConfigMap
资源中。PTP Operator 将 leap-configmap
资源挂载为 linuxptp-daemon
pod 中的卷,该 pod 可以被 ts2phc
进程访问。
如果 GPS satellite 广播新的闰秒数据,PTP Operator 会使用新数据更新 leap-configmap
资源。ts2phc
进程自动获取更改。
以下步骤作为参考提供。PTP Operator 的 4.16 版本默认启用自动润秒管理。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。 - 您已在集群中安装 PTP Operator 并配置了 PTP grandmaster 时钟 (T-GM)。
流程
在
PtpConfig
CR 的phc2sysOpts
部分中配置自动步处理。设置以下选项:phc2sysOpts: -r -u 0 -m -w -N 8 -R 16 -S 2 -s ens2f0 -n 24 1
- 1
- 设置
-w
用于强制phc2sys
在开始进行自己的同步进程前进行等待,直到ptp4l
已同步了系统时钟。
注意在以前的版本中,T-GM 需要
phc2sys
配置 (-O -37
) 中的偏移调整才能考虑历史的秒。这已不再需要。配置 Intel e810 NIC,以便由
PtpConfig
CR 的spec.profile.plugins.e810.ublxCmds
部分中的 GPS 接收器启用定期报告NAV-TIMELS
消息。例如:- args: #ubxtool -P 29.20 -p CFG-MSG,1,38,248 - "-P" - "29.20" - "-p" - "CFG-MSG,1,38,248"
验证
验证配置的 T-GM 是否收到来自连接的 GPS 的
NAV-TIMELS
消息。运行以下命令:$ oc -n openshift-ptp -c linuxptp-daemon-container exec -it $(oc -n openshift-ptp get pods -o name | grep daemon) -- ubxtool -t -p NAV-TIMELS -P 29.20
输出示例
1722509534.4417 UBX-NAV-STATUS: iTOW 384752000 gpsFix 5 flags 0xdd fixStat 0x0 flags2 0x8 ttff 18261, msss 1367642864 1722509534.4419 UBX-NAV-TIMELS: iTOW 384752000 version 0 reserved2 0 0 0 srcOfCurrLs 2 currLs 18 srcOfLsChange 2 lsChange 0 timeToLsEvent 70376866 dateOfLsGpsWn 2441 dateOfLsGpsDn 7 reserved2 0 0 0 valid x3 1722509534.4421 UBX-NAV-CLOCK: iTOW 384752000 clkB 784281 clkD 435 tAcc 3 fAcc 215 1722509535.4477 UBX-NAV-STATUS: iTOW 384753000 gpsFix 5 flags 0xdd fixStat 0x0 flags2 0x8 ttff 18261, msss 1367643864 1722509535.4479 UBX-NAV-CLOCK: iTOW 384753000 clkB 784716 clkD 435 tAcc 3 fAcc 218
验证
leap-configmap
资源是否已由 PTP Operator 成功生成,并且使用最新版本的 leap-seconds.list 保持最新状态。运行以下命令:$ oc -n openshift-ptp get configmap leap-configmap -o jsonpath='{.data.<node_name>}' 1
- 1
- 将
<node_name>
替换为您安装并配置 PTP T-GM 时钟的节点,使用自动闰秒管理。在节点名称中转义特殊字符。例如,node-1\.example\.com
。
输出示例
# Do not edit # This file is generated automatically by linuxptp-daemon #$ 3913697179 #@ 4291747200 2272060800 10 # 1 Jan 1972 2287785600 11 # 1 Jul 1972 2303683200 12 # 1 Jan 1973 2335219200 13 # 1 Jan 1974 2366755200 14 # 1 Jan 1975 2398291200 15 # 1 Jan 1976 2429913600 16 # 1 Jan 1977 2461449600 17 # 1 Jan 1978 2492985600 18 # 1 Jan 1979 2524521600 19 # 1 Jan 1980 2571782400 20 # 1 Jul 1981 2603318400 21 # 1 Jul 1982 2634854400 22 # 1 Jul 1983 2698012800 23 # 1 Jul 1985 2776982400 24 # 1 Jan 1988 2840140800 25 # 1 Jan 1990 2871676800 26 # 1 Jan 1991 2918937600 27 # 1 Jul 1992 2950473600 28 # 1 Jul 1993 2982009600 29 # 1 Jul 1994 3029443200 30 # 1 Jan 1996 3076704000 31 # 1 Jul 1997 3124137600 32 # 1 Jan 1999 3345062400 33 # 1 Jan 2006 3439756800 34 # 1 Jan 2009 3550089600 35 # 1 Jul 2012 3644697600 36 # 1 Jul 2015 3692217600 37 # 1 Jan 2017 #h e65754d4 8f39962b aa854a61 661ef546 d2af0bfa
18.2.8. 将 linuxptp 服务配置为边界时钟
您可以通过创建 PtpConfig
自定义资源(CR)对象将 linuxptp
服务(ptp4l
、phc2sys
)配置为边界时钟。
使用 PtpConfig
CR 示例,将 linuxptp
服务配置为特定硬件和环境的边界时钟。这个示例 CR 没有配置 PTP 快速事件。要配置 PTP 快速事件,请为 ptp4lOpts
、ptp4lConf
和 ptpClockThreshold
设置适当的值。ptpClockThreshold
仅在启用事件时使用。如需更多信息,请参阅"配置 PTP 快速事件通知发布程序"。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。 - 安装 PTP Operator。
流程
创建以下
PtpConfig
CR,然后在boundaries-clock-ptp-config.yaml
文件中保存 YAML。PTP 边界时钟配置示例
apiVersion: ptp.openshift.io/v1 kind: PtpConfig metadata: name: boundary-clock namespace: openshift-ptp annotations: {} spec: profile: - name: boundary-clock ptp4lOpts: "-2" phc2sysOpts: "-a -r -n 24" ptpSchedulingPolicy: SCHED_FIFO ptpSchedulingPriority: 10 ptpSettings: logReduce: "true" ptp4lConf: | # The interface name is hardware-specific [$iface_slave] masterOnly 0 [$iface_master_1] masterOnly 1 [$iface_master_2] masterOnly 1 [$iface_master_3] masterOnly 1 [global] # # Default Data Set # twoStepFlag 1 slaveOnly 0 priority1 128 priority2 128 domainNumber 24 #utc_offset 37 clockClass 248 clockAccuracy 0xFE offsetScaledLogVariance 0xFFFF free_running 0 freq_est_interval 1 dscp_event 0 dscp_general 0 dataset_comparison G.8275.x G.8275.defaultDS.localPriority 128 # # Port Data Set # logAnnounceInterval -3 logSyncInterval -4 logMinDelayReqInterval -4 logMinPdelayReqInterval -4 announceReceiptTimeout 3 syncReceiptTimeout 0 delayAsymmetry 0 fault_reset_interval -4 neighborPropDelayThresh 20000000 masterOnly 0 G.8275.portDS.localPriority 128 # # Run time options # assume_two_step 0 logging_level 6 path_trace_enabled 0 follow_up_info 0 hybrid_e2e 0 inhibit_multicast_service 0 net_sync_monitor 0 tc_spanning_tree 0 tx_timestamp_timeout 50 unicast_listen 0 unicast_master_table 0 unicast_req_duration 3600 use_syslog 1 verbose 0 summary_interval 0 kernel_leap 1 check_fup_sync 0 clock_class_threshold 135 # # Servo Options # pi_proportional_const 0.0 pi_integral_const 0.0 pi_proportional_scale 0.0 pi_proportional_exponent -0.3 pi_proportional_norm_max 0.7 pi_integral_scale 0.0 pi_integral_exponent 0.4 pi_integral_norm_max 0.3 step_threshold 2.0 first_step_threshold 0.00002 max_frequency 900000000 clock_servo pi sanity_freq_limit 200000000 ntpshm_segment 0 # # Transport options # transportSpecific 0x0 ptp_dst_mac 01:1B:19:00:00:00 p2p_dst_mac 01:80:C2:00:00:0E udp_ttl 1 udp6_scope 0x0E uds_address /var/run/ptp4l # # Default interface options # clock_type BC network_transport L2 delay_mechanism E2E time_stamping hardware tsproc_mode filter delay_filter moving_median delay_filter_length 10 egressLatency 0 ingressLatency 0 boundary_clock_jbod 0 # # Clock description # productDescription ;; revisionData ;; manufacturerIdentity 00:00:00 userDescription ; timeSource 0xA0 recommend: - profile: boundary-clock priority: 4 match: - nodeLabel: "node-role.kubernetes.io/$mcp"
表 18.8. PTP 边界时钟 CR 配置选项 CR 字段 描述 名称
PtpConfig
CR 的名称。配置集
指定包括一个或多个
profile
的数组。名称
指定唯一标识配置集对象的配置集对象的名称。
ptp4lOpts
为
ptp4l
服务指定系统配置选项。该选项不应包含网络接口名称-i <interface>
和服务配置文件-f /etc/ptp4l.conf
,因为网络接口名称和服务配置文件会被自动附加。ptp4lConf
指定启动
ptp4l
作为边界时钟所需的配置。例如,ens1f0
同步来自 Pumaster 时钟,ens1f3
同步连接的设备。<interface_1>
接收同步时钟的接口。
<interface_2>
发送同步时钟的接口。
tx_timestamp_timeout
对于 Intel Columbiaville 800 系列 NIC,将
tx_timestamp_timeout
设置为50
。boundary_clock_jbod
对于 Intel Columbiaville 800 系列 NIC,请确保
boundary_clock_jbod
设置为0。
对于 Intel Fortville X710 系列 NIC,请确保boundary_clock_jbod
设置为1
。phc2sysOpts
为
phc2sys
服务指定系统配置选项。如果此字段为空,PTP Operator 不会启动phc2sys
服务。ptpSchedulingPolicy
ptp4l 和 phc2sys 进程的调度策略。默认值为
SCHED_OTHER
。在支持 FIFO 调度的系统上使用SCHED_FIFO
。ptpSchedulingPriority
当
ptpSchedulingPolicy
设置为SCHED_FIFO
时,用于为ptp4l
和phc2sys
进程设置 FIFO 优先级的整数值(1 到 65)。当ptpSchedulingPolicy
设置为SCHED_OTHER
时,不使用ptpSchedulingPriority
字段。ptpClockThreshold
可选。如果没有
ptpClockThreshold
,用于ptpClockThreshold
字段的默认值。ptpClockThreshold
配置在触发 PTP 时间前,PTP master 时钟已断开连接的时长。holdOverTimeout
是在 PTP master clock 断开连接时,PTP 时钟事件状态更改为FREERUN
前的时间值(以秒为单位)。maxOffsetThreshold
和minOffsetThreshold
设置以纳秒为单位,它们与CLOCK_REALTIME
(phc2sys
) 或 master 偏移 (ptp4l
) 的值进行比较。当ptp4l
或phc2sys
偏移值超出这个范围时,PTP 时钟状态被设置为FREERUN
。当偏移值在这个范围内时,PTP 时钟状态被设置为LOCKED
。建议
指定包括一个或多个
recommend
对象的数组,该数组定义了如何将配置集
应用到节点的规则。.recommend.profile
指定在
profile
部分定义的.recommend.profile
对象名称。.recommend.priority
使用
0
到99
之间的一个整数值指定priority
。大数值的优先级较低,因此优先级99
低于优先级10
。如果节点可以根据match
字段中定义的规则与多个配置集匹配,则优先级较高的配置集会应用到该节点。.recommend.match
使用
nodeLabel
或nodeName
值指定.recommend.match
规则。.recommend.match.nodeLabel
通过
oc get nodes --show-labels
命令,使用来自节点对象的node.Labels
的key
设置nodeLabel
。例如,node-role.kubernetes.io/worker
。.recommend.match.nodeName
使用
oc get nodes
命令,将nodeName
设置为来自节点对象的node.Name
值。例如,compute-1.example.com
。运行以下命令来创建 CR:
$ oc create -f boundary-clock-ptp-config.yaml
验证
检查
PtpConfig
配置集是否已应用到节点。运行以下命令,获取
openshift-ptp
命名空间中的 pod 列表:$ oc get pods -n openshift-ptp -o wide
输出示例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-4xkbb 1/1 Running 0 43m 10.1.196.24 compute-0.example.com linuxptp-daemon-tdspf 1/1 Running 0 43m 10.1.196.25 compute-1.example.com ptp-operator-657bbb64c8-2f8sj 1/1 Running 0 43m 10.129.0.61 control-plane-1.example.com
检查配置集是否正确。检查与
PtpConfig
配置集中指定的节点对应的linuxptp
守护进程的日志。运行以下命令:$ oc logs linuxptp-daemon-4xkbb -n openshift-ptp -c linuxptp-daemon-container
输出示例
I1115 09:41:17.117596 4143292 daemon.go:107] in applyNodePTPProfile I1115 09:41:17.117604 4143292 daemon.go:109] updating NodePTPProfile to: I1115 09:41:17.117607 4143292 daemon.go:110] ------------------------------------ I1115 09:41:17.117612 4143292 daemon.go:102] Profile Name: profile1 I1115 09:41:17.117616 4143292 daemon.go:102] Interface: I1115 09:41:17.117620 4143292 daemon.go:102] Ptp4lOpts: -2 I1115 09:41:17.117623 4143292 daemon.go:102] Phc2sysOpts: -a -r -n 24 I1115 09:41:17.117626 4143292 daemon.go:116] ------------------------------------
18.2.8.1. 将 linuxptp 服务配置为双 NIC 硬件的边界时钟
您可以通过为每个 NIC 创建一个 PtpConfig
自定义资源(CR)对象,将 linuxptp
服务(ptp4l
、phc2sys
)配置为双 NIC 硬件的边界时钟。
双 NIC 硬件允许您将每个 NIC 连接到相同的上游领导时钟,并将每个 NIC 的 ptp4l
实例连接给下游时钟。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。 - 安装 PTP Operator。
流程
创建两个单独的
PtpConfig
CR,每个 NIC 使用 "Configuring linuxptp 服务作为边界时钟"中的引用 CR,作为每个 CR 的基础。例如:创建
boundary-clock-ptp-config-nic1.yaml
,为phc2sysOpts
指定值:apiVersion: ptp.openshift.io/v1 kind: PtpConfig metadata: name: boundary-clock-ptp-config-nic1 namespace: openshift-ptp spec: profile: - name: "profile1" ptp4lOpts: "-2 --summary_interval -4" ptp4lConf: | 1 [ens5f1] masterOnly 1 [ens5f0] masterOnly 0 ... phc2sysOpts: "-a -r -m -n 24 -N 8 -R 16" 2
创建
boundary-clock-ptp-config-nic2.yaml
,删除phc2sysOpts
字段,以完全禁用第二个 NIC 的phc2sys
服务:apiVersion: ptp.openshift.io/v1 kind: PtpConfig metadata: name: boundary-clock-ptp-config-nic2 namespace: openshift-ptp spec: profile: - name: "profile2" ptp4lOpts: "-2 --summary_interval -4" ptp4lConf: | 1 [ens7f1] masterOnly 1 [ens7f0] masterOnly 0 ...
- 1
- 在第二个 NIC上 指定所需的接口来启动
ptp4l
作为一个边境时钟。
注意您必须从第二个
PtpConfig
CR 中完全删除phc2sysOpts
字段,以禁用第二个 NIC 上的phc2sys
服务。
运行以下命令来创建双 NIC
PtpConfig
CR:创建 CR 来为第一个 NIC 配置 PTP:
$ oc create -f boundary-clock-ptp-config-nic1.yaml
创建 CR 来为第二个 NIC 配置 PTP:
$ oc create -f boundary-clock-ptp-config-nic2.yaml
验证
检查 PTP Operator 是否为两个 NIC 应用了
PtpConfig
CR。检查与安装了双 NIC 硬件的节点对应的linuxptp
守护进程的日志。例如,运行以下命令:$ oc logs linuxptp-daemon-cvgr6 -n openshift-ptp -c linuxptp-daemon-container
输出示例
ptp4l[80828.335]: [ptp4l.1.config] master offset 5 s2 freq -5727 path delay 519 ptp4l[80828.343]: [ptp4l.0.config] master offset -5 s2 freq -10607 path delay 533 phc2sys[80828.390]: [ptp4l.0.config] CLOCK_REALTIME phc offset 1 s2 freq -87239 delay 539
18.2.8.2. 将 linuxptp 配置为双 NIC Intel E810 PTP 边界时钟的高可用性系统时钟
您可以将 linuxptp
服务 ptp4l
和 phc2sys
配置为双 PTP 边界时钟 (T-BC) 的高可用性 (HA) 系统时钟。
高可用性系统时钟使用来自双 NIC Intel E810 Salem 频道硬件的多个时间源,配置为两个边界时钟。两个边界时钟实例参与 HA 设置,每个设置都有自己的配置 profile。您可以将每个 NIC 连接到相同的上游领导时钟,每个 NIC 为下游时钟提供单独的 ptp4l
实例。
创建两个 PtpConfig
自定义资源 (CR) 对象,将 NIC 配置为 T-BC 和第三个 PtpConfig
CR,以配置两个 NIC 之间的高可用性。
您可以在配置 HA 的 PtpConfig
CR 中设置 phc2SysOpts
选项。在 PtpConfig CR 中将 phc2sysOpts
字段设置为配置两个 NIC 的 PtpConfig
CR 中的空字符串。这可防止为两个配置集设置单独的 phc2sys
进程。
第三个 PtpConfig
CR 配置高度可用的系统时钟服务。CR 将 ptp4lOpts
字段设置为空字符串,以防止 ptp4l
进程运行。CR 在 spec.profile.ptpSettings.haProfiles
键下添加 ptp4l
配置的配置集,并将这些配置集的内核套接字路径传递给 phc2sys
服务。当出现 ptp4l
失败时,phc2sys
服务将切换到备份 ptp4l
配置。当主配置集再次激活时,phc2sys
服务将恢复到原始状态。
确保将 spec.recommend.priority
设置为您用来配置 HA 的所有三个 PtpConfig
CR 的值。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。 - 安装 PTP Operator。
- 使用 Intel E810 Salem 频道双 NIC 配置集群节点。
流程
创建两个单独的
PtpConfig
CR,每个 NIC 使用"将 linuxptp 服务配置为双 NIC 硬件边界时钟"中的 CR 作为每个 CR 的引用。创建
ha-ptp-config-nic1.yaml
文件,为phc2sysOpts
字段指定一个空字符串。例如:apiVersion: ptp.openshift.io/v1 kind: PtpConfig metadata: name: ha-ptp-config-nic1 namespace: openshift-ptp spec: profile: - name: "ha-ptp-config-profile1" ptp4lOpts: "-2 --summary_interval -4" ptp4lConf: | 1 [ens5f1] masterOnly 1 [ens5f0] masterOnly 0 #... phc2sysOpts: "" 2
运行以下命令,为 NIC 1 应用
PtpConfig
CR:$ oc create -f ha-ptp-config-nic1.yaml
创建
ha-ptp-config-nic2.yaml
文件,为phc2sysOpts
字段指定一个空字符串。例如:apiVersion: ptp.openshift.io/v1 kind: PtpConfig metadata: name: ha-ptp-config-nic2 namespace: openshift-ptp spec: profile: - name: "ha-ptp-config-profile2" ptp4lOpts: "-2 --summary_interval -4" ptp4lConf: | [ens7f1] masterOnly 1 [ens7f0] masterOnly 0 #... phc2sysOpts: ""
运行以下命令,为 NIC 2 应用
PtpConfig
CR:$ oc create -f ha-ptp-config-nic2.yaml
创建配置 HA 系统时钟的
PtpConfig
CR。例如:创建
ptp-config-for-ha.yaml
文件。将haProfiles
设置为与配置两个 NIC 的PtpConfig
CR 中设置的metadata.name
字段匹配。例如:haProfiles: ha-ptp-config-nic1,ha-ptp-config-nic2
apiVersion: ptp.openshift.io/v1 kind: PtpConfig metadata: name: boundary-ha namespace: openshift-ptp annotations: {} spec: profile: - name: "boundary-ha" ptp4lOpts: "" 1 phc2sysOpts: "-a -r -n 24" ptpSchedulingPolicy: SCHED_FIFO ptpSchedulingPriority: 10 ptpSettings: logReduce: "true" haProfiles: "$profile1,$profile2" recommend: - profile: "boundary-ha" priority: 4 match: - nodeLabel: "node-role.kubernetes.io/$mcp"
- 1
- 将
ptp4lOpts
字段设置为空字符串。如果它不为空,p4ptl
进程开始时会带有一个严重错误。
重要在配置单个 NIC 的
PtpConfig
CR 前,不要应用高可用性PtpConfig
CR。运行以下命令来应用 HA
PtpConfig
CR:$ oc create -f ptp-config-for-ha.yaml
验证
验证 PTP Operator 是否已正确应用
PtpConfig
CR。执行以下步骤:运行以下命令,获取
openshift-ptp
命名空间中的 pod 列表:$ oc get pods -n openshift-ptp -o wide
输出示例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-4xkrb 1/1 Running 0 43m 10.1.196.24 compute-0.example.com ptp-operator-657bbq64c8-2f8sj 1/1 Running 0 43m 10.129.0.61 control-plane-1.example.com
注意应该只有一个
linuxptp-daemon
pod。运行以下命令,检查配置集是否正确。检查与
PtpConfig
配置集中指定的节点对应的linuxptp
守护进程的日志。$ oc logs linuxptp-daemon-4xkrb -n openshift-ptp -c linuxptp-daemon-container
输出示例
I1115 09:41:17.117596 4143292 daemon.go:107] in applyNodePTPProfile I1115 09:41:17.117604 4143292 daemon.go:109] updating NodePTPProfile to: I1115 09:41:17.117607 4143292 daemon.go:110] ------------------------------------ I1115 09:41:17.117612 4143292 daemon.go:102] Profile Name: ha-ptp-config-profile1 I1115 09:41:17.117616 4143292 daemon.go:102] Interface: I1115 09:41:17.117620 4143292 daemon.go:102] Ptp4lOpts: -2 I1115 09:41:17.117623 4143292 daemon.go:102] Phc2sysOpts: -a -r -n 24 I1115 09:41:17.117626 4143292 daemon.go:116] ------------------------------------
18.2.9. 将 linuxptp 服务配置为常规时钟
您可以通过创建 PtpConfig
自定义资源(CR)对象将 linuxptp
服务(ptp4l
、phc2sys
)配置为常规时钟。
使用 PtpConfig
CR 示例,将 linuxptp
服务配置为特定硬件和环境的普通时钟。这个示例 CR 没有配置 PTP 快速事件。要配置 PTP 快速事件,请为 ptp4lOpts
、ptp4lConf
和 ptpClockThreshold
设置适当的值。只有在启用事件时才需要 ptpClockThreshold
。如需更多信息,请参阅"配置 PTP 快速事件通知发布程序"。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。 - 安装 PTP Operator。
流程
创建以下
PtpConfig
CR,然后在ordinary-clock-ptp-config.yaml
文件中保存 YAML。PTP 普通时钟配置示例
apiVersion: ptp.openshift.io/v1 kind: PtpConfig metadata: name: ordinary-clock namespace: openshift-ptp annotations: {} spec: profile: - name: ordinary-clock # The interface name is hardware-specific interface: $interface ptp4lOpts: "-2 -s" phc2sysOpts: "-a -r -n 24" ptpSchedulingPolicy: SCHED_FIFO ptpSchedulingPriority: 10 ptpSettings: logReduce: "true" ptp4lConf: | [global] # # Default Data Set # twoStepFlag 1 slaveOnly 1 priority1 128 priority2 128 domainNumber 24 #utc_offset 37 clockClass 255 clockAccuracy 0xFE offsetScaledLogVariance 0xFFFF free_running 0 freq_est_interval 1 dscp_event 0 dscp_general 0 dataset_comparison G.8275.x G.8275.defaultDS.localPriority 128 # # Port Data Set # logAnnounceInterval -3 logSyncInterval -4 logMinDelayReqInterval -4 logMinPdelayReqInterval -4 announceReceiptTimeout 3 syncReceiptTimeout 0 delayAsymmetry 0 fault_reset_interval -4 neighborPropDelayThresh 20000000 masterOnly 0 G.8275.portDS.localPriority 128 # # Run time options # assume_two_step 0 logging_level 6 path_trace_enabled 0 follow_up_info 0 hybrid_e2e 0 inhibit_multicast_service 0 net_sync_monitor 0 tc_spanning_tree 0 tx_timestamp_timeout 50 unicast_listen 0 unicast_master_table 0 unicast_req_duration 3600 use_syslog 1 verbose 0 summary_interval 0 kernel_leap 1 check_fup_sync 0 clock_class_threshold 7 # # Servo Options # pi_proportional_const 0.0 pi_integral_const 0.0 pi_proportional_scale 0.0 pi_proportional_exponent -0.3 pi_proportional_norm_max 0.7 pi_integral_scale 0.0 pi_integral_exponent 0.4 pi_integral_norm_max 0.3 step_threshold 2.0 first_step_threshold 0.00002 max_frequency 900000000 clock_servo pi sanity_freq_limit 200000000 ntpshm_segment 0 # # Transport options # transportSpecific 0x0 ptp_dst_mac 01:1B:19:00:00:00 p2p_dst_mac 01:80:C2:00:00:0E udp_ttl 1 udp6_scope 0x0E uds_address /var/run/ptp4l # # Default interface options # clock_type OC network_transport L2 delay_mechanism E2E time_stamping hardware tsproc_mode filter delay_filter moving_median delay_filter_length 10 egressLatency 0 ingressLatency 0 boundary_clock_jbod 0 # # Clock description # productDescription ;; revisionData ;; manufacturerIdentity 00:00:00 userDescription ; timeSource 0xA0 recommend: - profile: ordinary-clock priority: 4 match: - nodeLabel: "node-role.kubernetes.io/$mcp"
表 18.9. PTP 普通时钟 CR 配置选项 CR 字段 描述 名称
PtpConfig
CR 的名称。配置集
指定包括一个或多个
profile
的数组。每个配置集的名称都需要是唯一的。interface
指定
ptp4l
服务要使用的网络接口,如ens787f1
。ptp4lOpts
为
ptp4l
服务指定系统配置选项,例如-2
来选择 IEEE 802.3 网络传输。该选项不应包含网络接口名称-i <interface>
和服务配置文件-f /etc/ptp4l.conf
,因为网络接口名称和服务配置文件会被自动附加。附加--summary_interval -4
来对此接口使用 PTP 快速事件。phc2sysOpts
为
phc2sys
服务指定系统配置选项。如果此字段为空,PTP Operator 不会启动phc2sys
服务。对于 Intel Columbiaville 800 Series NIC,将phc2sysOpts
选项设置为-a -r -m -n 24 -N 8 -R 16
.-m
将消息输出到stdout
。linuxptp-daemon
DaemonSet
解析日志并生成 Prometheus 指标。ptp4lConf
指定一个字符串,其中包含要替换默认的
/etc/ptp4l.conf
文件的配置。要使用默认配置,请将字段留空。tx_timestamp_timeout
对于 Intel Columbiaville 800 系列 NIC,将
tx_timestamp_timeout
设置为50
。boundary_clock_jbod
对于 Intel Columbiaville 800 系列 NIC,将
boundary_clock_jbod
设置为0。
ptpSchedulingPolicy
ptp4l
和phc2sys
进程的调度策略。默认值为SCHED_OTHER
。在支持 FIFO 调度的系统上使用SCHED_FIFO
。ptpSchedulingPriority
当
ptpSchedulingPolicy
设置为SCHED_FIFO
时,用于为ptp4l
和phc2sys
进程设置 FIFO 优先级的整数值(1 到 65)。当ptpSchedulingPolicy
设置为SCHED_OTHER
时,不使用ptpSchedulingPriority
字段。ptpClockThreshold
可选。如果没有
ptpClockThreshold
,用于ptpClockThreshold
字段的默认值。ptpClockThreshold
配置在触发 PTP 时间前,PTP master 时钟已断开连接的时长。holdOverTimeout
是在 PTP master clock 断开连接时,PTP 时钟事件状态更改为FREERUN
前的时间值(以秒为单位)。maxOffsetThreshold
和minOffsetThreshold
设置以纳秒为单位,它们与CLOCK_REALTIME
(phc2sys
) 或 master 偏移 (ptp4l
) 的值进行比较。当ptp4l
或phc2sys
偏移值超出这个范围时,PTP 时钟状态被设置为FREERUN
。当偏移值在这个范围内时,PTP 时钟状态被设置为LOCKED
。建议
指定包括一个或多个
recommend
对象的数组,该数组定义了如何将配置集
应用到节点的规则。.recommend.profile
指定在
profile
部分定义的.recommend.profile
对象名称。.recommend.priority
对于普通时钟,将
.recommend.priority
设置为0。
.recommend.match
使用
nodeLabel
或nodeName
值指定.recommend.match
规则。.recommend.match.nodeLabel
通过
oc get nodes --show-labels
命令,使用来自节点对象的node.Labels
的key
设置nodeLabel
。例如,node-role.kubernetes.io/worker
。.recommend.match.nodeName
使用
oc get nodes
命令,将nodeName
设置为来自节点对象的node.Name
值。例如,compute-1.example.com
。运行以下命令来创建
PtpConfig
CR:$ oc create -f ordinary-clock-ptp-config.yaml
验证
检查
PtpConfig
配置集是否已应用到节点。运行以下命令,获取
openshift-ptp
命名空间中的 pod 列表:$ oc get pods -n openshift-ptp -o wide
输出示例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-4xkbb 1/1 Running 0 43m 10.1.196.24 compute-0.example.com linuxptp-daemon-tdspf 1/1 Running 0 43m 10.1.196.25 compute-1.example.com ptp-operator-657bbb64c8-2f8sj 1/1 Running 0 43m 10.129.0.61 control-plane-1.example.com
检查配置集是否正确。检查与
PtpConfig
配置集中指定的节点对应的linuxptp
守护进程的日志。运行以下命令:$ oc logs linuxptp-daemon-4xkbb -n openshift-ptp -c linuxptp-daemon-container
输出示例
I1115 09:41:17.117596 4143292 daemon.go:107] in applyNodePTPProfile I1115 09:41:17.117604 4143292 daemon.go:109] updating NodePTPProfile to: I1115 09:41:17.117607 4143292 daemon.go:110] ------------------------------------ I1115 09:41:17.117612 4143292 daemon.go:102] Profile Name: profile1 I1115 09:41:17.117616 4143292 daemon.go:102] Interface: ens787f1 I1115 09:41:17.117620 4143292 daemon.go:102] Ptp4lOpts: -2 -s I1115 09:41:17.117623 4143292 daemon.go:102] Phc2sysOpts: -a -r -n 24 I1115 09:41:17.117626 4143292 daemon.go:116] ------------------------------------
18.2.9.1. Intel Columbiaville E800 series NIC 作为 PTP 常规时钟参考
下表描述了您必须对引用 PTP 配置所做的更改,以使用 Intel Columbiaville E800 系列 NIC 作为普通时钟。在应用到集群的 PtpConfig
自定义资源(CR)中进行更改。
PTP 配置 | 推荐的设置 |
---|---|
|
|
|
|
|
|
对于 phc2sysOpts
,-m
会将信息输出到 stdout
。linuxptp-daemon
DaemonSet
解析日志并生成 Prometheus 指标。
其他资源
-
有关将
linuxptp
服务配置为具有 PTP 快速事件的普通时钟的完整示例 CR,请参阅将 linuxptp 服务配置为普通时钟。
18.2.10. 为 PTP 硬件配置 FIFO 优先级调度
在需要低延迟性能的电信或其他部署类型中,PTP 守护进程线程在受限的 CPU 占用空间以及剩余的基础架构组件一起运行。默认情况下,PTP 线程使用 SCHED_OTHER
策略运行。在高负载下,这些线程可能没有获得无错操作所需的调度延迟。
要缓解潜在的调度延迟错误,您可以将 PTP Operator linuxptp
服务配置为允许线程使用 SCHED_FIFO
策略运行。如果为 PtpConfig
CR 设置了 SCHED_FIFO
,则 ptp4l
和 phc2sys
将在 chrt
的父容器中运行,且由 PtpConfig
CR 的 ptpSchedulingPriority
字段设置。
设置 ptpSchedulingPolicy
是可选的,只有在遇到延迟错误时才需要。
流程
编辑
PtpConfig
CR 配置集:$ oc edit PtpConfig -n openshift-ptp
更改
ptpSchedulingPolicy
和ptpSchedulingPriority
字段:apiVersion: ptp.openshift.io/v1 kind: PtpConfig metadata: name: <ptp_config_name> namespace: openshift-ptp ... spec: profile: - name: "profile1" ... ptpSchedulingPolicy: SCHED_FIFO 1 ptpSchedulingPriority: 10 2
-
保存并退出,以将更改应用到
PtpConfig
CR。
验证
获取
linuxptp-daemon
pod 的名称以及应用PtpConfig
CR 的对应节点:$ oc get pods -n openshift-ptp -o wide
输出示例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-gmv2n 3/3 Running 0 1d17h 10.1.196.24 compute-0.example.com linuxptp-daemon-lgm55 3/3 Running 0 1d17h 10.1.196.25 compute-1.example.com ptp-operator-3r4dcvf7f4-zndk7 1/1 Running 0 1d7h 10.129.0.61 control-plane-1.example.com
检查
ptp4l
进程是否使用更新的chrt
FIFO 运行:$ oc -n openshift-ptp logs linuxptp-daemon-lgm55 -c linuxptp-daemon-container|grep chrt
输出示例
I1216 19:24:57.091872 1600715 daemon.go:285] /bin/chrt -f 65 /usr/sbin/ptp4l -f /var/run/ptp4l.0.config -2 --summary_interval -4 -m
18.2.11. 为 linuxptp 服务配置日志过滤
linuxptp
守护进程生成可用于调试目的的日志。在具有有限存储容量的电信或其他部署类型中,这些日志可以添加到存储要求中。
要减少数量日志消息,您可以配置 PtpConfig
自定义资源 (CR) 来排除报告 master offset
值的日志消息。master offset
日志消息以纳秒为单位报告当前节点时钟和 master 时钟之间的区别。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。 - 安装 PTP Operator。
流程
编辑
PtpConfig
CR:$ oc edit PtpConfig -n openshift-ptp
在
spec.profile
中,添加ptpSettings.logReduce
规格,并将值设为true
:apiVersion: ptp.openshift.io/v1 kind: PtpConfig metadata: name: <ptp_config_name> namespace: openshift-ptp ... spec: profile: - name: "profile1" ... ptpSettings: logReduce: "true"
注意为了进行调试,您可以将此规格恢复到
False
,使其包含 master 偏移消息。-
保存并退出,以将更改应用到
PtpConfig
CR。
验证
获取
linuxptp-daemon
pod 的名称以及应用PtpConfig
CR 的对应节点:$ oc get pods -n openshift-ptp -o wide
输出示例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-gmv2n 3/3 Running 0 1d17h 10.1.196.24 compute-0.example.com linuxptp-daemon-lgm55 3/3 Running 0 1d17h 10.1.196.25 compute-1.example.com ptp-operator-3r4dcvf7f4-zndk7 1/1 Running 0 1d7h 10.129.0.61 control-plane-1.example.com
运行以下命令,验证 master 偏移信息是否不包括在日志中:
$ oc -n openshift-ptp logs <linux_daemon_container> -c linuxptp-daemon-container | grep "master offset" 1
- 1
- <linux_daemon_container> 是
linuxptp-daemon
pod 的名称,如linuxptp-daemon-gmv2n
。
当您配置
logReduce
规格时,这个命令会在linuxptp
守护进程日志中报告任何master offset
实例。
18.2.12. 常见 PTP Operator 故障排除
通过执行以下步骤排除 PTP Operator 中的常见问题。
先决条件
-
安装 OpenShift Container Platform CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。 - 使用支持 PTP 的主机在裸机集群中安装 PTP Operator。
流程
检查集群中为配置的节点成功部署了 Operator 和操作对象。
$ oc get pods -n openshift-ptp -o wide
输出示例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-lmvgn 3/3 Running 0 4d17h 10.1.196.24 compute-0.example.com linuxptp-daemon-qhfg7 3/3 Running 0 4d17h 10.1.196.25 compute-1.example.com ptp-operator-6b8dcbf7f4-zndk7 1/1 Running 0 5d7h 10.129.0.61 control-plane-1.example.com
注意当启用 PTP fast 事件总线时,就绪的
linuxptp-daemon
pod 的数量是3/3
。如果没有启用 PTP fast 事件总线,则会显示2/2
。检查集群中是否已找到支持的硬件。
$ oc -n openshift-ptp get nodeptpdevices.ptp.openshift.io
输出示例
NAME AGE control-plane-0.example.com 10d control-plane-1.example.com 10d compute-0.example.com 10d compute-1.example.com 10d compute-2.example.com 10d
检查节点的可用 PTP 网络接口:
$ oc -n openshift-ptp get nodeptpdevices.ptp.openshift.io <node_name> -o yaml
其中:
- <node_name>
指定您要查询的节点,例如
compute-0.example.com
。输出示例
apiVersion: ptp.openshift.io/v1 kind: NodePtpDevice metadata: creationTimestamp: "2021-09-14T16:52:33Z" generation: 1 name: compute-0.example.com namespace: openshift-ptp resourceVersion: "177400" uid: 30413db0-4d8d-46da-9bef-737bacd548fd spec: {} status: devices: - name: eno1 - name: eno2 - name: eno3 - name: eno4 - name: enp5s0f0 - name: enp5s0f1
通过访问对应节点的
linuxptp-daemon
pod,检查 PTP 接口是否已与主时钟成功同步。运行以下命令来获取
linuxptp-daemon
pod 的名称以及您要排除故障的对应节点:$ oc get pods -n openshift-ptp -o wide
输出示例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-lmvgn 3/3 Running 0 4d17h 10.1.196.24 compute-0.example.com linuxptp-daemon-qhfg7 3/3 Running 0 4d17h 10.1.196.25 compute-1.example.com ptp-operator-6b8dcbf7f4-zndk7 1/1 Running 0 5d7h 10.129.0.61 control-plane-1.example.com
在远程 shell 到所需的
linuxptp-daemon
容器:$ oc rsh -n openshift-ptp -c linuxptp-daemon-container <linux_daemon_container>
其中:
- <linux_daemon_container>
-
您要诊断的容器,如
linuxptp-daemon-lmvgn
。
在与
linuxptp-daemon
容器的远程 shell 连接中,使用 PTP Management Client (pmc
) 工具诊断网络接口。运行以下pmc
命令,以检查 PTP 设备的同步状态,如ptp4l
。# pmc -u -f /var/run/ptp4l.0.config -b 0 'GET PORT_DATA_SET'
当节点成功同步到主时钟时的输出示例
sending: GET PORT_DATA_SET 40a6b7.fffe.166ef0-1 seq 0 RESPONSE MANAGEMENT PORT_DATA_SET portIdentity 40a6b7.fffe.166ef0-1 portState SLAVE logMinDelayReqInterval -4 peerMeanPathDelay 0 logAnnounceInterval -3 announceReceiptTimeout 3 logSyncInterval -4 delayMechanism 1 logMinPdelayReqInterval -4 versionNumber 2
对于 GNSS-sourced grandmaster 时钟,运行以下命令来验证 in-tree NIC ice 驱动程序是否正确,例如:
$ oc rsh -n openshift-ptp -c linuxptp-daemon-container linuxptp-daemon-74m2g ethtool -i ens7f0
输出示例
driver: ice version: 5.14.0-356.bz2232515.el9.x86_64 firmware-version: 4.20 0x8001778b 1.3346.0
对于 GNSS-sourced grandmaster 时钟,请验证
linuxptp-daemon
容器是否从 GNSS antenna 接收信号。如果容器没有收到 GNSS 信号,则不会填充/dev/gnss0
文件。要验证,请运行以下命令:$ oc rsh -n openshift-ptp -c linuxptp-daemon-container linuxptp-daemon-jnz6r cat /dev/gnss0
输出示例
$GNRMC,125223.00,A,4233.24463,N,07126.64561,W,0.000,,300823,,,A,V*0A $GNVTG,,T,,M,0.000,N,0.000,K,A*3D $GNGGA,125223.00,4233.24463,N,07126.64561,W,1,12,99.99,98.6,M,-33.1,M,,*7E $GNGSA,A,3,25,17,19,11,12,06,05,04,09,20,,,99.99,99.99,99.99,1*37 $GPGSV,3,1,10,04,12,039,41,05,31,222,46,06,50,064,48,09,28,064,42,1*62
18.2.13. 在 Intel 800 系列 NIC 中获取 CGU 的 DPLL 固件版本
您可以通过打开 debug shell 到集群节点并查询 NIC 硬件,在 Intel 800 系列 NIC 中获取 Clock Generation Unit (CGU) 的数字签名循环 (DPLL) 固件版本。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。 - 您已在集群主机中安装了 Intel 800 系列 NIC。
- 您已在带有支持 PTP 的主机的裸机集群中安装 PTP Operator。
流程
运行以下命令来启动 debug pod:
$ oc debug node/<node_name>
其中:
- <node_name>
- 是安装 Intel 800 系列 NIC 的节点。
使用
devlink
工具以及安装 NIC 的总线和设备名称,检查 NIC 中的 CGU 固件版本。例如,运行以下命令:sh-4.4# devlink dev info <bus_name>/<device_name> | grep cgu
其中:
- <bus_name>
-
是安装 NIC 的总线。例如,
pci
。 - <device_name>
-
是 NIC 设备名称。例如,
0000:51:00.0
。
输出示例
cgu.id 36 1 fw.cgu 8032.16973825.6021 2
注意固件版本的每个版本号部分都包括了前导和 3 个八位字节位。数字
16973825
的二进制格式是0001 0000 0011 0000 0000 0000 0001
。使用二进制值来解码固件版本。例如:表 18.11. DPLL 固件版本 二进制部分 十进制值 0001
1
0000 0011
3
0000 0000
0
0000 0001
1
18.2.14. 收集 PTP Operator 数据
您可以使用 oc adm must-gather
命令收集有关集群的信息,包括与 PTP Operator 关联的功能和对象。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群。 -
已安装 OpenShift CLI(
oc
)。 - 已安装 PTP Operator。
流程
要使用
must-gather
来收集 PTP Operator 数据,您必须指定 PTP Operatormust-gather
镜像。$ oc adm must-gather --image=registry.redhat.io/openshift4/ptp-must-gather-rhel8:v4.16