7.10. 配置 PTP

重要

精确时钟协议 (PTP) 硬件只是技术预览功能。技术预览功能不被红帽产品服务等级协议 (SLA) 支持,且可能在功能方面有缺陷。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的详情,请参阅 https://access.redhat.com/support/offerings/techpreview/

7.10.1. 关于 OpenShift Container Platform 中的 PTP 硬件

OpenShift Container Platform 包含在节点上使用 PTP 硬件的能力。您可以使用 PTP 硬件在节点上配置 linuxptp 服务。

您可以通过部署 PTP Operator,使用 OpenShift Container Platform 控制台来安装 PTP。PTP Operator 会创建和管理 linuxptp 服务。Operator 提供以下功能:

  • 在集群中发现具有 PTP 功能的设备。
  • 管理 linuxptp 服务的配置。

7.10.2. 安装 PTP Operator

作为集群管理员,您可以使用 OpenShift Container Platform CLI 或 Web 控制台来安装 PTP Operator。

7.10.2.1. 使用 CLI 安装 Operator

作为集群管理员,您可以使用 CLI 安装 Operator。

先决条件

  • 在裸机中安装有支持 PTP 硬件的节点的集群。
  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。

流程

  1. 通过完成以下操作,为 PTP Operator 创建命名空间:

    1. 创建定义 openshift-ptp 命名空间的以下 Namespace 自定义资源 (CR) ,然后在 ptp-namespace.yaml 文件中保存 YAML:

      apiVersion: v1
      kind: Namespace
      metadata:
        name: openshift-ptp
        labels:
          openshift.io/run-level: "1"
    2. 运行以下命令创建命名空间:

      $ oc create -f ptp-namespace.yaml
  2. 通过创建以下对象,在您上一步中创建的命名空间中安装 PTP Operator:

    1. 创建以下 OperatorGroup CR,并在 ptp-operatorgroup.yaml 文件中保存 YAML:

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        name: ptp-operators
        namespace: openshift-ptp
      spec:
        targetNamespaces:
        - openshift-ptp
    2. 通过运行以下命令来创建 OperatorGroup CR:

      $ oc create -f ptp-operatorgroup.yaml
    3. 运行以下命令获取下一步所需的 channel 值。

      $ oc get packagemanifest ptp-operator -n openshift-marketplace -o jsonpath='{.status.defaultChannel}'
      
      4.3
    4. 创建以下订阅 CR,并将 YAML 保存到 ptp-sub.yaml 文件中:

      订阅示例

      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: ptp-operator-subscription
        namespace: openshift-ptp
      spec:
        channel: <channel> 1
        name: ptp-operator
        source: redhat-operators 2
        sourceNamespace: openshift-marketplace

      1
      使用在前一步中获得的值指定 .status.defaultChannel 参数。
      2
      您必须指定 redhat-operators 值。
    5. 运行以下命令创建订阅对象:

      $ oc create -f ptp-sub.yaml
    6. 进入 openshift-ptp 项目:

      $ oc project openshift-ptp

      输出示例

      Now using project "openshift-ptp"

7.10.2.2. 使用 Web 控制台安装 Operator

作为集群管理员,您可以使用 Web 控制台安装 Operator。

注意

如上一节所述,您必须创建命名空间 CR 和 OperatorGroup CR。

流程

  1. 使用 OpenShift Container Platform Web 控制台安装 PTP Operator:

    1. 在 OpenShift Container Platform Web 控制台中,点击 OperatorsOperatorHub
    2. 从可用的 Operator 列表中选择 PTP Operator,然后点 Install
    3. Create Operator Subscription 页面中,在 A specific namespace on the cluster 下选择 openshift-ptp。然后,点击 Subscribe
  2. 可选:验证是否成功安装了 PTP Operator:

    1. 切换到 OperatorsInstalled Operators 页面。
    2. 确保 openshift-ptp 项目中列出的 PTP OperatorStatusInstallSucceeded

      注意

      在安装过程中,Operator 可能会显示 Failed 状态。如果安装过程结束后有 InstallSucceeded 信息,您可以忽略这个 Failed 信息。

      如果 Operator 没有被成功安装,请按照以下步骤进行故障排除:

      • 进入 Operators → Installed Operators 页面,检查 Operator SubscriptionsInstall Plans 选项卡中的 Status 项中是否有任何错误。
      • 进入 WorkloadsPods 页面,检查 openshift-ptp 项目中 Pod 的日志。

7.10.3. 自动发现 PTP 网络设备

PTP Operator 将 NodePtpDevice.ptp.openshift.io自定义资源定义 (CRD) 添加至 OpenShift Container Platform。PTP Operator 将搜索集群中每个节点上的具有 PTP 功能的网络设备。Operator 会为每个提供兼容 PTP 设备的节点创建并更新 NodePtpDevice 自定义资源 (CR) 。

为每个节点创建一个 CR,并共享与该节点相同的名称。.status.devices 列表提供有关节点上 PTP 设备的信息。

以下是由 PTP Operator 创建的 NodePtpDevice CR 示例:

apiVersion: ptp.openshift.io/v1
kind: NodePtpDevice
metadata:
  creationTimestamp: "2019-11-15T08:57:11Z"
  generation: 1
  name: dev-worker-0 1
  namespace: openshift-ptp 2
  resourceVersion: "487462"
  selfLink: /apis/ptp.openshift.io/v1/namespaces/openshift-ptp/nodeptpdevices/dev-worker-0
  uid: 08d133f7-aae2-403f-84ad-1fe624e5ab3f
spec: {}
status:
  devices: 3
  - name: eno1
  - name: eno2
  - name: ens787f0
  - name: ens787f1
  - name: ens801f0
  - name: ens801f1
  - name: ens802f0
  - name: ens802f1
  - name: ens803
1
name 参数的值与节点的名称相同。
2
CR 由 PTP Operator 在 openshift-ptp 命名空间中创建。
3
devices 集合包含节点上 Operator 发现的所有 PTP 可用设备列表。

7.10.4. 配置 Linuxptp 服务

PTP Operator 将 PtpConfig.ptp.openshift.io 自定义资源定义 (CRD) 添加至 OpenShift Container Platform。您可以通过创建 PtpConfig 自定义资源 (CR) 来配置 Linuxptp 服务(ptp4l 、phc2sys)。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。
  • 已安装了 PTP Operator。

流程

  1. 创建以下 PtpConfig CR,然后在 <name>-ptp-config.yaml 文件中保存 YAML。使用配置的实际名称替换 <name>

    apiVersion: ptp.openshift.io/v1
    kind: PtpConfig
    metadata:
      name: <name> 1
      namespace: openshift-ptp 2
    spec:
      profile: 3
      - name: "profile1" 4
        interface: "ens787f1" 5
        ptp4lOpts: "-s -2" 6
        phc2sysOpts: "-a -r" 7
      recommend: 8
      - profile: "profile1" 9
        priority: 10 10
        match: 11
        - nodeLabel: "node-role.kubernetes.io/worker" 12
          nodeName: "dev-worker-0" 13
    1
    PtpConfig CR 指定名称。
    2
    指定安装 PTP Operator 的命名空间。
    3
    指定包括一个或多个 profile 的数组。
    4
    指定用于唯一标识配置集(profile)对象的配置集对象名称。
    5
    指定 ptp4l 服务要使用的网络接口名称,如 ens787f1
    6
    ptp4l 服务指定系统配置选项,如 -s -2。这不应该包含接口名称 -i <interface> 和服务配置文件 -f /etc/ptp4l.conf ,因为这些文件会被自动附加。
    7
    phc2sys 服务指定系统配置选项,如 -a -r
    8
    指定包括一个或多个 recommend 对象的数组,该数组定义了如何将配置集应用到节点的规则。
    9
    指定 profile 部分中定义的 profile 对象名称。
    10
    使用 099 之间的一个整数值指定 priority。大数值的优先级较低,因此优先级 99 低于优先级 10。如果根据 match 项中定义的规则,节点可以与多个配置集相匹配,具有最高优先级的配置集将被应用到那个节点。
    11
    使用 nodeLabelnodeName 指定 match 规则。
    12
    使用节点对象中的 node.Labelskey 指定 nodeLabel
    13
    使用节点对象的 node.Name 指定 nodeName
  2. 运行以下命令来创建 CR:

    $ oc create -f <filename> 1
    1
    <filename> 替换为您在上一步中创建的文件的名称。
  3. 可选:检查 PtpConfig 配置集是否应用到与 nodeLabelnodeName 匹配的节点。

    $ oc get pods -n openshift-ptp -o wide

    输出示例

    NAME                            READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
    linuxptp-daemon-4xkbb           1/1     Running   0          43m   192.168.111.15   dev-worker-0   <none>           <none>
    linuxptp-daemon-tdspf           1/1     Running   0          43m   192.168.111.11   dev-master-0   <none>           <none>
    ptp-operator-657bbb64c8-2f8sj   1/1     Running   0          43m   10.128.0.116     dev-master-0   <none>           <none>
    
    $ oc logs linuxptp-daemon-4xkbb -n openshift-ptp
    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 1
    I1115 09:41:17.117616 4143292 daemon.go:102] Interface: ens787f1    2
    I1115 09:41:17.117620 4143292 daemon.go:102] Ptp4lOpts: -s -2       3
    I1115 09:41:17.117623 4143292 daemon.go:102] Phc2sysOpts: -a -r     4
    I1115 09:41:17.117626 4143292 daemon.go:116] ------------------------------------
    I1115 09:41:18.117934 4143292 daemon.go:186] Starting phc2sys...
    I1115 09:41:18.117985 4143292 daemon.go:187] phc2sys cmd: &{Path:/usr/sbin/phc2sys Args:[/usr/sbin/phc2sys -a -r] Env:[] Dir: Stdin:<nil> Stdout:<nil> Stderr:<nil> ExtraFiles:[] SysProcAttr:<nil> Process:<nil> ProcessState:<nil> ctx:<nil> lookPathErr:<nil> finished:false childFiles:[] closeAfterStart:[] closeAfterWait:[] goroutine:[] errch:<nil> waitDone:<nil>}
    I1115 09:41:19.118175 4143292 daemon.go:186] Starting ptp4l...
    I1115 09:41:19.118209 4143292 daemon.go:187] ptp4l cmd: &{Path:/usr/sbin/ptp4l Args:[/usr/sbin/ptp4l -m -f /etc/ptp4l.conf -i ens787f1 -s -2] Env:[] Dir: Stdin:<nil> Stdout:<nil> Stderr:<nil> ExtraFiles:[] SysProcAttr:<nil> Process:<nil> ProcessState:<nil> ctx:<nil> lookPathErr:<nil> finished:false childFiles:[] closeAfterStart:[] closeAfterWait:[] goroutine:[] errch:<nil> waitDone:<nil>}
    ptp4l[102189.864]: selected /dev/ptp5 as PTP clock
    ptp4l[102189.886]: port 1: INITIALIZING to LISTENING on INIT_COMPLETE
    ptp4l[102189.886]: port 0: INITIALIZING to LISTENING on INIT_COMPLETE

    1
    Profile Name 是应用到 dev-worker-0 节点的名称。
    2
    Interface 是在 profile1 的 interface 项中指定的 PTP 设备。在这个接口中运行的 ptp4l 服务。
    3
    ptp4lOptsprofile1 中的 ptp4lOpts 项指定的 ptp4l sysconfig 选项。
    4
    Phc2sysOptsprofile1 中的 Phc2sysOpts 项指定的 phc2sys sysconfig 选项。