高度なネットワーキング


OpenShift Container Platform 4.20

OpenShift Container Platform の専門的かつ高度なネットワーキングトピック

概要

このドキュメントでは、OpenShift Container Platform における MTU の変更、接続の検証、Stream Control Transmission Protocol、PTP ハードウェア、セカンダリーインターフェイスメトリクスなどの高度なネットワーキングトピックを説明します。

第1章 エンドポイントへの接続の確認

Cluster Network Operator (CNO) は、クラスター内のリソース間の接続ヘルスチェックを実行するコントローラーである接続性チェックコントローラーを実行します。ヘルスチェックの結果を確認して、調査している問題が原因で生じる接続の問題を診断したり、ネットワーク接続を削除したりできます。

1.1. 実行される接続ヘルスチェック

クラスターリソースにアクセスできることを確認するために、次の各クラスター API サービスへの TCP 接続が確立されます。

  • Kubernetes API サーバーサービス
  • Kubernetes API サーバーエンドポイント
  • OpenShift API サーバーサービス
  • OpenShift API サーバーエンドポイント
  • ロードバランサー

サービスおよびサービスエンドポイントがクラスター内のすべてのノードで到達可能であることを確認するには、以下の各ターゲットに対して TCP 接続が行われます。

  • ヘルスチェックターゲットサービス
  • ヘルスチェックターゲットエンドポイント

1.2. 接続ヘルスチェックの実装

接続チェックコントローラーは、クラスター内の接続検証チェックをオーケストレーションします。接続テストの結果は、openshift-network-diagnostics namespace の PodNetworkConnectivity オブジェクトに保存されます。接続テストは、1 分ごとに並行して実行されます。

Cluster Network Operator (CNO) は、接続性ヘルスチェックを送受信するためにいくつかのリソースをクラスターにデプロイします。

ヘルスチェックのソース
このプログラムは、Deployment オブジェクトで管理される単一の Pod レプリカセットにデプロイします。このプログラムは PodNetworkConnectivity オブジェクトを消費し、各オブジェクトで指定される spec.targetEndpoint に接続されます。
ヘルスチェックのターゲット
クラスターのすべてのノードにデーモンセットの一部としてデプロイされた Pod。Pod はインバウンドのヘルスチェックをリッスンします。すべてのノードにこの Pod が存在すると、各ノードへの接続をテストすることができます。

ノードセレクターを使用して、ネットワーク接続ソースとターゲットが実行されるノードを設定できます。さらに、ソース Pod とターゲット Pod で許容できる tolerations を指定することもできます。この設定は、config.openshift.io/v1 API グループの Network API のシングルトン cluster カスタムリソースで定義されます。

Pod のスケジュールは、設定を更新した後に実行されます。したがって、設定を更新する前に、セレクターで使用する予定のノードラベルを適用する必要があります。ネットワーク接続チェック Pod の配置を更新した後に適用されたラベルは無視されます。

次の YAML のデフォルト設定を参照してください。

接続ソースおよびターゲット Pod のデフォルト設定

apiVersion: config.openshift.io/v1
kind: Network
metadata:
  name: cluster
spec:
  # ...
    networkDiagnostics: 
1

      mode: "All" 
2

      sourcePlacement: 
3

        nodeSelector:
          checkNodes: groupA
        tolerations:
        - key: myTaint
          effect: NoSchedule
          operator: Exists
      targetPlacement: 
4

        nodeSelector:
          checkNodes: groupB
        tolerations:
        - key: myOtherTaint
          effect: NoExecute
          operator: Exists

1
ネットワーク診断設定を指定します。値が指定されていないか、空のオブジェクトが指定されており、cluster という名前の network.operator.openshift.io カスタムリソースで spec.disableNetworkDiagnostics=true が設定されている場合、ネットワーク診断は無効になります。設定されている場合、この値は spec.disableNetworkDiagnostics=true をオーバーライドします。
2
診断モードを指定します。値は、空の文字列、All、または Disabled です。空の文字列は All を指定するのと同じです。
3
オプション: 接続チェックのソース Pod のセレクターを指定します。nodeSelector および tolerations フィールドを使用して、sourceNode Pod をさらに指定できます。これは、ソース Pod とターゲット Pod の両方でオプションです。省略することも、両方使用することも、いずれか一方だけ使用することもできます。
4
オプション: 接続チェックのターゲット Pod のセレクターを指定します。nodeSelector および tolerations フィールドを使用して、targetNode Pod をさらに指定できます。これは、ソース Pod とターゲット Pod の両方でオプションです。省略することも、両方使用することも、いずれか一方だけ使用することもできます。

1.3. Pod 接続チェックの配置の設定

クラスター管理者は、cluster という名前の network.config.openshift.io オブジェクトを変更することで、接続チェック Pod が実行するノードを設定できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。

手順

  1. 次のコマンドを入力して、接続チェックの設定を編集します。

    $ oc edit network.config.openshift.io cluster
  2. テキストエディターで、networkDiagnostics スタンザを更新して、ソース Pod とターゲット Pod に必要なノードセレクターを指定します。
  3. 変更を保存してテキストエディターを終了します。

検証

  • 次のコマンドを入力して、ソース Pod とターゲット Pod が目的のノードで実行されていることを検証します。
$ oc get pods -n openshift-network-diagnostics -o wide

出力例

NAME                                    READY   STATUS    RESTARTS   AGE     IP           NODE                                        NOMINATED NODE   READINESS GATES
network-check-source-84c69dbd6b-p8f7n   1/1     Running   0          9h      10.131.0.8   ip-10-0-40-197.us-east-2.compute.internal   <none>           <none>
network-check-target-46pct              1/1     Running   0          9h      10.131.0.6   ip-10-0-40-197.us-east-2.compute.internal   <none>           <none>
network-check-target-8kwgf              1/1     Running   0          9h      10.128.2.4   ip-10-0-95-74.us-east-2.compute.internal    <none>           <none>
network-check-target-jc6n7              1/1     Running   0          9h      10.129.2.4   ip-10-0-21-151.us-east-2.compute.internal   <none>           <none>
network-check-target-lvwnn              1/1     Running   0          9h      10.128.0.7   ip-10-0-17-129.us-east-2.compute.internal   <none>           <none>
network-check-target-nslvj              1/1     Running   0          9h      10.130.0.7   ip-10-0-89-148.us-east-2.compute.internal   <none>           <none>
network-check-target-z2sfx              1/1     Running   0          9h      10.129.0.4   ip-10-0-60-253.us-east-2.compute.internal   <none>           <none>

1.4. PodNetworkConnectivityCheck オブジェクトフィールド

PodNetworkConnectivityCheck オブジェクトフィールドは、以下の表で説明されています。

Expand
表1.1 PodNetworkConnectivityCheck オブジェクトフィールド
フィールド説明

metadata.name

string

以下の形式のオブジェクトの名前: <source>-to-<target><target> で記述される宛先には、以下のいずれかの文字列が含まれます。

  • load-balancer-api-external
  • load-balancer-api-internal
  • kubernetes-apiserver-endpoint
  • kubernetes-apiserver-service-cluster
  • network-check-target
  • openshift-apiserver-endpoint
  • openshift-apiserver-service-cluster

metadata.namespace

string

オブジェクトが関連付けられる namespace。この値は、常に openshift-network-diagnostics になります。

spec.sourcePod

string

接続チェックの起点となる Pod の名前 (例: network-check-source-596b4c6566-rgh92)。

spec.targetEndpoint

string

api.devcluster.example.com:6443 などの接続チェックのターゲット。

spec.tlsClientCert

object

使用する TLS 証明書の設定。

spec.tlsClientCert.name

string

使用される TLS 証明書の名前 (ある場合)。デフォルト値は空の文字列です。

status

object

接続テストの状態を表す、および最近の接続の成功および失敗に関するログ。

status.conditions

array

接続チェックと最新のステータスと以前のステータス。

status.failures

array

試行に失敗した接続テストのログ。

status.outages

array

停止が生じた期間が含まれる接続テストのログ。

status.successes

array

試行に成功した接続テストのログ。

以下の表は、status.conditions 配列内のオブジェクトのフィールドを説明しています。

Expand
表1.2 status.conditions
フィールド説明

lastTransitionTime

string

接続の条件がある状態から別の状態に移行した時間。

message

string

人が判読できる形式の最後の移行に関する詳細。

reason

string

マシンの読み取り可能な形式での移行の最後のステータス。

status

string

状態のテータス。

type

string

状態のタイプ。

以下の表は、status.conditions 配列内のオブジェクトのフィールドを説明しています。

Expand
表1.3 status.outages
フィールド説明

end

string

接続の障害が解決された時点からのタイムスタンプ。

endLogs

array

接続ログエントリー (停止の正常な終了に関連するログエントリーを含む)。

message

string

人が判読できる形式の停止に関する詳細情報の要約。

start

string

接続の障害が最初に検知された時点からのタイムスタンプ。

startLogs

array

元の障害を含む接続ログのエントリー。

1.4.1. 接続ログフィールド

接続ログエントリーのフィールドの説明は以下の表で説明されています。オブジェクトは以下のフィールドで使用されます。

  • status.failures[]
  • status.successes[]
  • status.outages[].startLogs[]
  • status.outages[].endLogs[]
Expand
表1.4 接続ログオブジェクト
フィールド説明

latency

string

アクションの期間を記録します。

message

string

ステータスを人が判読できる形式で提供します。

reason

string

ステータスの理由をマシンが判読できる形式で提供します。値は TCPConnectTCPConnectErrorDNSResolveDNSError のいずれかになります。

success

boolean

ログエントリーが成功または失敗であるかを示します。

time

string

接続チェックの開始時間。

1.5. エンドポイントのネットワーク接続の確認

クラスター管理者は、API サーバー、ロードバランサー、サービス、Pod などのエンドポイントの接続を確認し、ネットワーク診断が有効になっていることを確認できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. 次のコマンドを入力して、ネットワーク診断が有効になっていることを確認します。

    $ oc get network.config.openshift.io cluster -o yaml

    出力例

      # ...
      status:
      # ...
        conditions:
        - lastTransitionTime: "2024-05-27T08:28:39Z"
          message: ""
          reason: AsExpected
          status: "True"
          type: NetworkDiagnosticsAvailable

  2. 次のコマンドを入力して、現在の PodNetworkConnectivityCheck オブジェクトをリスト表示します。

    $ oc get podnetworkconnectivitycheck -n openshift-network-diagnostics

    出力例

    NAME                                                                                                                                AGE
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0   75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-1   73m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-2   75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-service-cluster                               75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-default-service-cluster                                 75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-load-balancer-api-external                                         75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-load-balancer-api-internal                                         75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-master-0            75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-master-1            75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-master-2            75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh      74m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-worker-c-n8mbf      74m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-worker-d-4hnrz      74m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-service-cluster                               75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-openshift-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0    75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-openshift-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-1    75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-openshift-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-2    74m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-openshift-apiserver-service-cluster                                75m

  3. 接続テストログを表示します。

    1. 直前のコマンドの出力から、接続ログを確認するエンドポイントを特定します。
    2. 次のコマンドを入力してオブジェクトを表示します。

      $ oc get podnetworkconnectivitycheck <name> \
        -n openshift-network-diagnostics -o yaml

      ここで、<name>PodNetworkConnectivityCheck オブジェクトの名前を指定します。

      出力例

      apiVersion: controlplane.operator.openshift.io/v1alpha1
      kind: PodNetworkConnectivityCheck
      metadata:
        name: network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0
        namespace: openshift-network-diagnostics
        ...
      spec:
        sourcePod: network-check-source-7c88f6d9f-hmg2f
        targetEndpoint: 10.0.0.4:6443
        tlsClientCert:
          name: ""
      status:
        conditions:
        - lastTransitionTime: "2021-01-13T20:11:34Z"
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnectSuccess
          status: "True"
          type: Reachable
        failures:
        - latency: 2.241775ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: failed
            to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443: connect:
            connection refused'
          reason: TCPConnectError
          success: false
          time: "2021-01-13T20:10:34Z"
        - latency: 2.582129ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: failed
            to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443: connect:
            connection refused'
          reason: TCPConnectError
          success: false
          time: "2021-01-13T20:09:34Z"
        - latency: 3.483578ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: failed
            to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443: connect:
            connection refused'
          reason: TCPConnectError
          success: false
          time: "2021-01-13T20:08:34Z"
        outages:
        - end: "2021-01-13T20:11:34Z"
          endLogs:
          - latency: 2.032018ms
            message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
              tcp connection to 10.0.0.4:6443 succeeded'
            reason: TCPConnect
            success: true
            time: "2021-01-13T20:11:34Z"
          - latency: 2.241775ms
            message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
              failed to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443:
              connect: connection refused'
            reason: TCPConnectError
            success: false
            time: "2021-01-13T20:10:34Z"
          - latency: 2.582129ms
            message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
              failed to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443:
              connect: connection refused'
            reason: TCPConnectError
            success: false
            time: "2021-01-13T20:09:34Z"
          - latency: 3.483578ms
            message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
              failed to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443:
              connect: connection refused'
            reason: TCPConnectError
            success: false
            time: "2021-01-13T20:08:34Z"
          message: Connectivity restored after 2m59.999789186s
          start: "2021-01-13T20:08:34Z"
          startLogs:
          - latency: 3.483578ms
            message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
              failed to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443:
              connect: connection refused'
            reason: TCPConnectError
            success: false
            time: "2021-01-13T20:08:34Z"
        successes:
        - latency: 2.845865ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:14:34Z"
        - latency: 2.926345ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:13:34Z"
        - latency: 2.895796ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:12:34Z"
        - latency: 2.696844ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:11:34Z"
        - latency: 1.502064ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:10:34Z"
        - latency: 1.388857ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:09:34Z"
        - latency: 1.906383ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:08:34Z"
        - latency: 2.089073ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:07:34Z"
        - latency: 2.156994ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:06:34Z"
        - latency: 1.777043ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:05:34Z"

第2章 クラスターネットワークの MTU 変更

クラスター管理者は、クラスターのインストール後にクラスターネットワークの最大転送単位 (MTU) を変更できます。MTU 変更の適用には、クラスターノードを再起動する必要があるため、変更により致命的な問題が発生する可能性があります。

2.1. クラスター MTU について

インストール時に、クラスターネットワークの最大伝送単位 (MTU) は、クラスターノードのプライマリーネットワークインターフェイスの MTU に基づいて自動的に設定されます。通常、検出された MTU を上書きする必要はありませんが、場合によっては上書きする必要があります。

場合によっては、次のいずれかの理由で、クラスターネットワークの MTU を変更する必要があります。

  • クラスターのインストール中に検出された MTU が使用中のインフラストラクチャーに適していない
  • クラスターインフラストラクチャーに異なる MTU が必要となった (例: パフォーマンスの最適化にさまざまな MTU を必要とするノードが追加された)。

OVN-Kubernetes ネットワークプラグインのみが MTU 値の変更をサポートしています。

2.1.1. サービス中断に関する考慮事項

クラスターで最大転送単位 (MTU) の変更を開始すると、サービスの可用性が次のような影響を受ける可能性があります。

  • 新しい MTU への移行を完了するには、少なくとも 2 回のローリングリブートが必要です。この間、一部のノードは再起動するため使用できません。
  • 特定のアプリケーションに、絶対 TCP タイムアウト間隔よりもタイムアウトの間隔が短いクラスターにデプロイされた場合など、MTU の変更中に中断が発生する可能性があります。

2.1.2. MTU 値の選択

最大転送単位 (MTU) の移行を計画する際には、2 つの MTU 値を考慮する必要があります。これらの値は、関連しているが異なるものです。

  • ハードウェア MTU: この MTU 値は、ネットワークインフラストラクチャーの詳細に基づいて設定されます。
  • クラスターネットワーク MTU: この MTU 値は、クラスターネットワークオーバーレイのオーバーヘッドを考慮して、常にハードウェア MTU よりも小さくなります。具体的なオーバーヘッドは、ネットワークプラグインによって決まります。OVN-Kubernetes の場合、オーバーヘッドは 100 バイトです。

クラスターがノードごとに異なる MTU 値を必要とする場合は、クラスター内の任意のノードで使用される最小の MTU 値から、ネットワークプラグインのオーバーヘッド値を差し引く必要があります。たとえば、クラスター内の一部のノードでは MTU が 9001 であり、MTU が 1500 のクラスターもある場合には、この値を 1400 に設定する必要があります。

重要

ノードが受け入れられない MTU 値の選択を回避するには、ip -d link コマンドを使用して、ネットワークインターフェイスが受け入れる最大 MTU 値 (maxmtu) を確認します。

2.1.3. 移行プロセスの仕組み

以下の表は、プロセスのユーザーが開始する手順と、移行が応答として実行するアクション間を区分して移行プロセスを要約しています。

Expand
表2.1 クラスター MTU のライブマイグレーション
ユーザーが開始する手順OpenShift Container Platform アクティビティー

Cluster Network Operator 設定で次の値を指定します。

  • spec.migration.mtu.machine.to
  • spec.migration.mtu.network.from
  • spec.migration.mtu.network.to

Cluster Network Operator (CNO): 各フィールドが有効な値に設定されていることを確認します。

  • mtu.machine.to は、新しいハードウェア MTU、またはハードウェアの MTU が変更されていない場合は、現在のハードウェア MTU のいずれかに設定する必要があります。この値は一時的なものであり、移行プロセスの一部として使用されます。現在の値とは異なるハードウェア MTU を設定する場合、それを永続化するには手動で設定する必要があります。マシン設定、DHCP 設定、カーネルコマンドラインなどの方法を使用してください。
  • mtu.network.from フィールドは、クラスターネットワークの現在の MTU である network.status.clusterNetworkMTU フィールドと同じである必要があります。
  • mtu.network.to フィールドは、クラスターネットワークの目的の MTU に設定する必要があります。ネットワークプラグインのオーバーレイオーバーヘッドを考慮し、ハードウェア MTU よりも低くする必要があります。OVN-Kubernetes の場合、オーバーヘッドは 100 バイトです。

指定の値が有効な場合に、CNO は、クラスターネットワークの MTU が mtu.network.to フィールドの値に設定された新しい一時設定を書き出します。

Machine Config Operator (MCO): クラスター内の各ノードのローリングリブートを実行します。

クラスター上のノードのプライマリーネットワークインターフェイスの MTU を再設定します。これは、次のいずれかの方法を使用して実行できます。

  • MTU を変更した新しい NetworkManager 接続プロファイルのデプロイ
  • DHCP サーバー設定による MTU の変更
  • ブートパラメーターによる MTU の変更

該当なし

ネットワークプラグインの CNO 設定で mtu 値を設定し、spec.migrationnull に設定します。

Machine Config Operator (MCO): 新しい MTU 設定を使用して、クラスター内の各ノードのローリングリブートを実行します。

2.2. クラスターネットワーク MTU の変更

クラスター管理者は、クラスターの最大伝送単位 (MTU) を増減できます。

重要

MTU 移行プロセス中にノードの MTU 値をロールバックすることはできません。ただし、MTU 移行プロセスの完了後に値をロールバックすることはできます。

移行には中断が伴うため、MTU 更新が有効になると、クラスター内のノードが一時的に使用できなくなる可能性があります。

次の手順では、マシン設定、Dynamic Host Configuration Protocol (DHCP)、または ISO イメージを使用してクラスターネットワーク MTU を変更する方法を説明します。DHCP または ISO アプローチを使用する場合は、クラスターのインストール後に保持した設定アーティファクトを参照して、手順を完了する必要があります。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つアカウントを使用してクラスターにアクセスできる。
  • クラスターのターゲット MTU を特定している。OVN-Kubernetes ネットワークプラグインの MTU は、クラスター内の最小のハードウェア MTU 値から 100 を引いた値に設定する必要があります。
  • ノードが物理マシンである場合は、クラスターネットワークと、接続されているネットワークスイッチがジャンボフレームをサポートしていることを確認する。
  • ノードが仮想マシン (VM) である場合は、ハイパーバイザーと、接続されているネットワークスイッチがジャンボフレームをサポートしていることを確認する。

2.2.1. 現在のクラスターの MTU 値を確認する

クラスターの一部がクラウドにあり、一部がオンプレミス環境にあるハイブリッド環境でネットワークの安定性とパフォーマンスを確保するには、クラスターネットワークの現在の最大伝送単位 (MTU) を取得できます。

手順

  • クラスターネットワークの現在の MTU を取得するには、次のコマンドを入力します。

    $ oc describe network.config cluster

    出力例

    ...
    Status:
      Cluster Network:
        Cidr:               10.217.0.0/22
        Host Prefix:        23
      Cluster Network MTU:  1400
      Network Type:         OVNKubernetes
      Service Network:
        10.217.4.0/23
    ...

2.2.2. ハードウェア MTU 設定の準備

MTU 変更時にネットワークの安定性を維持するには、DHCP、PXE、NetworkManager などの方法を使用して、基盤となるハードウェアの設定を準備する必要があります。この準備を行うことで、クラスターネットワークに変更を適用する前に、すべてのクラスターノードが新しい MTU 値を受け入れる準備ができていることを確認できます。

手順

  1. ハードウェア MTU の設定を準備します。

    • ハードウェア MTU が DHCP で指定されている場合は、次の dnsmasq 設定などで DHCP 設定を更新します。

      dhcp-option-force=26,<mtu>

      ここでは、以下のようになります。

      <mtu>
      DHCP サーバーがアドバタイズするハードウェア MTU を指定します。
    • ハードウェア MTU が PXE を使用したカーネルコマンドラインで指定されている場合は、それに応じてその設定を更新します。
    • ハードウェア MTU が NetworkManager 接続設定で指定されている場合は、以下のステップを実行します。OpenShift Container Platform では、これは、DHCP、カーネルコマンドラインなどの方法でネットワーク設定を明示的に指定していない場合のデフォルトのアプローチです。変更なしで次の手順を機能させるには、全クラスターノードで、同じ基盤となるネットワーク設定を使用する必要があります。

      1. 次のコマンドを入力して、プライマリーネットワークインターフェイスを見つけます。

        $ oc debug node/<node_name> -- chroot /host nmcli -g connection.interface-name c show ovs-if-phys0

        ここでは、以下のようになります。

        <node_name>
        クラスター内のノードの名前を指定します。
      2. <interface>-mtu.conf ファイルに次の NetworkManager 設定を作成します。

        [connection-<interface>-mtu]
        match-device=interface-name:<interface>
        ethernet.mtu=<mtu>

        ここでは、以下のようになります。

        <interface>
        プライマリーネットワークインターフェイス名を指定します。
        <mtu>
        新しいハードウェア MTU 値を指定します。

2.2.3. MachineConfig オブジェクトの作成

ハードウェア MTU の変更に備えてノードを準備するには、コントロールプレーンノードとコンピュートノードの両方に対して MachineConfig オブジェクトを作成する必要があります。これらのオブジェクトを作成することで、更新されたネットワークインターフェイス設定が、クラスターの即時的な不安定性を引き起こすことなく、デプロイメント準備が整うことが保証されます。

手順

  1. 1 つはコントロールプレーンノード用、もう 1 つはクラスター内のワーカーノード用に、2 つの MachineConfig オブジェクトを作成します。

    1. control-plane-interface.bu ファイルに次の Butane 設定を作成します。

      注記

      設定ファイルで指定する Butane のバージョン は、OpenShift Container Platform のバージョンと同じである必要があり、末尾は常に 0 です。たとえば、4.20.0 などです。Butane の詳細は、「Butane を使用したマシン設定の作成」を参照してください。

      variant: openshift
      version: 4.20.0
      metadata:
        name: 01-control-plane-interface
        labels:
          machineconfiguration.openshift.io/role: master
      storage:
        files:
          - path: /etc/NetworkManager/conf.d/99-<interface>-mtu.conf
            contents:
              local: <interface>-mtu.conf
            mode: 0600

      ここでは、以下のようになります。

      ストレージファイルパス
      プライマリーネットワークインターフェイスの NetworkManager 接続名を指定します。
      ストレージ.ファイル.ローカル
      前のステップで更新された NetworkManager 設定ファイルのローカルファイル名を指定します。
    2. worker-interface.bu ファイルに次の Butane 設定を作成します。

      注記

      設定ファイルで指定する Butane のバージョン は、OpenShift Container Platform のバージョンと同じである必要があり、末尾は常に 0 です。たとえば、4.20.0 などです。Butane の詳細は、「Butane を使用したマシン設定の作成」を参照してください。

      variant: openshift
      version: 4.20.0
      metadata:
        name: 01-worker-interface
        labels:
          machineconfiguration.openshift.io/role: worker
      storage:
        files:
          - path: /etc/NetworkManager/conf.d/99-<interface>-mtu.conf
            contents:
              local: <interface>-mtu.conf
            mode: 0600

      ここでは、以下のようになります。

      ストレージファイルパス
      プライマリーネットワークインターフェイスの NetworkManager 接続名を指定します。
      ストレージ.ファイル.ローカル
      前のステップで更新された NetworkManager 設定ファイルのローカルファイル名を指定します。
  2. 次のコマンドを実行して、Butane 設定から MachineConfig オブジェクトを作成します。

    $ for manifest in control-plane-interface worker-interface; do
        butane --files-dir . $manifest.bu > $manifest.yaml
      done
    警告

    これらのマシン設定は、後で明示的に指示されるまで適用しないでください。これらのマシン設定を適用すると、クラスターの安定性が失われます。

2.2.4. MTU の移行の開始

クラスターネットワークとマシンインターフェイスの移行設定を指定して、最大伝送単位 (MTU) の移行を開始します。Machine Config Operator は、MTU 変更に備えてクラスターを準備するために、ノードのローリング再起動を実行します。

手順

  1. MTU の移行を開始するには、次のコマンドを入力して移行設定を指定します。Machine Config Operator は、MTU の変更に備えて、クラスター内のノードをローリングリブートします。

    $ oc patch Network.operator.openshift.io cluster --type=merge --patch \
      '{"spec": { "migration": { "mtu": { "network": { "from": <overlay_from>, "to": <overlay_to> } , "machine": { "to" : <machine_to> } } } } }'

    ここでは、以下のようになります。

    <overlay_from>
    現在のクラスターネットワークの MTU 値を指定します。
    <overlay_to>
    クラスターネットワークのターゲット MTU を指定します。この値は、<machine_to> の値を基準にして設定します。OVN-Kubernetes の場合、この値は <machine_to> の値から 100 を引いた値である必要があります。
    <machine_to>
    基盤となるホストネットワークのプライマリーネットワークインターフェイスの MTU を指定します。
    $ oc patch Network.operator.openshift.io cluster --type=merge --patch \
      '{"spec": { "migration": { "mtu": { "network": { "from": 1400, "to": 9000 } , "machine": { "to" : 9100} } } } }'
  2. Machine Config Operator は、各マシン設定プール内のマシンを更新するときに、各ノードを 1 つずつ再起動します。すべてのノードが更新されるまで待機する必要があります。以下のコマンドを実行してマシン設定プールのステータスを確認します。

    $ oc get machineconfigpools

    正常に更新されたノードには、UPDATED=trueUPDATING=falseDEGRADED=false のステータスがあります。

    注記

    Machine Config Operator は、デフォルトでプールごとに 1 つずつマシンを更新するため、クラスターのサイズに応じて移行にかかる合計時間が増加します。

2.2.5. マシン設定の検証

ホストマシンの設定を確認し、最大伝送単位 (MTU) の移行が正常に適用されたことを確認してください。設定状態とシステム設定を確認することで、ノードが正しい移行スクリプトを使用していることを確認できます。

手順

  • ホスト上の新規マシン設定のステータスを確認します。

    1. マシン設定の状態と適用されたマシン設定の名前をリスト表示するには、以下のコマンドを入力します。

      $ oc describe node | egrep "hostname|machineconfig"

      出力例

      kubernetes.io/hostname=master-0
      machineconfiguration.openshift.io/currentConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/desiredConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/reason:
      machineconfiguration.openshift.io/state: Done

    2. 以下のステートメントが true であることを確認します。

      • machineconfiguration.openshift.io/state フィールドの値は Done です。
      • machineconfiguration.openshift.io/currentConfig フィールドの値は、machineconfiguration.openshift.io/desiredConfig フィールドの値と等しくなります。
    3. マシン設定が正しいことを確認するには、以下のコマンドを入力します。

      $ oc get machineconfig <config_name> -o yaml | grep ExecStart

      ここでは、以下のようになります。

      <config_name>
      machineconfiguration.openshift.io/currentConfig フィールドからマシン設定の名前を指定します。

      マシン設定には、systemd 設定に以下の更新を含める必要があります。

      ExecStart=/usr/local/bin/mtu-migration.sh

2.2.6. 新しいハードウェア MTU 値の適用

クラスター全体で一貫したネットワーク通信を確保するには、新しいハードウェア最大伝送単位 (MTU) 値をノードに適用する必要があります。このプロセスには、基盤となるネットワークインターフェイスの更新と、Machine Config Operator が各ノードを正常に再起動および更新したことを確認する作業が含まれます。

手順

  1. 基盤となるネットワークインターフェイスの MTU 値を更新します。

    • NetworkManager 接続設定で新しい MTU を指定する場合は、次のコマンドを入力します。MachineConfig Operator は、クラスター内のノードのローリングリブートを自動的に実行します。

      $ for manifest in control-plane-interface worker-interface; do
          oc create -f $manifest.yaml
        done
    • DHCP サーバーオプションまたはカーネルコマンドラインと PXE を使用して新しい MTU を指定する場合は、インフラストラクチャーに必要な変更を加えます。
  2. Machine Config Operator は、各マシン設定プール内のマシンを更新するときに、各ノードを 1 つずつ再起動します。すべてのノードが更新されるまで待機する必要があります。以下のコマンドを実行してマシン設定プールのステータスを確認します。

    $ oc get machineconfigpools

    正常に更新されたノードには、UPDATED=trueUPDATING=falseDEGRADED=false のステータスがあります。

    注記

    Machine Config Operator は、デフォルトでプールごとに 1 つずつマシンを更新するため、クラスターのサイズに応じて移行にかかる合計時間が増加します。

  3. ホスト上の新規マシン設定のステータスを確認します。

    1. マシン設定の状態と適用されたマシン設定の名前をリスト表示するには、以下のコマンドを入力します。

      $ oc describe node | egrep "hostname|machineconfig"

      出力例

      kubernetes.io/hostname=master-0
      machineconfiguration.openshift.io/currentConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/desiredConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/reason:
      machineconfiguration.openshift.io/state: Done

      以下のステートメントが true であることを確認します。

      • machineconfiguration.openshift.io/state フィールドの値は Done です。
      • machineconfiguration.openshift.io/currentConfig フィールドの値は、machineconfiguration.openshift.io/desiredConfig フィールドの値と等しくなります。
    2. マシン設定が正しいことを確認するには、以下のコマンドを入力します。

      $ oc get machineconfig <config_name> -o yaml | grep path:

      ここでは、以下のようになります。

      <config_name>
      machineconfiguration.openshift.io/currentConfig フィールドからマシン設定の名前を指定します。

      マシン設定が正常にデプロイされた場合、前の出力には /etc/NetworkManager/conf.d/99-<interface>-mtu.conf ファイルパスと ExecStart=/usr/local/bin/mtu-migration.sh 行が含まれます。

2.2.7. MTU の移行の完了

OVN-Kubernetes ネットワークプラグインに新しい最大伝送単位 (MTU) 設定を適用するために、MTU 移行を完了します。これによりクラスター設定が更新され、プロセスを完了するためにノードのローリングリブートがトリガーされます。

手順

  1. MTU の移行を完了するために、OVN-Kubernetes ネットワークプラグインに対して次のコマンドを入力します。

    $ oc patch Network.operator.openshift.io cluster --type=merge --patch \
      '{"spec": { "migration": null, "defaultNetwork":{ "ovnKubernetesConfig": { "mtu": <mtu> }}}}'

    ここでは、以下のようになります。

    <mtu>
    <overlay_to> で指定した新しいクラスターネットワーク MTU を指定します。
  2. MTU の移行が完了すると、各マシン設定プールノードが 1 つずつ再起動します。すべてのノードが更新されるまで待機する必要があります。以下のコマンドを実行してマシン設定プールのステータスを確認します。

    $ oc get machineconfigpools

    正常に更新されたノードには、UPDATED=trueUPDATING=falseDEGRADED=false のステータスがあります。

検証

  1. クラスターネットワークの現在の MTU を取得するには、次のコマンドを入力します。

    $ oc describe network.config cluster
  2. ノードのプライマリーネットワークインターフェイスの現在の MTU を取得します。

    1. クラスター内のノードをリスト表示するには、次のコマンドを入力します。

      $ oc get nodes
    2. ノードのプライマリーネットワークインターフェイスの現在の MTU 設定を取得するには、次のコマンドを入力します。

      $ oc adm node-logs <node> -u ovs-configuration | grep configure-ovs.sh | grep mtu | grep <interface> | head -1

      ここでは、以下のようになります。

      <node>
      前のステップの出力をもとに、ノードを指定します。
      <interface>
      ノードのプライマリーネットワークインターフェイス名を指定します。

      出力例

      ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8051

第3章 ネットワーク結合に関する考慮事項

ネットワークボンディング (リンクアグリゲーション とも呼ばれる) を使用すると、複数のネットワークインターフェイスを単一の論理インターフェイスに統合できます。これは、ボンディングされたインターフェイス間でネットワークトラフィックをどのように分散させるかを処理するために、異なるモードを使用できることを意味します。各モードは耐障害性を提供し、一部のモードではネットワークの負荷分散機能も提供します。Red Hat は、Open vSwitch (OVS) ボンディングとカーネルボンディングをサポートしています。

3.1. Open vSwitch (OVS) ボンディング

OVS ボンディング設定では、各物理ネットワークインターフェイスコントローラー (NIC) を特定のボンディングのポートとして接続することにより、単一の論理インターフェイスを作成します。この単一のボンディングがすべてのネットワークトラフィックを処理し、個々のインターフェイスの機能を効果的に代替します。

OVS インターフェイスと連携する OVS ブリッジのアーキテクチャー設定として、以下の例を検討してください。

  • ネットワークインターフェイスは、プロトコルレベルのトラフィックや IP アドレスの割り当てなどのその他の管理タスクを管理するために、ブリッジ Media Access Control (MAC) アドレスを使用します。
  • 物理インターフェイスの物理 MAC アドレスは、トラフィックを処理しません。
  • OVS は、OVS ブリッジレベルで全ての MAC アドレス管理を処理します。

このレイアウトでは、ボンディングがデータパスとして機能し、MAC アドレスの一元管理が OVS ブリッジレベルで行われるため、ボンディングインターフェイスの管理が簡素化されます。

OVS ボンディングでは、アクティブ/バックアップ モードまたは バランス/SLB モードのいずれかを選択できます。ボンディングモードは、ネットワーク伝送中にボンディングインターフェイスがどのように使用されるかに関するポリシーを指定します。

3.1.1. クラスターのアクティブ/バックアップモードを有効にしてください

アクティブ/バックアップ モードは、プライマリーリンクに障害が発生した場合にバックアップリンクに切り替えることで、ネットワーク接続の耐障害性を提供します。

このモードでは、クラスター用に以下のポートを指定します。

  • アクティブなポートとは、常に 1 つの物理インターフェイスがトラフィックの送受信を行うポートのことです。
  • 他のすべてのポートがバックアップリンクとして機能し、リンクの状態を継続的に監視するスタンバイポート。

フェイルオーバー処理中に、アクティブポートまたはそのリンクに障害が発生した場合、ボンディングロジックによってすべてのネットワークトラフィックがスタンバイポートに切り替わります。このスタンバイポートが新しいアクティブポートになります。フェイルオーバーを機能させるには、ボンディングされたすべてのポートが同じ Media Access Control (MAC) アドレスを共有している必要があります。

3.1.2. クラスターで OVS balance-slb モードを有効にする

2 つ以上の物理インターフェイスがネットワークトラフィックを共有できるように、Open vSwitch (OVS) の balance-slb モードを有効にできます。balance-slb モードのインターフェイスは、ネットワークスイッチとのソースロードバランシングを必要とせずに、仮想化ワークロードを実行するクラスターにソース負荷分散 (SLB) 機能を提供できます。

現在、ソースロードバランシングはボンディングインターフェイスで実行されます。このインターフェイスは br-phy などの補助ブリッジに接続します。ソースロードバランシングは、Media Access Control (MAC) アドレスと仮想ローカルエリアネットワーク (VLAN) の組み合わせが複数存在する場合にのみ、負荷分散を行います。OVN-Kubernetes Pod のトラフィックはすべて同じ MAC アドレスと VLAN を使用するため、このトラフィックを多数の物理インターフェイス間で負荷分散することはできないことに注意してください。

次の図は、単純なクラスターインフラストラクチャーレイアウトでの balance-slb モードを示しています。仮想マシン (VM) は、特定の localnet NetworkAttachmentDefinition (NAD) カスタムリソース定義 (CRD)、NAD 0 または NAD 1 に接続します。各 NAD は、仮想マシンに基盤となる物理ネットワークへのアクセスを提供し、タグ付きまたはタグなしの VLAN トラフィックをサポートしています。br-ex OVS ブリッジは仮想マシンからのトラフィックを受信し、そのトラフィックを次の OVS ブリッジである br-phy に渡します。br-phy ブリッジは SLB ボンディングのコントローラーとして機能します。SLB ボンディングは、eno0eno1 などの物理インターフェイスリンクを介して、異なる仮想マシンポートからのトラフィックを分散します。さらに、どちらの物理インターフェイスからの Ingress トラフィックも、OVS ブリッジのセットを通過して仮想マシンに到達できます。

図3.1 2 つの NAD を持つローカルネット上で動作する OVS balance-slb モード

2 つの NAD を持つローカルネット上で動作する OVS `balance-slb` モード

OVS ボンディングを使用して、balance-slb モードインターフェイスをプライマリーまたはセカンダリーネットワークタイプに統合できます。OVS ボンディングでは、次の点に注意してください。

  • OVN-Kubernetes CNI プラグインをサポートし、プラグインと簡単に統合できます。
  • ネイティブで balance-slb モードをサポートします。

前提条件

  • プライマリーネットワークに複数の物理インターフェイスが接続されており、それらのインターフェイスを MachineConfig ファイルで定義した。
  • マニフェストオブジェクトを作成し、カスタマイズした br-ex ブリッジをオブジェクト設定ファイルで定義した。
  • プライマリーネットワークに複数の物理インターフェイスが接続されており、それらのインターフェイスを NAD CRD ファイルで定義した。

手順

  1. クラスター内に存在するベアメタルホストごとに、クラスターの install-config.yaml ファイルで、次の例のように networkConfig セクションを定義します。

    # ...
    networkConfig:
      interfaces:
        - name: enp1s0
          type: ethernet
          state: up
          ipv4:
            dhcp: true
            enabled: true
          ipv6:
            enabled: false
        - name: enp2s0
          type: ethernet
          state: up
          mtu: 1500
          ipv4:
            dhcp: true
            enabled: true
          ipv6:
            dhcp: true
            enabled: true
        - name: enp3s0
          type: ethernet
          state: up
          mtu: 1500
          ipv4:
            enabled: false
          ipv6:
            enabled: false
    # ...

    ここでは、以下のようになります。

    enp1s0
    プロビジョニングされるネットワークインターフェイスコントローラー (NIC) のインターフェイス。
    enp2s0
    ボンディングインターフェイス用の Ignition 設定ファイルを取り込む最初のボンディングされたインターフェイス。
    mtu
    ボンディングポートの br-ex 最大伝送単位 (MTU) を手動で設定します。
    enp3s0
    2 つ目のボンディングされたインターフェイスは、クラスターのインストール中に Ignition を実行する最小設定の一部です。
  2. NMState 設定ファイルで各ネットワークインターフェイスを定義します。

    多数のネットワークインターフェイスを定義する NMState 設定ファイルの例

    ovn:
      bridge-mappings:
        - localnet: localnet-network
          bridge: br-ex
          state: present
    interfaces:
      - name: br-ex
        type: ovs-bridge
        state: up
        bridge:
          allow-extra-patch-ports: true
          port:
            - name: br-ex
            - name: patch-ex-to-phy
        ovs-db:
          external_ids:
            bridge-uplink: "patch-ex-to-phy"
      - name: br-ex
        type: ovs-interface
        state: up
        mtu: 1500
        ipv4:
          enabled: true
          dhcp: true
          auto-route-metric: 48
        ipv6:
          enabled: false
          dhcp: false
          auto-route-metric: 48
      - name: br-phy
        type: ovs-bridge
        state: up
        bridge:
          allow-extra-patch-ports: true
          port:
            - name: patch-phy-to-ex
            - name: ovs-bond
              link-aggregation:
                mode: balance-slb
                port:
                  - name: enp2s0
                  - name: enp3s0
      - name: patch-ex-to-phy
        type: ovs-interface
        state: up
        patch:
          peer: patch-phy-to-ex
      - name: patch-phy-to-ex
        type: ovs-interface
        state: up
        patch:
          peer: patch-ex-to-phy
      - name: enp1s0
        type: ethernet
        state: up
        ipv4:
          dhcp: true
          enabled: true
        ipv6:
          enabled: false
      - name: enp2s0
        type: ethernet
        state: up
        mtu: 1500
        ipv4:
          enabled: false
        ipv6:
          enabled: false
      - name: enp3s0
        type: ethernet
        state: up
        mtu: 1500
        ipv4:
          enabled: false
        ipv6:
          enabled: false
    # ...

    ここでは、以下のようになります。

    mtu
    ボンディングポートの br-ex MTU を手動で設定します。
  3. base64 コマンドを使用して、NMState 設定ファイルのインターフェイスコンテンツをエンコードします。

    $ base64 -w0  <nmstate_configuration>.yml

    <nmstate_configuration>: -w0 オプションは、base64 エンコード操作中の行折り返しを防止します。

  4. master ロールと worker ロールの MachineConfig マニフェストファイルを作成します。前のコマンドからの base64 エンコード文字列を各 MachineConfig マニフェストファイルに必ず埋め込んでください。次のマニフェストファイルの例では、クラスター内に存在するすべてのノードに対して master ロールを設定します。ノード固有の master ロールと worker ロールのマニフェストファイルを作成することもできます。

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: master
      name: 10-br-ex-master
    spec:
      config:
        ignition:
          version: 3.2.0
        storage:
          files:
          - contents:
              source: data:text/plain;charset=utf-8;base64,<base64_encoded_nmstate_configuration>
            mode: 0644
            overwrite: true
            path: /etc/nmstate/openshift/cluster.yml

    ここでは、以下のようになります。

    name
    ポリシーの名前。
    source
    エンコードされた base64 情報を指定されたパスに書き込みます。
    path
    cluster.yml ファイルへのパスを指定します。クラスター内の各ノードに対して、<node_short_hostname>.yml など、ノードへの短いホスト名パスを指定できます。
  5. MachineConfig マニフェストファイルを ./<installation_directory>/manifests ディレクトリーに保存します。<installation_directory> は、インストールプログラムがファイルを作成するディレクトリーです。

    Machine Config Operator (MCO) が各マニフェストファイルからコンテンツを取得し、ローリング更新中に選択されたすべてのノードにそのコンテンツを一貫して適用します。

3.2. カーネル結合

カーネルボンディング (Linux カーネルに組み込まれた機能で、複数のイーサネットインターフェイス間でリンクアグリゲーションを行う機能) を使用することで、単一の論理的な物理インターフェイスを作成できます。カーネルボンディングにより、複数のネットワークインターフェイスを単一の論理インターフェイスに結合することが可能になり、帯域幅の増加やリンク障害発生時の冗長性確保によってネットワークパフォーマンスを向上させることができます。

OVS ボンディングに依存するボンディングインターフェイスがない場合、カーネルボンディングがデフォルトモードになります。このボンディング方式では、サポートされている OVS ボンディングと同等のカスタマイズ性は得られません。

カーネルボンディング モードの場合、ボンディングインターフェイスはブリッジインターフェイスの外部に存在し、つまりデータパス内には存在しません。このモードでは、ネットワークトラフィックはボンディングインターフェイスポート上で送受信されず、代わりにカーネルレベルでの MAC アドレス割り当てのための追加のブリッジング機能が必要となります。

ノードのネットワークコントローラーインターフェイス (NIC) で カーネルボンディング モードを有効にした場合、Media Access Control (MAC) アドレスのフェイルオーバーを指定する必要があります。この設定により、eno1f0eno2f0 などのボンディングインターフェイスとのノード通信の問題が防止されます。

Red Hat は fail_over_mac パラメーターに対して以下の値のみをサポートしています。

  • 0: none を指定します。これにより、MAC アドレスのフェイルオーバーが無効になり、すべてのインターフェイスがボンディングインターフェイスと同じ MAC アドレスを受け取ります。これはデフォルト値です。

Red Hat は fail_over_mac パラメーターに対して以下の値をサポートしていません。

  • 1: アクティブ 値を指定し、プライマリーボンディングインターフェイスの MAC アドレスを常にアクティブなインターフェイスと同じに設定します。フェイルオーバー中にインターフェイスの MAC アドレスが変更された場合、ボンディングインターフェイスの MAC アドレスも、新しい MAC アドレスに合わせて変更されます。
  • 2: フェイルオーバー時に、アクティブなインターフェイスがボンディングインターフェイスの MAC アドレスを取得し、以前アクティブだったインターフェイスが新しくアクティブになったインターフェイスの MAC アドレスを取得するように、フォロー 値を指定します。

第4章 Stream Control Transmission Protocol (SCTP) の使用

クラスター管理者は、ベアメタルクラスターで Stream Control Transmission Protocol (SCTP) を使用できます。

4.1. OpenShift Container Platform での SCTP のサポート

クラスター管理者は、クラスターのホストで SCTP を有効にできます。Red Hat Enterprise Linux CoreOS (RHCOS) で、SCTP モジュールはデフォルトで無効にされています。

SCTP は、IP ネットワークの上部で実行される信頼できるメッセージベースのプロトコルです。

これを有効にすると、SCTP を Pod、サービス、およびネットワークポリシーでプロトコルとして使用できます。Service オブジェクトは、type パラメーターを ClusterIP または NodePort のいずれかの値に設定して定義する必要があります。

4.1.1. SCTP プロトコルを使用した設定例

protocol パラメーターを Pod またはサービスリソース定義の SCTP 値に設定して、Pod またはサービスを SCTP を使用するように設定できます。

以下の例では、Pod は SCTP を使用するように設定されています。

apiVersion: v1
kind: Pod
metadata:
  namespace: project1
  name: example-pod
spec:
  containers:
    - name: example-pod
...
      ports:
        - containerPort: 30100
          name: sctpserver
          protocol: SCTP

以下の例では、サービスは SCTP を使用するように設定されています。

apiVersion: v1
kind: Service
metadata:
  namespace: project1
  name: sctpserver
spec:
...
  ports:
    - name: sctpserver
      protocol: SCTP
      port: 30100
      targetPort: 30100
  type: ClusterIP

以下の例では、NetworkPolicy オブジェクトは、特定のラベルの付いた Pod からポート 80 の SCTP ネットワークトラフィックに適用するように設定されます。

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-sctp-on-http
spec:
  podSelector:
    matchLabels:
      role: web
  ingress:
  - ports:
    - protocol: SCTP
      port: 80

4.2. SCTP (Stream Control Transmission Protocol) の有効化

クラスター管理者は、クラスターのワーカーノードでブラックリストに指定した SCTP カーネルモジュールを読み込み、有効にできます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. 以下の YAML 定義が含まれる load-sctp-module.yaml という名前のファイルを作成します。

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      name: load-sctp-module
      labels:
        machineconfiguration.openshift.io/role: worker
    spec:
      config:
        ignition:
          version: 3.2.0
        storage:
          files:
            - path: /etc/modprobe.d/sctp-blacklist.conf
              mode: 0644
              overwrite: true
              contents:
                source: data:,
            - path: /etc/modules-load.d/sctp-load.conf
              mode: 0644
              overwrite: true
              contents:
                source: data:,sctp
  2. MachineConfig オブジェクトを作成するには、以下のコマンドを入力します。

    $ oc create -f load-sctp-module.yaml
  3. オプション: MachineConfig Operator が設定変更を適用している間にノードのステータスを確認するには、以下のコマンドを入力します。ノードのステータスが Ready に移行すると、設定の更新が適用されます。

    $ oc get nodes

4.3. SCTP (Stream Control Transmission Protocol) が有効になっていることの確認

SCTP がクラスターで機能することを確認するには、SCTP トラフィックをリッスンするアプリケーションで Pod を作成し、これをサービスに関連付け、公開されたサービスに接続します。

前提条件

  • クラスターからインターネットにアクセスし、nc パッケージをインストールすること。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. SCTP リスナーを起動する Pod を作成します。

    1. 以下の YAML で Pod を定義する sctp-server.yaml という名前のファイルを作成します。

      apiVersion: v1
      kind: Pod
      metadata:
        name: sctpserver
        labels:
          app: sctpserver
      spec:
        containers:
          - name: sctpserver
            image: registry.access.redhat.com/ubi9/ubi
            command: ["/bin/sh", "-c"]
            args:
              ["dnf install -y nc && sleep inf"]
            ports:
              - containerPort: 30102
                name: sctpserver
                protocol: SCTP
    2. 以下のコマンドを入力して Pod を作成します。

      $ oc create -f sctp-server.yaml
  2. SCTP リスナー Pod のサービスを作成します。

    1. 以下の YAML でサービスを定義する sctp-service.yaml という名前のファイルを作成します。

      apiVersion: v1
      kind: Service
      metadata:
        name: sctpservice
        labels:
          app: sctpserver
      spec:
        type: NodePort
        selector:
          app: sctpserver
        ports:
          - name: sctpserver
            protocol: SCTP
            port: 30102
            targetPort: 30102
    2. サービスを作成するには、以下のコマンドを入力します。

      $ oc create -f sctp-service.yaml
  3. SCTP クライアントの Pod を作成します。

    1. 以下の YAML で sctp-client.yaml という名前のファイルを作成します。

      apiVersion: v1
      kind: Pod
      metadata:
        name: sctpclient
        labels:
          app: sctpclient
      spec:
        containers:
          - name: sctpclient
            image: registry.access.redhat.com/ubi9/ubi
            command: ["/bin/sh", "-c"]
            args:
              ["dnf install -y nc && sleep inf"]
    2. Pod オブジェクトを作成するには、以下のコマンドを入力します。

      $ oc apply -f sctp-client.yaml
  4. サーバーで SCTP リスナーを実行します。

    1. サーバー Pod に接続するには、以下のコマンドを入力します。

      $ oc rsh sctpserver
    2. SCTP リスナーを起動するには、以下のコマンドを入力します。

      $ nc -l 30102 --sctp
  5. サーバーの SCTP リスナーに接続します。

    1. ターミナルプログラムで新規のターミナルウィンドウまたはタブを開きます。
    2. sctpservice サービスの IP アドレスを取得します。以下のコマンドを入力します。

      $ oc get services sctpservice -o go-template='{{.spec.clusterIP}}{{"\n"}}'
    3. クライアント Pod に接続するには、以下のコマンドを入力します。

      $ oc rsh sctpclient
    4. SCTP クライアントを起動するには、以下のコマンドを入力します。<cluster_IP>sctpservice サービスのクラスター IP アドレスに置き換えます。

      # nc <cluster_IP> 30102 --sctp

第5章 セカンダリーインターフェイスメトリクスのネットワーク割り当てへの関連付け

クラスターのトラフィックをより詳細に把握するために、セカンダリーインターフェイスのメトリクスを特定のネットワークアタッチメントに関連付けることができます。pod_network_info メトリクスを使用して、NetworkAttachmentDefinition リソースに基づいてインターフェイスにラベルを付けることで、ネットワーク全体のパフォーマンスをより簡単に監視し、接続の問題をトラブルシューティングできます。

5.1. モニタリングのためのセカンダリーネットワークメトリクスの拡張

ネットワークトラフィックを効果的に監視および管理するには、識別情報を追加して二次的なネットワークメトリクスを拡張することができます。pod_network_name_info メトリクスを使用して、NetworkAttachmentDefinition リソースに基づいてインターフェイスにラベルを付けることで、インターフェイスの種類を分類し、正確なメトリクス集計とアラートが可能になります。

セカンダリーデバイス (インターフェイス) は、各種の用途に合わせて使用されます。効果的な集約と監視を可能にするには、セカンダリーネットワークインターフェイスからのメトリクスを分類する必要があります。

公開されるメトリクスにはインターフェイスが含まれますが、インターフェイスの出所は指定されません。これは、追加のインターフェイスがない場合に実行できます。ただし、セカンダリーインターフェイスが追加された場合、インターフェイス名のみに依存すると、その目的を識別してメトリクスを効果的に使用することが困難になるため、問題が発生します。

セカンダリーインターフェイスを追加する場合、名前は追加された順序によって異なります。セカンダリーインターフェイスは、それぞれ異なる目的に使用できる別のネットワークに属することができます。

pod_network_name_info を使用すると、現在のメトリクスをインターフェイスタイプを識別する追加情報を使用して拡張できます。このようにして、メトリクスを集約し、特定のインターフェイスタイプに特定のアラームを追加できます。

ネットワークタイプは、それぞれのセカンダリーネットワーククラスを区別する NetworkAttachmentDefinition リソースの名前から生成されます。たとえば、異なるネットワークに属するインターフェイスや、異なる CNI を使用するインターフェイスは、異なるネットワーク割り当て定義名を使用します。

5.2. Network Metrics Daemon

ネットワークメトリクスデーモンは、複雑な Pod 環境におけるパフォーマンス管理をサポートするために、ネットワーク関連のメトリクスを収集して公開します。このコンポーネントは、セカンダリーインターフェイスのメタデータを提供します。これは、異なるネットワークアタッチメント間での正確なトラフィック監視に必要です。

kubelet はすでに確認できるネットワーク関連のメトリクスを公開しています。以下は、これらのメトリクスになります。

  • container_network_receive_bytes_total
  • container_network_receive_errors_total
  • container_network_receive_packets_total
  • container_network_receive_packets_dropped_total
  • container_network_transmit_bytes_total
  • container_network_transmit_errors_total
  • container_network_transmit_packets_total
  • container_network_transmit_packets_dropped_total

これらのメトリクスのラベルには、とくに以下が含まれます。

  • Pod の名前
  • Pod の namespace
  • インターフェイス名 (例: eth0)

これらのメトリクスは、たとえば Multus を使用して、新規インターフェイスが Pod に追加されるまで正常に機能します。

インターフェイスのラベルはインターフェイス名を参照しますが、そのインターフェイスの用途は明確ではありません。多くの異なるインターフェイスがある場合、監視しているメトリクスが参照するネットワークを把握することはできません。

これには、以降のセクションで説明する新規の pod_network_name_info を導入して対応できます。

5.3. ネットワーク名を持つメトリクス

セカンダリーネットワークの監視を簡素化するために、pod_network_name_info メトリクスを使用して、ネットワークパフォーマンスデータを特定のネットワーク名と関連付けることができます。このメトリクスをコンテナーネットワークメトリクスと組み合わせることで、異なるネットワークアタッチメント定義全体にわたるトラフィックパターンとエラーを特定できます。

pod_network_name_info の例

pod_network_name_info{interface="net0",namespace="namespacename",network_name="nadnamespace/firstNAD",pod="podname"} 0

ネットワーク名ラベルは、Multus によって追加されるアノテーションを使用して生成されます。これは、ネットワークの割り当て定義が属する namespace の連結と、ネットワーク割り当て定義の名前です。Network Metrics daemonset は、固定の値が 0pod_network_name_info 測定メトリクスを公開します。

新しいメトリクスのみでは十分な値が提供されませんが、ネットワーク関連の container_network_* メトリクスと組み合わせて、セカンダリーネットワークの監視に対するサポートを強化します。

以下のような promql クエリーを使用すると、k8s.v1.cni.cncf.io/network-status アノテーションから取得した値とネットワーク名を含む新規のメトリクスを取得できます。

(container_network_receive_bytes_total) + on(namespace,pod,interface) group_left(network_name) ( pod_network_name_info )
(container_network_receive_errors_total) + on(namespace,pod,interface) group_left(network_name) ( pod_network_name_info )
(container_network_receive_packets_total) + on(namespace,pod,interface) group_left(network_name) ( pod_network_name_info )
(container_network_receive_packets_dropped_total) + on(namespace,pod,interface) group_left(network_name) ( pod_network_name_info )
(container_network_transmit_bytes_total) + on(namespace,pod,interface) group_left(network_name) ( pod_network_name_info )
(container_network_transmit_errors_total) + on(namespace,pod,interface) group_left(network_name) ( pod_network_name_info )
(container_network_transmit_packets_total) + on(namespace,pod,interface) group_left(network_name) ( pod_network_name_info )
(container_network_transmit_packets_dropped_total) + on(namespace,pod,interface) group_left(network_name)

第6章 BGP ルーティング

6.1. BGP ルーティングについて

この機能は、クラスターにネイティブの Border Gateway Protocol (BGP) ルーティング機能を提供します。

重要

MetalLB Operator を使用しており、クラスター管理者、または MetalLB Operator 以外のサードパーティークラスターコンポーネントによって作成された metallb-system namespace に既存の FRRConfiguration CR がある場合は、それらが openshift-frr-k8s namespace にコピーされているか、そのサードパーティークラスターコンポーネントが新しい namespace を使用していることを確認する必要があります。詳細は、FRR-K8s リソースの移行 を参照してください。

6.1.1. Border Gateway Protocol (BGP) ルーティングについて

OpenShift Container Platform は、FRRouting (FRR) を通じて BGP ルーティングをサポートします。FRR は、Linux、UNIX、および同様のオペレーティングシステム向けの無料のオープンソースインターネットルーティングプロトコルスイートです。FRR-K8s は、Kubernetes に準拠した方法で FRR API のサブセットを公開する Kubernetes ベースのデーモンセットです。クラスター管理者は、FRRConfiguration カスタムリソース (CR) を使用して FRR サービスにアクセスできます。

6.1.1.1. サポートされているプラットフォーム

BGP ルーティングは、次のインフラストラクチャータイプでサポートされています。

  • ベアメタル

BGP ルーティングでは、ネットワークプロバイダーに対して BGP が適切に設定されている必要があります。ネットワークプロバイダーの停止や設定ミスにより、クラスターネットワークが中断される可能性があります。

6.1.1.2. MetalLB Operator の使用に関する考慮事項

MetalLB Operator は、クラスターへのアドオンとしてインストールされます。MetalLB Operator をデプロイすると、FRR-K8s が追加のルーティング機能プロバイダーとして自動的に有効になり、この機能によってインストールされた FRR-K8s デーモンが使用されます。

4.18 にアップグレードする前に、MetalLB Operator によって管理されていない metallb-system namespace 内の既存の FRRConfiguration (クラスター管理者またはその他のコンポーネントにより追加) を、openshift-frr-k8s namespace に手動でコピーし、必要に応じて namespace を作成する必要があります。

重要

MetalLB Operator を使用しており、クラスター管理者、または MetalLB Operator 以外のサードパーティークラスターコンポーネントによって作成された既存の FRRConfiguration CR が metallb-system namespace に存在する場合は、次の操作を行う必要があります。

  • 既存の FRRConfiguration CR が openshift-frr-k8s namespace にコピーされていることを確認します。
  • サードパーティークラスターコンポーネントが、作成する FRRConfiguration CR に新しい namespace を使用することを確認します。
6.1.1.3. Cluster Network Operator の設定

Cluster Network Operator API は、BGP ルーティングを設定するために次の API フィールドを公開します。

  • spec.additionalRoutingCapabilities: ルートアドバタイズメントとは独立して使用できるクラスターの FRR-K8s デーモンのデプロイメントを有効にします。有効にすると、FRR-K8s デーモンがすべてのノードにデプロイされます。
6.1.1.4. BGP ルーティングカスタムリソース

BGP ルーティングの設定には、次のカスタムリソースが使用されます。

FRRConfiguration
このカスタムリソースは、BGP ルーティングの FRR 設定を定義します。この CR には namespace があります。

6.1.2. FRRConfiguration CRD の設定

MetalLB の標準機能を超えてルーティング動作をカスタマイズするには、FRRConfiguration カスタムリソース (CR) を設定します。

以下の参考例は、受信ルートなどの高度なサービスを有効にするために、特定の FRRouting (FRR) パラメーターを定義する方法を示しています。

ルーター パラメーター
routers パラメーターを使用すると、Virtual Routing and Forwarding (VRF) リソースごとに 1 つのルーターを設定して、複数のルーターを設定することができます。各ルーターに AS 番号 (ASN) を定義する必要があります。

次の例のように、接続する Border Gateway Protocol (BGP) の近隣のリストを定義することもできます。

FRRConfiguration CR の例

apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
  name: test
  namespace: frr-k8s-system
spec:
  bgp:
    routers:
    - asn: 64512
      neighbors:
      - address: 172.30.0.3
        asn: 4200000000
        ebgpMultiHop: true
        port: 180
      - address: 172.18.0.6
        asn: 4200000000
        port: 179
# ...

toAdvertise パラメーター
デフォルトでは、FRR-K8s はルーター設定の一部として設定された接頭辞をアドバタイズしません。プレフィックスを通知するには、toAdvertise パラメーターを使用します。

次の例のように、接頭辞のサブセットをアドバタイズできます。

FRRConfiguration CR の例

apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
  name: test
  namespace: frr-k8s-system
spec:
  bgp:
    routers:
    - asn: 64512
      neighbors:
      - address: 172.30.0.3
        asn: 4200000000
        ebgpMultiHop: true
        port: 180
        toAdvertise:
          allowed:
            prefixes:
            - 192.168.2.0/24
      prefixes:
        - 192.168.2.0/24
        - 192.169.2.0/24
# ...

  • allowed.prefixes: プレフィックスのサブセットを通知します。

次の例は、すべての接頭辞をアドバタイズする方法を示しています。

FRRConfiguration CR の例

apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
  name: test
  namespace: frr-k8s-system
spec:
  bgp:
    routers:
    - asn: 64512
      neighbors:
      - address: 172.30.0.3
        asn: 4200000000
        ebgpMultiHop: true
        port: 180
        toAdvertise:
          allowed:
            mode: all
      prefixes:
        - 192.168.2.0/24
        - 192.169.2.0/24
# ...

  • allowed.mode: すべてのプレフィックスを通知します。

    toReceive パラメーター
    デフォルトでは、FRR-K8s は近隣によってアドバタイズされた接頭辞を処理しません。このようなアドレスを処理するには、toReceive パラメーターを使用できます。

次の例のように、接頭辞のサブセットを設定できます。

FRRConfiguration CR の例

apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
  name: test
  namespace: frr-k8s-system
spec:
  bgp:
    routers:
    - asn: 64512
      neighbors:
      - address: 172.18.0.5
          asn: 64512
          port: 179
          toReceive:
            allowed:
              prefixes:
              - prefix: 192.168.1.0/24
              - prefix: 192.169.2.0/24
                ge: 25
                le: 28
# ...

  • 接頭辞: 接頭辞の長さが le 接頭辞の長さ以下で、ge 接頭辞の長さ以上の場合、接頭辞が適用されます。

次の例では、アナウンスされたすべての接頭辞を処理するように FRR を設定します。

FRRConfiguration CR の例

apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
  name: test
  namespace: frr-k8s-system
spec:
  bgp:
    routers:
    - asn: 64512
      neighbors:
      - address: 172.18.0.5
          asn: 64512
          port: 179
          toReceive:
            allowed:
              mode: all
# ...

bgp パラメーター
bgp パラメーターを使用すると、さまざまな BFD プロファイルを定義し、それらをネイバーに関連付けることができます。次の例では、BFD は、BGP セッションをバックアップし、FRR はリンク障害を検出できます。

FRRConfiguration CR の例

apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
  name: test
  namespace: frr-k8s-system
spec:
  bgp:
    routers:
    - asn: 64512
      neighbors:
      - address: 172.30.0.3
        asn: 64512
        port: 180
        bfdProfile: defaultprofile
    bfdProfiles:
      - name: defaultprofile
# ...

nodeSelector パラメーター
デフォルトでは、FRR-K8s は、デーモンが実行されているすべてのノードに設定を適用します。nodeSelector パラメーターを使用すると、設定を適用するノードを指定できます。以下に例を示します。

FRRConfiguration CR の例

apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
  name: test
  namespace: frr-k8s-system
spec:
  bgp:
    routers:
    - asn: 64512
  nodeSelector:
    labelSelector:
    foo: "bar"
# ...

インターフェイス パラメーター
インターフェイス パラメーターを使用すると、以下の設定例のように、番号なし BGP ピアリングを設定できます。

FRRConfiguration CR の例

apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
  name: test
  namespace: frr-k8s-system
spec:
  bgp:
    bfdProfiles:
    - echoMode: false
      name: simple
      passiveMode: false
    routers:
    - asn: 64512
      neighbors:
      - asn: 64512
        bfdProfile: simple
        disableMP: false
        interface: net10
        port: 179
        toAdvertise:
          allowed:
            mode: filtered
            prefixes:
            - 5.5.5.5/32
        toReceive:
          allowed:
            mode: filtered
      prefixes:
      - 5.5.5.5/32
# ...

  • neighbors.interface: 番号なしの BGP ピアリングを有効にします。
注記

インターフェイス パラメーターを使用するには、2 つの BGP ピア間でポイントツーポイントのレイヤ 2 接続を確立する必要があります。番号なし BGP ピアリングは、IPv4、IPv6、またはデュアルスタックで使用できますが、IPv6 RA (ルーターアドバタイズメント) を有効にする必要があります。各インターフェイスは 1 つの BGP 接続に制限されます。

このパラメーターを使用する場合、spec.bgp.routers.neighbors.address パラメーターに値を指定することはできません。

FRRConfiguration カスタムリソースのパラメーターは、次の表に記載されています。

Expand
表6.1 MetalLB FRRConfiguration カスタムリソース
パラメーター説明

spec.bgp.routers

array

FRR が設定するルーターを指定します (VRF ごとに 1 つ)。

spec.bgp.routers.asn

integer

セッションのローカル側で使用する AS 番号 (ASN)。

spec.bgp.routers.id

string

bgp ルーターの ID を指定します。

spec.bgp.routers.vrf

string

このルーターからセッションを確立するために使用するホスト VRF を指定します。

spec.bgp.routers.neighbors

array

BGP セッションを確立する近隣を指定します。

spec.bgp.routers.neighbors.asn

integer

セッションのリモート終了に使用する ASN を指定します。このパラメーターを使用する場合、spec.bgp.routers.neighbors.dynamicASN パラメーターに値を指定することはできません。

spec.bgp.routers.neighbors.dynamicASN

string

明示的に設定せずに、セッションのリモートエンドに使用する ASN を検出します。同じ ASN を持つネイバーの場合は internal を指定し、異なる ASN を持つネイバーの場合は external を指定します。このパラメーターを使用する場合、spec.bgp.routers.neighbors.asn パラメーターに値を指定することはできません。

spec.bgp.routers.neighbors.address

string

セッションを確立する IP アドレスを指定します。このパラメーターを使用する場合、spec.bgp.routers.neighbors.interface パラメーターに値を指定することはできません。

spec.bgp.routers.neighbors.interface

string

セッションを確立するときに使用するインターフェイス名を指定します。このパラメーターを使用して、番号なし BGP ピアリングを設定します。2 つの BGP ピア間には、ポイントツーポイントのレイヤー 2 接続が必要です。番号なし BGP ピアリングは、IPv4、IPv6、またはデュアルスタックで使用できますが、IPv6 RA (ルーターアドバタイズメント) を有効にする必要があります。各インターフェイスは 1 つの BGP 接続に制限されます。

spec.bgp.routers.neighbors.port

integer

セッションを確立するときにダイアリングするポートを指定します。デフォルト値は 179 です。

spec.bgp.routers.neighbors.password

string

BGP セッションの確立に使用するパスワードを指定します。PasswordPasswordSecret は同時に使用できません。

spec.bgp.routers.neighbors.passwordSecret

string

ネイバーの認証シークレットの名前を指定します。シークレットは "kubernetes.io/basic-auth" タイプであり、FRR-K8s デーモンと同じ namespace にある必要があります。キー "password" はパスワードをシークレットに保存します。PasswordPasswordSecret は同時に使用できません。

spec.bgp.routers.neighbors.holdTime

duration

RFC4271 に従って、要求された BGP ホールド時間を指定します。デフォルトは 180s です。

spec.bgp.routers.neighbors.keepaliveTime

duration

RFC4271 に従って、要求された BGP キープアライブ時間を指定します。デフォルトは 60s です。

spec.bgp.routers.neighbors.connectTime

duration

BGP が近隣に次に接続を試行するまで待機する時間を指定します。

spec.bgp.routers.neighbors.ebgpMultiHop

boolean

BGP ピアが複数ホップ離れているかどうかを示します。

spec.bgp.routers.neighbors.bfdProfile

string

BGP セッションに関連付けられた BFD セッションに使用する BFD プロファイルの名前を指定します。設定されていない場合、BFD セッションは設定されません。

spec.bgp.routers.neighbors.toAdvertise.allowed

array

近隣にアドバタイズする接頭辞のリストと、関連するプロパティーを表します。

spec.bgp.routers.neighbors.toAdvertise.allowed.prefixes

string array

近隣にアドバタイズする接頭辞のリストを指定します。このリストは、ルーターで定義した接頭辞と一致する必要があります。

spec.bgp.routers.neighbors.toAdvertise.allowed.mode

string

接頭辞を処理するときに使用するモードを指定します。接頭辞リスト内の接頭辞のみを許可するように filtered を設定できます。ルーターに設定されているすべての接頭辞を許可するには、all に設定します。

spec.bgp.routers.neighbors.toAdvertise.withLocalPref

array

アドバタイズされたローカルプリファレンスに関連付けられた接頭辞を指定します。ローカル設定に関連付けられた接頭辞を、アドバタイズが許可される接頭辞に指定する必要があります。

spec.bgp.routers.neighbors.toAdvertise.withLocalPref.prefixes

string array

ローカル設定に関連付けられた接頭辞を指定します。

spec.bgp.routers.neighbors.toAdvertise.withLocalPref.localPref

integer

接頭辞に関連付けられたローカル設定を指定します。

spec.bgp.routers.neighbors.toAdvertise.withCommunity

array

アドバタイズされた BGP コミュニティーに関連付けられた接頭辞を指定します。アドバタイズする接頭辞のリストに、ローカル設定に関連付けられた接頭辞を含める必要があります。

spec.bgp.routers.neighbors.toAdvertise.withCommunity.prefixes

string array

コミュニティーに関連付けられた接頭辞を指定します。

spec.bgp.routers.neighbors.toAdvertise.withCommunity.community

string

接頭辞に関連付けられたコミュニティーを指定します。

spec.bgp.routers.neighbors.toReceive

array

近隣から受信する接頭辞を指定します。

spec.bgp.routers.neighbors.toReceive.allowed

array

近隣から受信する情報を指定します。

spec.bgp.routers.neighbors.toReceive.allowed.prefixes

array

近隣から許可される接頭辞を指定します。

spec.bgp.routers.neighbors.toReceive.allowed.mode

string

接頭辞を処理するときに使用するモードを指定します。filtered に設定すると、prefixes リスト内の接頭辞のみが許可されます。all に設定すると、ルーターに設定されているすべての接頭辞が許可されます。

spec.bgp.routers.neighbors.disableMP

boolean

MP BGP を無効にして、IPv4 と IPv6 のルート交換を別々の BGP セッションに分離しないようにします。

spec.bgp.routers.prefixes

string array

このルーターインスタンスからアドバタイズするすべての接頭辞を指定します。

spec.bgp.bfdProfiles

array

ネイバーを設定する際に使用する BFD プロファイルのリストを指定します。

spec.bgp.bfdProfiles.name

string

設定の他の部分で参照される BFD プロファイルの名前。

spec.bgp.bfdProfiles.receiveInterval

integer

このシステムが制御パケットを受信できる最小間隔をミリ秒単位で指定します。デフォルトは 300ms です。

spec.bgp.bfdProfiles.transmitInterval

integer

このシステムが BFD 制御パケットを送信するために使用する、ジッターを除いた最小送信間隔をミリ秒単位で指定します。デフォルトは 300ms です。

spec.bgp.bfdProfiles.detectMultiplier

integer

パケット損失を判定するための検出乗数を設定します。接続損失検出タイマーを決定するには、リモート送信間隔にこの値を乗算します。

spec.bgp.bfdProfiles.echoInterval

integer

このシステムが処理できる最小のエコー受信送信間隔をミリ秒単位で設定します。デフォルトは 50ms です。

spec.bgp.bfdProfiles.echoMode

boolean

エコー送信モードを有効または無効にします。このモードはデフォルトで無効になっており、マルチホップ設定ではサポートされていません。

spec.bgp.bfdProfiles.passiveMode

boolean

セッションを passive としてマークします。passive セッションでは接続を開始せず、応答を開始する前にピアからの制御パケットを待機します。

spec.bgp.bfdProfiles.MinimumTtl

integer

マルチホップセッションのみ。着信 BFD 制御パケットの最小予想 TTL を設定します。

spec.nodeSelector

string

この設定の適用を試みるノードを制限します。指定した場合、指定されたセレクターに一致するラベルが割り当てられたノードのみが設定の適用を試みます。指定されていない場合は、すべてのノードがこの設定を適用しようとします。

status

string

FRRConfiguration の監視状態を定義します。

6.2. BGP ルーティングの有効化

クラスター管理者は、クラスターに対して OVN-Kubernetes Border Gateway Protocol (BGP) ルーティングサポートを有効にできます。

6.2.1. Border Gateway Protocol (BGP) ルーティングの有効化

クラスター管理者は、ベアメタルインフラストラクチャー上のクラスターに対して Border Gateway Protocol (BGP) ルーティングサポートを有効にできます。

MetalLB Operator と組み合わせて BGP ルーティングを使用している場合は、必要な BGP ルーティングサポートが自動的に有効になります。BGP ルーティングサポートを手動で有効にする必要はありません。

6.2.1.1. BGP ルーティングサポートの有効化

クラスター管理者は、クラスターに対して BGP ルーティングサポートを有効にできます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにログインしている。
  • クラスターは、互換性のあるインフラストラクチャーにインストールされている。

手順

  • 次のコマンドを入力して、動的ルーティングプロバイダーを有効にします。

    $ oc patch Network.operator.openshift.io/cluster --type=merge -p '{
      "spec": {
        "additionalRoutingCapabilities": {
          "providers": ["FRR"]
        }
      }
    }'

6.3. BGP ルーティングの無効化

クラスター管理者は、クラスターに対して OVN-Kubernetes Border Gateway Protocol (BGP) ルーティングサポートを有効にできます。

6.3.1. Border Gateway Protocol (BGP) ルーティングの無効化

クラスター管理者は、ベアメタルインフラストラクチャー上のクラスターに対して Border Gateway Protocol (BGP) ルーティングサポートを無効にできます。

6.3.1.1. BGP ルーティングサポートを無効にする

クラスター管理者は、クラスターに対して BGP ルーティングサポートを無効にできます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにログインしている。
  • クラスターは、互換性のあるインフラストラクチャーにインストールされている。

手順

  • 次のコマンドを入力して、動的ルーティングを無効にします。

    $ oc patch Network.operator.openshift.io/cluster --type=merge -p '{
      "spec": { "additionalRoutingCapabilities": null }
    }'

6.4. FRR-K8s リソースの移行

OpenShift Container Platform 4.17 以前のリリースの metallb-system namespace にある、ユーザーが作成したすべての FRR-K8s カスタムリソース (CR) は、openshift-frr-k8s namespace に移行する必要があります。クラスター管理者は、この手順のステップを完了して FRR-K8s カスタムリソースを移行します。

6.4.1. FRR-K8s リソースの移行

FRR-K8s FRRConfiguration カスタムリソースを、metallb-system namespace から openshift-frr-k8s namespace に移行できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにログインしている。

手順

Metal LB Operator がデプロイされた OpenShift Container Platform の以前のバージョンからアップグレードする場合は、カスタム FRRConfiguration 設定を metallb-system namespace から openshift-frr-k8s namespace に手動で移行する必要があります。これらの CR を移動するには、次のコマンドを入力します。

  1. openshift-frr-k8s namespace を作成するには、次のコマンドを入力します。

    $ oc create namespace openshift-frr-k8s
  2. 移行を自動化するには、次の内容のシェルスクリプトを migrate.sh という名前で作成します。

    #!/bin/bash
    OLD_NAMESPACE="metallb-system"
    NEW_NAMESPACE="openshift-frr-k8s"
    FILTER_OUT="metallb-"
    oc get frrconfigurations.frrk8s.metallb.io -n "${OLD_NAMESPACE}" -o json |\
      jq -r '.items[] | select(.metadata.name | test("'"${FILTER_OUT}"'") | not)' |\
      jq -r '.metadata.namespace = "'"${NEW_NAMESPACE}"'"' |\
      oc create -f -
  3. 移行を実行するには、次のコマンドを実行します。

    $ bash migrate.sh

検証

  • 次のコマンドを実行して、移行が成功したことを確認します。

    $ oc get frrconfigurations.frrk8s.metallb.io -n openshift-frr-k8s

移行が完了すると、metallb-system namespace から FRRConfiguration カスタムリソースを削除できます。

第7章 ルートアドバタイズメント

7.1. ルートアドバタイズメントについて

ネットワーク管理を簡素化し、フェイルオーバーの可視性を向上させるために、ルートアドバタイズメントを使用して、クラスターとプロバイダーネットワーク間で Pod および EgressIP ルートを共有できます。この機能を使用するには、OVN-Kubernetes プラグインと BGP(Border Gateway Protocol) プロバイダーが必要です。

詳細は、BGP ルーティングについて を参照してください。

7.1.1. Border Gateway Protocol を使用したクラスターネットワークルートのアドバタイズ

ルーティングを簡素化し、手動でのルート管理なしにフェイルオーバーの可視性を向上させるには、ルートアドバタイズメントを有効にすることができます。ルートアドバタイズメントを使用すると、クラスターとプロバイダーネットワーク間のデフォルトルートおよびユーザー定義のネットワークルート (EgressIP を含む) をアドバタイズできます。

ルートアドバタイズメントを有効にすると、デフォルトの Pod ネットワークおよびユーザー定義ネットワークのネットワークルートをプロバイダーネットワークにアドバタイズできます (EgressIP を含む)。また、プロバイダーネットワークからデフォルトの Pod ネットワークおよび CUDN にルートをインポートすることもできます。これにより、ルーティングが簡素化されるとともに、フェイルオーバー時の可視性が向上し、手動によるルート管理が不要になります。

プロバイダーネットワークからは、デフォルトの Pod ネットワークおよびユーザー定義ネットワークからアドバタイズされた IP アドレスに直接アクセスでき、その逆も同様です。

たとえば、デフォルトの Pod ネットワークにルートをインポートできるため、各ノードでルートを手動で設定する必要がなくなります。以前は、routingViaHost パラメーターを true に設定し、同様の設定に近づけるために各ノードでルートを手動で設定していた可能性があります。ルートアドバタイズメントを使用すると、routingViaHost パラメーターを false に設定することで、このタスクをシームレスに実行できます。

クラスターの Network カスタムリソース CR で routingViaHost パラメーターを true に設定することもできますが、その場合は同様の設定をシミュレートするために各ノードでルートを手動で設定する必要があります。ルートアドバタイズを有効にすると、ノードごとにルートを手動で設定しなくても、Network CR で routingViaHost=false を設定できます。

プロバイダーネットワーク上のルートリフレクタがサポートされており、大規模ネットワーク上でルートをアドバタイズするために必要な BGP 接続の数を削減できます。

ルートアドバタイズメントを有効にして EgressIP を使用する場合、レイヤー 3 プロバイダーネットワークは EgressIP フェイルオーバーを認識します。つまり、これまではレイヤー 2 プロバイダーネットワークのみが認識していたため、すべての Egress ノードが同じレイヤー 2 セグメント上にある必要がありましたが、異なるレイヤー 2 セグメント上に EgressIP をホストするクラスターノードを配置できるようになります。

7.1.1.1. サポートされているプラットフォーム

ベアメタルインフラストラクチャータイプでは、Border Gateway Protocol (BGP) を使用したルートアドバタイズメントがサポートされています。

7.1.1.2. インフラストラクチャーの要件

ルートアドバタイズメントを使用するには、ネットワークインフラストラクチャーに BGP を設定する必要があります。ネットワークインフラストラクチャーの停止や設定ミスにより、クラスターネットワークが中断される可能性があります。

7.1.1.3. 他のネットワーク機能との互換性

ルートアドバタイズメントは、次の OpenShift Container Platform ネットワーク機能をサポートします。

複数の外部ゲートウェイ (MEG)
この機能で MEG はサポートされていません。
EgressIP

EgressIP の使用とアドバタイズメントがサポートされます。Egress IP アドレスが存在するノードは、EgressIP をアドバタイズします。Egress IP アドレスは、Egress ノードと同じレイヤー 2 ネットワークサブネット上にある必要があります。以下の制限が適用されます。

  • レイヤー 2 モードで動作するユーザー定義ネットワーク (CUDN) からの EgressIP のアドバタイズメントはサポートされていません。
  • プライマリーネットワークインターフェイスに割り当てられた Egress IP アドレスと、追加のネットワークインターフェイスに割り当てられた Egress IP アドレスの両方を持つネットワークの EgressIP をアドバタイズすることは現実的ではありません。すべての EgressIP は、選択された FRRConfiguration インスタンスのすべての BGP セッションでアドバタイズされます。これは、セッションが EgressIP が割り当てられている同じインターフェイス上で確立されているかどうかかかわらず実行されるため、不要なアドバタイズが発生する可能性があります。
サービス
MetalLB Operator と連携して、プロバイダーネットワークにサービスをアドバタイズします。
Egress サービス
完全サポート
Egress ファイアウォール
完全サポート
Egress QoS
完全サポート
ネットワークポリシー
完全サポート
Pod の直接 Ingress
デフォルトのクラスターネットワークとクラスターユーザー定義 (CUDN) ネットワークを完全にサポートします。
7.1.1.4. MetalLB Operator の使用に関する考慮事項

MetalLB Operator は、クラスターへのアドオンとしてインストールされます。MetalLB Operator をデプロイすると、、追加のルーティング機能プロバイダーとして FRR-K8 が自動的に有効になります。この機能と MetalLB Operator は、同じ FRR-K8s デプロイメントを使用します。

7.1.1.5. クラスターユーザー定義ネットワーク (CUDN) の命名に関する考慮事項

FRRConfiguration CR で VRF デバイスを参照する場合、VRF 名は 15 文字以下の VRF 名の CUDN 名と同じになります。CUDN 名から VRF 名を推測できるように、15 文字以下の VRF 名を使用することが推奨されます。

7.1.1.6. BGP ルーティングカスタムリソース

次のカスタムリソース (CR) は、BGP によるルートアドバタイズメントを設定するために使用されます。

RouteAdvertisements
この CR は、BGP ルーティングのアドバタイズメントを定義します。この CR から、OVN-Kubernetes コントローラーは、クラスターネットワークルートをアドバタイズするように FRR デーモンを設定する FRRConfiguration オブジェクトを生成します。これは、クラスタースコープの CR です。
FRRConfiguration
この CR は、BGP ピアを定義し、プロバイダーネットワークからクラスターネットワークへのルートインポートを設定するために使用されます。BGP ピアを設定するためには、RouteAdvertisements オブジェクトを適用する前に、まず少なくとも 1 つの FRRConfiguration オブジェクトを定義する必要があります。この CR には namespace があります。
7.1.1.7. OVN-Kubernetes コントローラーによる FRRConfiguration オブジェクトの生成

FRRConfiguration オブジェクトは、各ノードに適用される、アドバタイズされた適切な接頭辞を持つ RouteAdvertisements CR によって選択されたネットワークおよびノードごとに生成されます。OVN-Kubernetes コントローラーは、RouteAdvertisements CR によって選択されたノードが、RouteAdvertisements CR によって選択された FRR 設定に基づき選択されたノードのサブセットであるかどうかを確認します。

RouteAdvertisement CR から生成される FRRConfiguration オブジェクトでは、受信する接頭辞のフィルタリングや選択は考慮されません。他の FRRConfiguration オブジェクトで受信する接頭辞を設定してください。OVN-Kubernetes は、VRF から適切なネットワークにルートをインポートします。

7.1.1.8. Cluster Network Operator の設定

Cluster Network Operator (CNO) API は、ルートアドバタイズメントを設定するためのいくつかのフィールドを公開します。

  • spec.additionalRoutingCapabilities.providers: ルートをアドバタイズするために必要な追加のルーティングプロバイダーを指定します。サポートされている値は FRR のみで、これによりクラスターの FRR-K8S デーモンのデプロイメントが有効になります。有効にすると、FRR-K8S デーモンがすべてのノードにデプロイされます。
  • spec.defaultNetwork.ovnKubernetesConfig.routeAdvertisements: デフォルトのクラスターネットワークと CUDN ネットワークのルートアドバタイズメントを有効にします。この機能を有効にするには、spec.additionalRoutingCapabilities フィールドを FRR に設定する必要があります。

7.1.2. RouteAdvertisements オブジェクトの設定

クラスターネットワークと EgressIP アドレスを外部ルーターにアドバタイズする方法を制御するには、クラスタースコープの RouteAdvertisements オブジェクトを設定してネットワークを指定し、環境に適したノードとルーティングターゲットを選択します。

次のプロパティーを使用して、クラスタースコープの RouteAdvertisements オブジェクトを定義できます。

RouteAdvertisements カスタムリソース (CR) のフィールドについては、次の表で説明しています。

Expand
表7.1 RouteAdvertisements オブジェクト
フィールド説明

metadata.name

string

RouteAdvertisements オブジェクトの名前を指定します。

advertisements

array

アドバタイズする異なるタイプのネットワークを含めることができる配列を指定します。"PodNetwork""EgressIP" の値のみがサポートされます。

frrConfigurationSelector

object

OVN-Kubernetes ドリブンの FRRConfiguration CR がどの FRRConfiguration CR に基づいているかを判断します。

networkSelector

object

デフォルトのクラスターネットワークとクラスターユーザー定義ネットワーク (CUDN) の間でアドバタイズするネットワークを指定します。

nodeSelector

object

アドバタイズメントを選択したノードに制限します。advertisements="PodNetwork" を選択した場合は、すべてのノードを選択する必要があります。advertisements="EgressIP" を選択した場合は、選択したノードに割り当てられた Egress IP アドレスのみがアドバタイズされます。

targetVRF

string

どのルーターでルートをアドバタイズするかを決定します。ルートは、選択された FRRConfiguration CR で指定されたとおりに、この Virtual Routing and Forwarding (VRF) ターゲットに関連付けられたルーター上でアドバタイズされます。省略した場合、デフォルトの VRF がターゲットとして使用されます。auto を指定すると、ネットワーク名と同じ名前の VRF がターゲットとして使用されます。

7.1.3. BGP により Pod IP アドレスをアドバタイズする例

クラスターに Border Gateway Protocol (BGP) を実装するには、以下の例を使用して、Pod の IP アドレスと出力 IP アドレスのルートアドバタイズメントを設定できます。例としては、デフォルトのクラスターネットワーク、ユーザー定義ネットワーク、および VRF-lite 設計の設定などが挙げられます。

次の例では、Border Gateway Protocol (BGP) を使用して Pod IP アドレスと EgressIP をアドバタイズするためのいくつかの設定について説明します。外部ネットワークボーダールーターの IP アドレスは 172.18.0.5 です。これらの設定では、クラスターネットワーク上のすべてのノードにルートを中継できる外部ルートリフレクターが設定されていることを前提としています。

7.1.3.1. デフォルトのクラスターネットワークのアドバタイズ

このシナリオでは、デフォルトのクラスターネットワークが外部ネットワークに公開され、Pod の IP アドレスと EgressIP がプロバイダーネットワークにアドバタイズされます。

このシナリオは、次の FRRConfiguration オブジェクトに依存します。

FRRConfiguration CR

apiVersion: k8s.ovn.org/v1
kind: RouteAdvertisements
metadata:
  name: default
spec:
  advertisements:
  - PodNetwork
  - EgressIP
  networkSelectors:
  - networkSelectionType: DefaultNetwork
  frrConfigurationSelector:
    matchLabels:
      routeAdvertisements: receive-all
  nodeSelector: {}

OVN-Kubernetes コントローラーがこの RouteAdvertisements CR を認識すると、選択された FRRConfiguration オブジェクトに基づき追加のオブジェクトを生成します。生成された追加オブジェクトは、デフォルトのクラスターネットワークのルートをアドバタイズするように FRR デーモンを設定します。

OVN-Kubernetes によって生成された FRRConfiguration CR の例

apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
  name: ovnk-generated-abcdef
  namespace: openshift-frr-k8s
spec:
  bgp:
    routers:
    - asn: 64512
      neighbors:
        - address: 172.18.0.5
          asn: 64512
          toReceive:
            allowed:
              mode: filtered
          toAdvertise:
            allowed:
              prefixes:
              - <default_network_host_subnet>
      prefixes:
      - <default_network_host_subnet>
  nodeSelector:
    matchLabels:
      kubernetes.io/hostname: ovn-worker

生成された FRRConfiguration オブジェクトの例では、<default_network_host_subnet> は、プロバイダーネットワークにアドバタイズされるデフォルトのクラスターネットワークのサブネットです。

7.1.3.2. BGP 経由でクラスターのユーザー定義ネットワークから Pod IP をアドバタイズする

このシナリオでは、blue クラスターユーザー定義ネットワーク (CUDN) が外部ネットワークに公開されるため、ネットワークの Pod IP アドレスと EgressIP がプロバイダーネットワークにアドバタイズされます。

このシナリオは、次の FRRConfiguration オブジェクトに依存します。

FRRConfiguration CR

apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
  name: receive-all
  namespace: openshift-frr-k8s
  labels:
    routeAdvertisements: receive-all
spec:
  bgp:
    routers:
    - asn: 64512
      neighbors:
      - address: 172.18.0.5
        asn: 64512
        disableMP: true
        toReceive:
          allowed:
            mode: all

この FRRConfiguration オブジェクトを使用すると、ルートは近隣の 172.18.0.5 からデフォルトの VRF にインポートされ、デフォルトのクラスターネットワークで使用できるようになります。

次の図に示すように、CUDN はデフォルトの VRF を介してアドバタイズされます。

BGP 経由でクラスターのユーザー定義ネットワークから Pod IP をアドバタイズする
red CUDN
  • red という名前の CUDN に関連付けられている red という名前の VRF
  • 10.0.0.0/24 のサブネット
blue CUDN
  • blue という名前の CUDN に関連付けられている blue という名前の VRF
  • 10.0.1.0/24 のサブネット

この設定では、2 つの異なる CUDN が定義されます。red ネットワークは 10.0.0.0/24 サブネットをカバーし、blue ネットワークは 10.0.1.0/24 サブネットをカバーします。red および blue ネットワークには、export: true というラベルが付けられています。

次の RouteAdvertisements CR は、red および blue テナントの設定について説明します。

red および blue テナントの RouteAdvertisements CR

apiVersion: k8s.ovn.org/v1
kind: RouteAdvertisements
metadata:
  name: advertise-cudns
spec:
  advertisements:
  - PodNetwork
  - EgressIP
  networkSelectors:
  - networkSelectionType: ClusterUserDefinedNetworks
    clusterUserDefinedNetworkSelector:
      networkSelector:
        matchLabels:
          export: "true"
  frrConfigurationSelector:
    matchLabels:
      routeAdvertisements: receive-all
  nodeSelector: {}

OVN-Kubernetes コントローラーがこの RouteAdvertisements CR を認識すると、選択された FRRConfiguration オブジェクトに基づき追加のオブジェクトを生成します。生成された追加オブジェクトは、ルートをアドバタイズするように FRR デーモンを設定します。以下は、そのような設定オブジェクトの一例であり、選択されたノードとネットワークに応じて作成される FRRConfiguration オブジェクトの数が表示されます。

OVN-Kubernetes によって生成された FRRConfiguration CR の例

apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
  name: ovnk-generated-abcdef
  namespace: openshift-frr-k8s
spec:
  bgp:
    routers:
    - asn: 64512
      vrf: blue
      imports:
      - vrf: default
    - asn: 64512
      neighbors:
        - address: 172.18.0.5
          asn: 64512
          toReceive:
            allowed:
              mode: filtered
          toAdvertise:
            allowed:
              prefixes:
              - 10.0.1.0/24
      prefixes:
      - 10.0.1.0/24
      imports:
      - vrf: blue
  nodeSelector:
    matchLabels:
      kubernetes.io/hostname: ovn-worker

生成された FRRConfiguration オブジェクトは、blue ネットワークに属するサブネット 10.0.1.0/24 をデフォルトの VRF にインポートし、近隣の 172.18.0.5 にアドバタイズするように設定します。RouteAdvertisements CR によって選択された各ネットワークおよびノードに対して、各ノードに適用される適切な接頭辞を持つ FRRConfiguration オブジェクトが生成されます。

targetVRF フィールドを省略すると、ルートはデフォルトの VRF 経由でリークされ、アドバタイズされます。さらに、初期 FRRConfiguration オブジェクトの定義後にデフォルト VRF にインポートされたルートも、blue VRF にインポートされます。

このシナリオでは、VLAN インターフェイスは、blue ネットワークに関連付けられた VRF デバイスにアタッチされます。このセットアップは VRF lite 設計を提供します。FRR-K8S は、blue ネットワーク VRF/VLAN リンク上の対応する BGP セッションを介してのみ、blue ネットワークをネクストホップの Provide Edge (PE) ルーターにアドバタイズするために使用されます。red テナントは同じ設定を使用します。blue および red ネットワークには、export: true というラベルが付けられています。

重要

このシナリオでは、EgressIP の使用はサポートされていません。

次の図はこの設定を示しています。

クラスターユーザー定義ネットワークから BGP 経由で VPN を使用して Pod IP をアドバタイズする
red CUDN
  • red という名前の CUDN に関連付けられている red という名前の VRF
  • VRF デバイスにアタッチされ、外部 PE ルーターに接続された VLAN インターフェイス
  • 割り当てられたサブネット 10.0.2.0/24
blue CUDN
  • blue という名前の CUDN に関連付けられている blue という名前の VRF
  • VRF デバイスにアタッチされ、外部 PE ルーターに接続された VLAN インターフェイス
  • 割り当てられたサブネット 10.0.1.0/24
注記

このアプローチは、OVN-Kubernetes ネットワークプラグインの ovnKubernetesConfig.gatewayConfig 仕様で routingViaHost=true を設定した場合にのみ使用できます。

次の設定では、追加の FRRConfiguration CR によって、blue および red の VLAN 上の PE ルーターとのピアリングが設定されます。

FRRConfiguration CR を BGP VPN セットアップ用に手動で設定しました

apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
  name: vpn-blue-red
  namespace: openshift-frr-k8s
  labels:
    routeAdvertisements: vpn-blue-red
spec:
  bgp:
    routers:
    - asn: 64512
      vrf: blue
      neighbors:
      - address: 182.18.0.5
        asn: 64512
        toReceive:
          allowed:
            mode: filtered
    - asn: 64512
      vrf: red
      neighbors:
      - address: 192.18.0.5
        asn: 64512
        toReceive:
          allowed:
            mode: filtered

次の RouteAdvertisements CR は、blue および red テナントの設定を記述しています。

blue および red テナントの RouteAdvertisements CR

apiVersion: k8s.ovn.org/v1
kind: RouteAdvertisements
metadata:
  name: advertise-vrf-lite
spec:
  targetVRF: auto
  advertisements:
  - "PodNetwork"
  nodeSelector: {}
  frrConfigurationSelector:
    matchLabels:
      routeAdvertisements: vpn-blue-red
  networkSelectors:
  - networkSelectionType: ClusterUserDefinedNetworks
    clusterUserDefinedNetworkSelector:
      networkSelector:
        matchLabels:
          export: "true"

RouteAdvertisements CR では、選択された個々のネットワークに対応する VRF デバイス内でアドバタイズメントが行われるように、targetVRFauto に設定されています。このシナリオでは、blue の Pod サブネットは blue VRF デバイス経由でアドバタイズされ、red の Pod サブネットは red VRF デバイス経由でアドバタイズされます。さらに、各 BGP セッションは、初期 FRRConfiguration オブジェクトで定義されているとおり、対応する CUDN VRF にのみルートをインポートします。

OVN-Kubernetes コントローラーがこの RouteAdvertisements CR を認識すると、選択された FRRConfiguration オブジェクトに基づき追加のオブジェクトを生成します。生成された追加オブジェクトは、blue および red テナントのルートをアドバタイズするように FRR デーモンを設定します。

OVN-Kubernetes によって生成された blue および red テナント用の FRRConfiguration CR の例

apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
  name: ovnk-generated-abcde
  namespace: openshift-frr-k8s
spec:
  bgp:
    routers:
    - asn: 64512
      neighbors:
      - address: 182.18.0.5
        asn: 64512
        toReceive:
          allowed:
            mode: filtered
        toAdvertise:
          allowed:
            prefixes:
            - 10.0.1.0/24
      vrf: blue
      prefixes:
        - 10.0.1.0/24
    - asn: 64512
      neighbors:
      - address: 192.18.0.5
        asn: 64512
        toReceive:
          allowed:
            mode: filtered
        toAdvertise:
          allowed:
            prefixes:
            - 10.0.2.0/24
      vrf: red
      prefixes:
         - 10.0.2.0/24
  nodeSelector:
     matchLabels:
        kubernetes.io/hostname: ovn-worker

このシナリオでは、受信するルートのフィルタリングまたは選択は、ピアリング関係を定義する FRRConfiguration CR で行う必要があります。

7.2. ルートアドバタイズメントの有効化

クラスターのネットワーク到達性とフェイルオーバーの可視性を向上させるには、Pod および出力 IP アドレスのルートアドバタイズメントを有効にすることができます。この設定には OVN-Kubernetes ネットワークプラグインが必要で、クラスターが外部プロバイダーネットワークとルートを共有できるようになります。

クラスター管理者は、クラスターの追加のルートアドバタイズメントを設定できます。OVN-Kubernetes ネットワークプラグインを使用する必要があります。

7.2.1. ルートアドバタイズメントの有効化

ネットワークの到達性とフェイルオーバーの可視性を向上させるために、クラスターに追加のルーティングサポートを有効にすることができます。ルートアドバタイズメントを有効にすることで、環境内のネットワークトラフィックを管理できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにログインしている。
  • クラスターは、互換性のあるインフラストラクチャーにインストールされている。

手順

  • 次のコマンドを入力して、ルーティングプロバイダーと追加のルートアドバタイズメントを有効にします。

    $ oc patch Network.operator.openshift.io cluster --type=merge \
      -p='{
        "spec": {
          "additionalRoutingCapabilities": {
            "providers": ["FRR"]
            },
            "defaultNetwork": {
              "ovnKubernetesConfig": {
                "routeAdvertisements": "Enabled"
        }}}}'

7.3. ルートアドバタイズメントの無効化

プロバイダーネットワークへのクラスターネットワークルートと EgressIP アドレスのブロードキャストを停止するには、ルートアドバタイズメントを無効にできます。この機能を無効にすると、既存のネットワークインフラストラクチャーを維持したまま、自動生成されたルーティング設定が削除されます。

7.3.1. ルートアドバタイズメントの無効化

クラスターがネットワークに追加のルートをアドバタイズしないようにするには、ネットワークオペレーターの設定でルートアドバタイズ機能を無効にする必要があります。ルーティング広告を無効にすることで、ネットワークトラフィックを管理し、環境内のセキュリティーを維持できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにログインしている。
  • クラスターは、互換性のあるインフラストラクチャーにインストールされている。

手順

  • 次のコマンドを入力して、追加のルーティングサポートを無効にします。

    $ oc patch network.operator cluster -p '{
      "spec": {
        "defaultNetwork": {
          "ovnKubernetesConfig": {
            "routeAdvertisements": "Disabled"
          }
        }
      }
    }'

7.4. ルートアドバタイズメントのセットアップ例

ベアメタルインフラストラクチャー上でルートリフレクションの設定を実装する方法を学ぶには、このサンプル設定を参照してください。この例では、必要なフィーチャーゲートを有効にし、オブジェクトを設定して Pod と送信側の IP ルートをアドバタイズする方法を示します。

クラスター管理者は、クラスターに対して次のルートアドバタイズメントのセットアップ例を設定できます。この設定は、ルートアドバタイズメントの設定方法を示すサンプルとして使用しています。

7.4.1. ルートアドバタイズメントのセットアップ例

サンプル設定を使用してクラスターのルートアドバタイズメントを設定することで、BGP(Border Gateway Protocol) ルーティングを実装できます。この設定は、ベアメタルインフラストラクチャー上でルートリフレクションを設定して、Pod と送信側の IP ルートを共有する方法を示しています。

クラスター管理者は、クラスターに対して Border Gateway Protocol (BGP) ルーティングサポートを有効にできます。この設定では、フルメッシュセットアップではなくルートリフレクションを使用します。

注記

BGP ルーティングは、ベアメタルインフラストラクチャーでのみサポートされます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてクラスターにログインしている。
  • クラスターは、ベアメタルインフラストラクチャーにインストールされている。
  • FRR デーモンコンテナーを実行する予定のクラスターにアクセスできるベアメタルシステムがある。

手順

  1. 次のコマンドを実行して、RouteAdvertisements フィーチャーゲートが有効になっていることを確認します。

    $ oc get featuregate -oyaml | grep -i routeadvertisement

    出力例

          - name: RouteAdvertisements

  2. 次のコマンドを実行して、Cluster Network Operator (CNO) を設定します。

    $ oc patch Network.operator.openshift.io cluster --type=merge \
      -p='
        {"spec":{
          "additionalRoutingCapabilities": {
            "providers": ["FRR"]},
            "defaultNetwork":{"ovnKubernetesConfig"{
              "routeAdvertisements":"Enabled"
              }}}}'

    CNO がすべてのノードを再起動するために数分かかる場合があります。

  3. 次のコマンドを実行して、ノードの IP アドレスを取得します。

    $ oc get node -owide

    出力例

    NAME                                       STATUS   ROLES                  AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                                                KERNEL-VERSION                 CONTAINER-RUNTIME
    master-0                                   Ready    control-plane,master   27h   v1.31.3   192.168.111.20   <none>        Red Hat Enterprise Linux CoreOS 418.94.202501062026-0   5.14.0-427.50.1.el9_4.x86_64   cri-o://1.31.4-2.rhaos4.18.git33d7598.el9
    master-1                                   Ready    control-plane,master   27h   v1.31.3   192.168.111.21   <none>        Red Hat Enterprise Linux CoreOS 418.94.202501062026-0   5.14.0-427.50.1.el9_4.x86_64   cri-o://1.31.4-2.rhaos4.18.git33d7598.el9
    master-2                                   Ready    control-plane,master   27h   v1.31.3   192.168.111.22   <none>        Red Hat Enterprise Linux CoreOS 418.94.202501062026-0   5.14.0-427.50.1.el9_4.x86_64   cri-o://1.31.4-2.rhaos4.18.git33d7598.el9
    worker-0                                   Ready    worker                 27h   v1.31.3   192.168.111.23   <none>        Red Hat Enterprise Linux CoreOS 418.94.202501062026-0   5.14.0-427.50.1.el9_4.x86_64   cri-o://1.31.4-2.rhaos4.18.git33d7598.el9
    worker-1                                   Ready    worker                 27h   v1.31.3   192.168.111.24   <none>        Red Hat Enterprise Linux CoreOS 418.94.202501062026-0   5.14.0-427.50.1.el9_4.x86_64   cri-o://1.31.4-2.rhaos4.18.git33d7598.el9
    worker-2                                   Ready    worker                 27h   v1.31.3   192.168.111.25   <none>        Red Hat Enterprise Linux CoreOS 418.94.202501062026-0   5.14.0-427.50.1.el9_4.x86_64   cri-o://1.31.4-2.rhaos4.18.git33d7598.el9

  4. 次のコマンドを実行して、各ノードのデフォルトの Pod ネットワークを取得します。

    $ oc get node <node_name> -o=jsonpath={.metadata.annotations.k8s\\.ovn\\.org/node-subnets}

    出力例

    {"default":["10.129.0.0/23"],"ns1.udn-network-primary-layer3":["10.150.6.0/24"]}

  5. 次のコマンドを実行して、ベアメタルハイパーバイザーで、使用する外部 FRR コンテナーの IP アドレスを取得します。

    $ ip -j -d route get <a cluster node's IP> | jq -r '.[] | .dev' | xargs ip -d -j address show | jq -r '.[] | .addr_info[0].local'
  6. 次の例に示すように、各ノードの IP アドレスが含まれる FRR 用の frr.conf ファイルを作成します。

    frr.conf 設定ファイルの例

    router bgp 64512
     no bgp default ipv4-unicast
     no bgp default ipv6-unicast
     no bgp network import-check
     neighbor 192.168.111.20 remote-as 64512
     neighbor 192.168.111.20 route-reflector-client
     neighbor 192.168.111.21 remote-as 64512
     neighbor 192.168.111.21 route-reflector-client
     neighbor 192.168.111.22 remote-as 64512
     neighbor 192.168.111.22 route-reflector-client
     neighbor 192.168.111.40 remote-as 64512
     neighbor 192.168.111.40 route-reflector-client
     neighbor 192.168.111.47 remote-as 64512
     neighbor 192.168.111.47 route-reflector-client
     neighbor 192.168.111.23 remote-as 64512
     neighbor 192.168.111.23 route-reflector-client
     neighbor 192.168.111.24 remote-as 64512
     neighbor 192.168.111.24 route-reflector-client
     neighbor 192.168.111.25 remote-as 64512
     neighbor 192.168.111.25 route-reflector-client
     address-family ipv4 unicast
      network 192.168.1.0/24
      network 192.169.1.1/32
     exit-address-family
     address-family ipv4 unicast
      neighbor 192.168.111.20 activate
      neighbor 192.168.111.20 next-hop-self
      neighbor 192.168.111.21 activate
      neighbor 192.168.111.21 next-hop-self
      neighbor 192.168.111.22 activate
      neighbor 192.168.111.22 next-hop-self
      neighbor 192.168.111.40 activate
      neighbor 192.168.111.40 next-hop-self
      neighbor 192.168.111.47 activate
      neighbor 192.168.111.47 next-hop-self
      neighbor 192.168.111.23 activate
      neighbor 192.168.111.23 next-hop-self
      neighbor 192.168.111.24 activate
      neighbor 192.168.111.24 next-hop-self
      neighbor 192.168.111.25 activate
      neighbor 192.168.111.25 next-hop-self
     exit-address-family
     neighbor  remote-as 64512
     neighbor  route-reflector-client
     address-family ipv6 unicast
      network 2001:db8::/128
     exit-address-family
     address-family ipv6 unicast
      neighbor  activate
      neighbor  next-hop-self
     exit-address-family

  7. 次の内容が含まれるファイルを、daemons という名前で作成します。

    daemons 設定ファイルの例

    # This file tells the frr package which daemons to start.
    #
    # Sample configurations for these daemons can be found in
    # /usr/share/doc/frr/examples/.
    #
    # ATTENTION:
    #
    # When activating a daemon for the first time, a config file, even if it is
    # empty, has to be present *and* be owned by the user and group "frr", else
    # the daemon will not be started by /etc/init.d/frr. The permissions should
    # be u=rw,g=r,o=.
    # When using "vtysh" such a config file is also needed. It should be owned by
    # group "frrvty" and set to ug=rw,o= though. Check /etc/pam.d/frr, too.
    #
    # The watchfrr and zebra daemons are always started.
    #
    bgpd=yes
    ospfd=no
    ospf6d=no
    ripd=no
    ripngd=no
    isisd=no
    pimd=no
    ldpd=no
    nhrpd=no
    eigrpd=no
    babeld=no
    sharpd=no
    pbrd=no
    bfdd=yes
    fabricd=no
    vrrpd=no
    
    #
    # If this option is set the /etc/init.d/frr script automatically loads
    # the config via "vtysh -b" when the servers are started.
    # Check /etc/pam.d/frr if you intend to use "vtysh"!
    #
    vtysh_enable=yes
    zebra_options="  -A 127.0.0.1 -s 90000000"
    bgpd_options="   -A 127.0.0.1"
    ospfd_options="  -A 127.0.0.1"
    ospf6d_options=" -A ::1"
    ripd_options="   -A 127.0.0.1"
    ripngd_options=" -A ::1"
    isisd_options="  -A 127.0.0.1"
    pimd_options="   -A 127.0.0.1"
    ldpd_options="   -A 127.0.0.1"
    nhrpd_options="  -A 127.0.0.1"
    eigrpd_options=" -A 127.0.0.1"
    babeld_options=" -A 127.0.0.1"
    sharpd_options=" -A 127.0.0.1"
    pbrd_options="   -A 127.0.0.1"
    staticd_options="-A 127.0.0.1"
    bfdd_options="   -A 127.0.0.1"
    fabricd_options="-A 127.0.0.1"
    vrrpd_options="  -A 127.0.0.1"
    
    # configuration profile
    #
    #frr_profile="traditional"
    #frr_profile="datacenter"
    
    #
    # This is the maximum number of FD's that will be available.
    # Upon startup this is read by the control files and ulimit
    # is called. Uncomment and use a reasonable value for your
    # setup if you are expecting a large number of peers in
    # say BGP.
    #MAX_FDS=1024
    
    # The list of daemons to watch is automatically generated by the init script.
    #watchfrr_options=""
    
    # for debugging purposes, you can specify a "wrap" command to start instead
    # of starting the daemon directly, e.g. to use valgrind on ospfd:
    #   ospfd_wrap="/usr/bin/valgrind"
    # or you can use "all_wrap" for all daemons, e.g. to use perf record:
    #   all_wrap="/usr/bin/perf record --call-graph -"
    # the normal daemon command is added to this at the end.

  8. frr.conf ファイルと daemons ファイルの両方を、同じディレクトリー (例: /tmp/frr) に保存します。
  9. 次のコマンドを実行して、外部 FRR コンテナーを作成します。

    $ sudo podman run -d --privileged --network host --rm --ulimit core=-1 --name frr --volume /tmp/frr:/etc/frr quay.io/frrouting/frr:9.1.0
  10. 次の FRRConfiguration 設定および RouteAdvertisements 設定を作成します。

    1. 次の内容で receive_all.yaml ファイルを作成します。

      receive_all.yaml 設定ファイルの例

      apiVersion: frrk8s.metallb.io/v1beta1
      kind: FRRConfiguration
      metadata:
        name: receive-all
        namespace: openshift-frr-k8s
      spec:
        bgp:
          routers:
          - asn: 64512
            neighbors:
            - address: 192.168.111.1
              asn: 64512
              toReceive:
                allowed:
                  mode: all

    2. 次の内容で ra.yaml ファイルを作成します。

      ra.yaml 設定ファイルの例

      apiVersion: k8s.ovn.org/v1
      kind: RouteAdvertisements
      metadata:
        name: default
      spec:
        nodeSelector: {}
        frrConfigurationSelector: {}
        networkSelectors:
        - networkSelectionType: DefaultNetwork
        advertisements:
        - "PodNetwork"
        - "EgressIP"

  11. 次のコマンドを実行して、receive_all.yaml ファイルと ra.yaml ファイルを適用します。

    $ for f in receive_all.yaml ra.yaml; do oc apply -f $f; done

検証

  1. 設定が適用されたか検証します。

    1. 次のコマンドを実行して、FRRConfiguration 設定が作成されたか検証します。

      $ oc get frrconfiguration -A

      出力例

      NAMESPACE           NAME                   AGE
      openshift-frr-k8s   ovnk-generated-6lmfb   4h47m
      openshift-frr-k8s   ovnk-generated-bhmnm   4h47m
      openshift-frr-k8s   ovnk-generated-d2rf5   4h47m
      openshift-frr-k8s   ovnk-generated-f958l   4h47m
      openshift-frr-k8s   ovnk-generated-gmsmw   4h47m
      openshift-frr-k8s   ovnk-generated-kmnqg   4h47m
      openshift-frr-k8s   ovnk-generated-wpvgb   4h47m
      openshift-frr-k8s   ovnk-generated-xq7v6   4h47m
      openshift-frr-k8s   receive-all            4h47m

    2. 次のコマンドを実行して、RouteAdvertisements 設定が作成されたか検証します。

      $ oc get ra -A

      出力例

      NAME      STATUS
      default   Accepted

  2. 次のコマンドを実行して、外部 FRR コンテナー ID を取得します。

    $ sudo podman ps | grep frr

    出力例

    22cfc713890e  quay.io/frrouting/frr:9.1.0              /usr/lib/frr/dock...  5 hours ago   Up 5 hours ago               frr

  3. 前のステップで取得したコンテナー ID を使用して、外部 FRR コンテナーの vtysh セッションで近隣の BGP とルートを確認します。以下のコマンドを実行します。

    $ sudo podman exec -it <container_id> vtysh -c "show ip bgp"

    出力例

    BGP table version is 10, local router ID is 192.168.111.1, vrf id 0
    Default local pref 100, local AS 64512
    Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
                   i internal, r RIB-failure, S Stale, R Removed
    Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
    Origin codes:  i - IGP, e - EGP, ? - incomplete
    RPKI validation codes: V valid, I invalid, N Not found
    
        Network          Next Hop            Metric LocPrf Weight Path
     *>i10.128.0.0/23    192.168.111.22           0    100      0 i
     *>i10.128.2.0/23    192.168.111.23           0    100      0 i
     *>i10.129.0.0/23    192.168.111.20           0    100      0 i
     *>i10.129.2.0/23    192.168.111.24           0    100      0 i
     *>i10.130.0.0/23    192.168.111.21           0    100      0 i
     *>i10.130.2.0/23    192.168.111.40           0    100      0 i
     *>i10.131.0.0/23    192.168.111.25           0    100      0 i
     *>i10.131.2.0/23    192.168.111.47           0    100      0 i
     *> 192.168.1.0/24   0.0.0.0                  0         32768 i
     *> 192.169.1.1/32   0.0.0.0                  0         32768 i

  4. 次のコマンドを実行して、各クラスターノードの frr-k8s Pod を見つけます。

    $ oc -n openshift-frr-k8s get pod -owide

    出力例

    NAME                                      READY   STATUS    RESTARTS   AGE   IP               NODE                                       NOMINATED NODE   READINESS GATES
    frr-k8s-86wmq                             6/6     Running   0          25h   192.168.111.20   master-0                                   <none>           <none>
    frr-k8s-h2wl6                             6/6     Running   0          25h   192.168.111.21   master-1                                   <none>           <none>
    frr-k8s-jlbgs                             6/6     Running   0          25h   192.168.111.40   node1.example.com   <none>           <none>
    frr-k8s-qc6l5                             6/6     Running   0          25h   192.168.111.25   worker-2                                   <none>           <none>
    frr-k8s-qtxdc                             6/6     Running   0          25h   192.168.111.47   node2.example.com   <none>           <none>
    frr-k8s-s5bxh                             6/6     Running   0          25h   192.168.111.24   worker-1                                   <none>           <none>
    frr-k8s-szgj9                             6/6     Running   0          25h   192.168.111.22   master-2                                   <none>           <none>
    frr-k8s-webhook-server-6cd8b8d769-kmctw   1/1     Running   0          25h   10.131.2.9       node3.example.com   <none>           <none>
    frr-k8s-zwmgh                             6/6     Running   0          25h   192.168.111.23   worker-0                                   <none>           <none>

  5. 次のコマンドを実行して、OpenShift Container Platform クラスターから、FRR コンテナー内にあるクラスターノードの frr-k8s Pod 上の BGP ルートを確認します。

    $ oc -n openshift-frr-k8s -c frr rsh frr-k8s-86wmq
  6. 次のコマンドを実行して、クラスターノードからの IP ルートを確認します。

    sh-5.1# vtysh

    出力例

    Hello, this is FRRouting (version 8.5.3).
    Copyright 1996-2005 Kunihiro Ishiguro, et al.

  7. 次のコマンドを実行して、IP ルートを確認します。

    worker-2# show ip bgp

    出力例

    BGP table version is 10, local router ID is 192.168.111.25, vrf id 0
    Default local pref 100, local AS 64512
    Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
                   i internal, r RIB-failure, S Stale, R Removed
    Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
    Origin codes:  i - IGP, e - EGP, ? - incomplete
    RPKI validation codes: V valid, I invalid, N Not found
    
        Network          Next Hop            Metric LocPrf Weight Path
     *>i10.128.0.0/23    192.168.111.22           0    100      0 i
     *>i10.128.2.0/23    192.168.111.23           0    100      0 i
     *>i10.129.0.0/23    192.168.111.20           0    100      0 i
     *>i10.129.2.0/23    192.168.111.24           0    100      0 i
     *>i10.130.0.0/23    192.168.111.21           0    100      0 i
     *>i10.130.2.0/23    192.168.111.40           0    100      0 i
     *> 10.131.0.0/23    0.0.0.0                  0         32768 i
     *>i10.131.2.0/23    192.168.111.47           0    100      0 i
     *>i192.168.1.0/24   192.168.111.1            0    100      0 i
     *>i192.169.1.1/32   192.168.111.1            0    100      0 i
    
    Displayed  10 routes and 10 total paths

  8. 次のコマンドを実行して、OpenShift Container Platform クラスターからノードをデバッグします。

    $ oc debug node/<node_name>

    出力例

    Temporary namespace openshift-debug-lbtgh is created for debugging node...
    Starting pod/worker-2-debug-zrg4v ...
    To use host binaries, run `chroot /host`
    Pod IP: 192.168.111.25
    If you don't see a command prompt, try pressing enter.

  9. 次のコマンドを実行して、BGP ルートがアドバタイズされていることを確認します。

    sh-5.1# ip route show | grep bgp

    出力例

    10.128.0.0/23 nhid 268 via 192.168.111.22 dev br-ex proto bgp metric 20
    10.128.2.0/23 nhid 259 via 192.168.111.23 dev br-ex proto bgp metric 20
    10.129.0.0/23 nhid 260 via 192.168.111.20 dev br-ex proto bgp metric 20
    10.129.2.0/23 nhid 261 via 192.168.111.24 dev br-ex proto bgp metric 20
    10.130.0.0/23 nhid 266 via 192.168.111.21 dev br-ex proto bgp metric 20
    10.130.2.0/23 nhid 262 via 192.168.111.40 dev br-ex proto bgp metric 20
    10.131.2.0/23 nhid 263 via 192.168.111.47 dev br-ex proto bgp metric 20
    192.168.1.0/24 nhid 264 via 192.168.111.1 dev br-ex proto bgp metric 20
    192.169.1.1 nhid 264 via 192.168.111.1 dev br-ex proto bgp metric 20

第8章 PTP ハードウェアの使用

8.1. OpenShift クラスターノードの PTP について

Precision Time Protocol (PTP) は、ネットワーク内のクロックを同期するのに使用されます。ハードウェアサポートと組み合わせて使用すると、PTP はマイクロ秒未満の精度を実現でき、Network Time Protocol (NTP) よりも正確になります。

重要

PTP を使用する openshift-sdn クラスターで、ハードウェアタイムスタンプに User Datagram Protocol (UDP) を使用している場合、OVN-Kubernetes プラグインに移行すると、Open vSwitch (OVS) ブリッジなどのプライマリーインターフェイスデバイスにハードウェアタイムスタンプを適用できなくなります。そのため、UDP バージョン 4 の設定は、br-ex インターフェイスでは機能しません。

OpenShift Container Platform クラスターノードで linuxptp サービスを設定し、PTP 対応ハードウェアを使用できます。

OpenShift Container Platform Web コンソールまたは OpenShift CLI (oc) を使用して、PTP Operator をデプロイして PTP をインストールします。PTP Operator は linuxptp サービスを作成し、管理し、以下の機能を提供します。

  • クラスター内の PTP 対応デバイスの検出。
  • linuxptp サービスの設定の管理。
  • PTP Operator cloud-event-proxy サイドカーによるアプリケーションのパフォーマンスおよび信頼性に悪影響を与える PTP クロックイベントの通知。
注記

PTP Operator は、ベアメタルインフラストラクチャーでのみプロビジョニングされるクラスターの PTP 対応デバイスと連携します。

8.1.1. PTP ドメインの要素

PTP は、グランドマスター、境界クロック、および通常クロックからなるリーダーフォロワー階層構造を使用して、ネットワークノード間で高精度な時刻同期を実現します。

PTP によって同期されるクロックは、リーダーとフォロワーの階層で構成されています。この階層は、1 クロックごとに実行される best master clock (BMC) アルゴリズムによって自動的に作成および更新されます。フォロワークロックはリーダークロックと同期しており、フォロワークロック自体が他のダウンストリームクロックのソースになることができます。

図8.1 ネットワーク内の PTP ノード

PTP グランドマスタークロックを示す図

PTP クロックの主な 3 つのタイプについては、以下のセクションで説明します。

グランドマスタークロック
グランドマスタークロックは、ネットワーク上の他のクロックに標準時刻情報を提供し、正確で安定した同期を保証します。タイムスタンプを書き込み、他のクロックからの時間の要求に応答します。グランドマスタークロックは、全地球航法衛星システム (GNSS) の時刻情報に同期します。グランドマスタークロックは、ネットワークにおける時刻の権威ある情報源であり、他のすべてのデバイスに時刻同期を提供する役割を担っています。
境界クロック
境界クロックには、2 つ以上の通信パスにあるポートがあり、ソースと宛先の宛先を同時に他の宛先クロックに指定できます。境界クロックは、宛先クロックアップストリームとして機能します。宛先クロックはタイミングメッセージを受け取り、遅延に合わせて調整し、ネットワークを渡す新しいソースタイムシグナルを作成します。境界クロックは、ソースクロックと正しく同期され、ソースクロックに直接レポートする接続されたデバイスの数を減らすことができる新しいタイミングパケットを生成します。
通常のクロック
通常のクロックには、ネットワーク内の位置に応じて、送信元クロックまたは宛先クロックのロールを果たすことができる単一のポート接続があります。通常のクロックは、タイムスタンプの読み取りおよび書き込みが可能です。
8.1.1.1. NTP 上の PTP の利点

PTP が NTP を経由した主な利点の 1 つは、さまざまなネットワークインターフェイスコントローラー (NIC) およびネットワークスイッチにあるハードウェアサポートです。この特化されたハードウェアにより、PTP はメッセージ送信の遅れを説明でき、時間同期の精度を高められます。可能な限りの精度を実現するには、PTP クロック間のすべてのネットワーキングコンポーネントが PTP ハードウェアを有効にすることが推奨されます。

NIC は PTP パケットを送受信した瞬間にタイムスタンプを付けることができるため、ハードウェアベースの PTP は最適な精度を提供します。これをソフトウェアベースの PTP と比較します。これには、オペレーティングシステムによる PTP パケットの追加処理が必要になります。

PTP を有効にする前に、必要なノードに対して NTP が無効になっていることを確認します。MachineConfig カスタムリソースを使用して chrony タイムサービス (chronyd) を無効にすることができます。

重要

PTP は NTP よりも優れた精度を提供しますが、PTP グランドマスター (T-GM) クロックのバックアップ時刻ソースとして NTP を設定することも可能です。GNSS-to-NTP フェイルオーバー設定では、システムは PTP を介して GNSS を主要な時刻ソースとして使用しますが、GNSS 信号が失われたり劣化したりした場合は、自動的に NTP(chronyd) にフェイルオーバーします。これにより、主要な GNSS 時刻ソースが一時的に利用できない場合でも、安定した時刻保持が可能になります。GNSS-NTP フェイルオーバーの設定に関する詳細は、GNSS/NTP フェイルオーバーの設定を 参照してください。

8.1.2. OpenShift Container Platform ノードの linuxptp および gpsd の概要

OpenShift Container Platform は、高精度のネットワーク同期のために、PTP Operator とともに linuxptp および gpsd パッケージを使用します。linuxptp パッケージは、ネットワーク内の PTP タイミング用のツールとデーモンを提供します。Global Navigation Satellite System (GNSS) 対応の NIC を備えたクラスターホストは、GNSS クロックソースとのインターフェイスに gpsd を使用します。

linuxptp パッケージには、システムクロック同期用の ts2phcpmcptp4l、および phc2sys プログラムが含まれています。

ts2phc

ts2phc は、PTP デバイス間で PTP ハードウェアクロック (PHC) を高精度で同期します。ts2phc はグランドマスタークロック設定で使用されます。Global Navigation Satellite System (GNSS) などの高精度クロックソースから正確なタイミング信号を受信します。GNSS は、大規模な分散ネットワークで使用するための、正確で信頼性の高い同期時刻ソースを提供します。GNSS クロックは通常、数ナノ秒の精度で時刻情報を提供します。

ts2phc システムデーモンは、グランドマスタークロックから時刻情報を読み取り、PHC 形式に変換することにより、グランドマスタークロックからのタイミング情報をネットワーク内の他の PTP デバイスに送信します。PHC 時間は、ネットワーク内の他のデバイスがクロックをグランドマスタークロックと同期させるために使用されます。

pmc
pmc は、IEEE 標準 1588.1588 に従って PTP 管理クライアント (pmc) を実装します。pmc は、ptp4l システムデーモンの基本的な管理アクセスを提供します。pmc は、標準入力から読み取り、選択されたトランスポート経由で出力を送信し、受信した応答を出力します。
ptp4l

ptp4l は、PTP 境界クロックと通常のクロックを実装し、システムデーモンとして実行されます。ptp4l は、以下を行います。

  • ハードウェアタイムスタンプを使用して PHC をソースクロックに同期します。
  • ソフトウェアタイムスタンプを使用してシステムクロックをソースクロックに同期します。
phc2sys
phc2sys は、システムクロックをネットワークインターフェイスコントローラー (NIC) 上の PHC に同期します。phc2sys システムデーモンは、PHC のタイミング情報を継続的に監視します。PHC はタイミングエラーを検出すると、システムクロックを修正します。

gpsd パッケージには、ホストクロックと GNSS クロックを同期するためのプログラム ubxtoolgspipegpsd が含まれています。

ubxtool
ubxtool CLI を使用すると、u-blox GPS システムと通信できます。ubxtool CLI は、u-blox バイナリープロトコルを使用して GPS と通信します。
gpspipe
gpspipegpsd 出力に接続し、それを stdout にパイプします。
gpsd
gpsd は、ホストに接続されている 1 つ以上の GPS または AIS 受信機を監視するサービスデーモンです。

8.1.3. PTP グランドマスタークロックの GNSS タイミングの概要

OpenShift Container Platform は、クラスター内の Global Navigation Satellite System (GNSS) ソースおよびグランドマスタークロック (T-GM) からの高精度 PTP タイミングの受信をサポートします。

重要

OpenShift Container Platform は、Intel E810 Westport Channel NIC を使用した GNSS ソースからの PTP タイミングのみをサポートします。

図8.2 GNSS および T-GM との同期の概要

GNSS および T-GM システムアーキテクチャー
Global Navigation Satellite System (GNSS)

GNSS は、測位情報、ナビゲーション情報、タイミング情報を世界中の受信機に提供するために使用される衛星ベースのシステムです。PTP では、高精度で安定した基準クロックソースとして GNSS 受信機がよく使用されます。これらの受信機は、複数の GNSS 衛星から信号を受信し、正確な時刻情報を計算できます。GNSS から取得したタイミング情報は、PTP グランドマスタークロックの基準として使用されます。

GNSS を基準として使用することにより、PTP ネットワークのグランドマスタークロックは、他のデバイスに高精度のタイムスタンプを提供し、ネットワーク全体での正確な同期を可能にします。

Digital Phase-Locked Loop (DPLL)
DPLL はネットワーク内の各 PTP ノード間のクロック同期を提供します。DPLL は、ローカルシステムクロック信号の位相を、受信同期信号 (PTP グランドマスタークロックからの PTP メッセージなど) の位相と比較します。DPLL は、ローカルクロックの周波数と位相を継続的に調整して、ローカルクロックと基準クロック間の位相差を最小限に抑えます。
8.1.3.1. GNSS 同期 PTP グランドマスタークロックでのうるう秒イベントの処理

うるう秒は、協定世界時 (UTC) を国際原子時 (TAI) と同期させるために、時折適用される 1 秒の調整です。UTC のうるう秒は予測できません。leap-seconds.list に、国際的に合意されたうるう秒が掲載されています。このファイルは、Earth Rotation and Reference Systems Service (IERS) によって定期的に更新されます。うるう秒が処理されないと、遠端の RAN ネットワークに大きな影響が及ぶ可能性があります。これにより、遠端の RAN アプリケーションが音声通話とデータセッションを直ちに切断する可能性があります。

8.1.4. PTP およびクロック同期エラーイベントについて

仮想 RAN (vRAN) などのクラウドネイティブアプリケーションでは、ネットワーク全体の機能に重要なハードウェアタイミングイベントに関する通知へのアクセスが必要です。PTP クロック同期エラーは、分散ユニット (DU) で実行している vRAN アプリケーションなど、低レイテンシーアプリケーションのパフォーマンスおよび信頼性に悪影響を及ぼす可能性があります。

PTP 同期の損失は、RAN ネットワークでは重大なエラーです。ノードで同期が失われると、無線がシャットダウンされ、ネットワークの OTA(Over the Air) トラフィックがワイヤレスネットワーク内の別のノードにシフトされる可能性があります。高速のイベント通知は、クラスターノードが DU で実行している vRAN アプリケーションに対して PTP クロック同期ステータスと通信できるようにすることで、ワークロードのエラーを軽減します。

イベント通知は、同じ DU ノード上で実行されている vRAN アプリケーションで利用できます。パブリッシュ/サブスクライブ REST API は、イベント通知をメッセージングバスに渡します。パブリッシュ/サブスクライブメッセージング (pub-sub メッセージング) は、非同期のサービス間通信アーキテクチャーです。このアーキテクチャーでは、トピックにパブリッシュされたメッセージが、そのトピックのすべてのサブスクライバーによって即座に受信されます。

PTP Operator は、すべての PTP 対応ネットワークインターフェイスの高速イベント通知を生成します。コンシューマーアプリケーションは、PTP イベント REST API v2 を使用して PTP イベントをサブスクライブできます。

注記

PTP 高速イベント通知は、PTP 通常クロック、PTP グランドマスタークロック、または PTP 境界クロックを使用するように設定されたネットワークインターフェイスで使用できます。

8.1.5. 2 カード E810 NIC 設定リファレンス

OpenShift Container Platform は、シングルおよびデュアル NIC Intel E810 ハードウェアをサポートし、グランドマスタークロック (T-GM) および境界クロック (T-BC) の PTP タイミングを実現します。

デュアル NIC グランドマスタークロック

デュアル NIC ハードウェアを備えたクラスターホストを PTP グランドマスタークロックとして使用できます。1 枚目の NIC は、Global Navigation Satellite System (GNSS) からタイミング情報を受信します。2 枚目の NIC は、E810 NIC フェイスプレート上の SMA1 Tx/Rx 接続を使用して、1 枚目の NIC からタイミング情報を受信します。クラスターホストのシステムクロックは、GNSS 衛星に接続されている NIC から同期されます。

デュアル NIC グランドマスタークロックは、Remote Radio Unit (RRU) と Baseband Unit (BBU) が同じ無線セルサイトに配置されている分散型 RAN (D-RAN) 構成の機能です。D-RAN は、コアネットワークにリンクするバックホール接続により、複数のサイトに無線機能を分散します。

図8.3 デュアル NIC グランドマスタークロック

GNSS タイミングソースとダウンストリームの PTP 境界クロックおよび通常のクロックに接続されたデュアル NIC PTP グランドマスタークロック
注記

デュアル NIC T-GM 設定では、1 つの ts2phc プログラムが、各 NIC に 1 つずつ存在する合計 2 つの PTP ハードウェアクロック (PHC) 上で動作します。

デュアル NIC 境界クロック

ミッドバンドスペクトルカバレッジを提供する 5G 電話会社ネットワークの場合、各仮想分散ユニット (vDU) には 6 つの無線ユニット (RU) への接続が必要です。これらの接続を確立するには、各 vDU ホストに境界クロックとして設定された 2 つの NIC が必要です。

デュアル NIC ハードウェアを使用すると、各 NIC を同じアップストリームリーダークロックに接続し、NIC ごとに個別の ptp4l インスタンスをダウンストリームクロックに供給することができます。

デュアル NIC 境界クロックを備えた高可用性システムクロック

Intel E810-XXVDA4 Salem チャネルデュアル NIC ハードウェアを、高可用性システムクロックのタイミングを提供するデュアル PTP 境界クロックとして設定できます。この設定は、別々の NIC 上に複数のタイムソースがある場合に便利です。高可用性があれば、どちらかのタイミングソースが失われたり切断されたりしても、ノードのタイミング同期が失われることはありません。

各 NIC は同じアップストリームリーダークロックに接続されます。高可用性境界クロックは、複数の PTP ドメインを使用してターゲットシステムクロックと同期します。T-BC が高可用性である場合、NIC PHC クロックを同期する 1 つ以上の ptp4l インスタンスが失敗した場合でも、ホストシステムクロックは正しいオフセットを維持できます。単一の SFP ポートまたはケーブルに障害が発生した場合、境界クロックはリーダークロックと同期したままになります。

境界クロックリーダーソースの選択は、A-BMCA アルゴリズムを使用して行われます。詳細は、ITU-T recommendation G.8275.1 を参照してください。

8.1.6. デュアルポート NIC を使用して PTP 通常クロックの冗長性を向上させる

OpenShift Container Platform は、PTP タイミングの通常のクロックとして、単一ポートのネットワーキングインターフェイスカード (NIC) をサポートします。冗長性を向上させるために、1 つのポートをアクティブ、もう 1 つのポートをスタンバイとしてデュアルポート NIC を設定できます。

重要

linuxptp サービスをデュアルポート NIC 冗長性を備えた通常のクロックとして設定することは、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。

Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。

この設定では、デュアルポート NIC のポートは次のように動作します。

  • アクティブポートは、Following ポート状態では通常のクロックとして機能します。
  • スタンバイポートは Listening ポート状態のままになります。
  • アクティブポートに障害が発生した場合、スタンバイポートがアクティブに遷移し、継続的な PTP タイミング同期が確保されます。
  • 両方のポートに障害が発生した場合、クロック状態は HOLDOVER 状態に移行し、ホールドオーバータイムアウトが経過すると FREERUN 状態に移行します。その後、リーダークロックに再同期します。
8.1.6.1. ハードウェア要件

x86_64 または AArch64 アーキテクチャーノードで冗長性が追加された PTP 通常クロックを設定できる。

x86_64 アーキテクチャーノードの場合、ノードには、PTP をサポートし、NIC ごとに 1 つの PTP ハードウェアクロック (PHC) を公開するデュアルポート NIC (Intel E810 など) が搭載されている。

AArch64 アーキテクチャーノードの場合、次のデュアルポート NIC のみを使用できる。

  • NVIDIA ConnectX-7 シリーズ
  • NIC モードでの NVIDIA BlueField-3 シリーズ

  • 適切な PTP サポートを確保し、NIC ごとに 1 つの PHC を公開するには、サポートされている最新の NVIDIA ドライバーとファームウェアを使用します。

8.1.7. 3 カード Intel E810 PTP グランドマスタークロック

OpenShift Container Platform は、PTP グランドマスタークロック (T-GM) として 3 つの Intel E810 NIC を使用するクラスターホストをサポートしています。

3 カードグランドマスタークロック

3 枚の NIC を備えたクラスターホストを PTP グランドマスタークロックとして使用できます。1 枚目の NIC は、Global Navigation Satellite System (GNSS) からタイミング情報を受信します。2 枚目と 3 枚目の NIC は、E810 NIC フェイスプレート上の SMA1 Tx/Rx 接続を使用して、1 つ目の NIC からタイミング情報を受信します。クラスターホストのシステムクロックは、GNSS 衛星に接続されている NIC から同期されます。

3 カード NIC グランドマスタークロックは、Radio Unit (RU) がフロントホールスイッチなしで分散ユニット (DU) に直接接続される分散 RAN (D-RAN) 構成に使用できます (例: RU と DU が同じ無線セルサイトにある場合)。D-RAN は、コアネットワークにリンクするバックホール接続により、複数のサイトに無線機能を分散します。

図8.4 3 カード Intel E810 PTP グランドマスタークロック

GNSS タイミングソースとダウンストリームの PTP 境界クロックおよび通常のクロックに接続された 3 カード PTP グランドマスタークロック
注記

3 カードの T-GM 設定では、1 つの ts2phc プロセスがシステム内の 3 つの ts2phc インスタンスとして報告されます。

8.2. PTP デバイスの設定

PTP Operator は NodePtpDevice.ptp.openshift.io カスタムリソース定義 (CRD) を OpenShift Container Platform に追加します。

PTP Operator は、インストールされている場合、クラスター内の各ノードで Precision Time Protocol (PTP) 対応のネットワークデバイスを検索します。この Operator は、互換性のある PTP 対応ネットワークデバイスを提供する各ノードの NodePtpDevice カスタムリソース (CR) オブジェクトを作成および更新します。

PTP 機能が組み込まれたネットワークインターフェイスコントローラー (NIC) ハードウェアでは、デバイス固有の設定が必要な場合があります。PtpConfig カスタムリソース (CR) でプラグインを設定することで、PTP Operator でサポートされているハードウェア固有の NIC 機能を使用できます。linuxptp-daemon サービスが、plugin スタンザ内の名前付きパラメーターを使用して、特定のハードウェア設定に基づいて linuxptp プロセス、ptp4l および phc2sys を起動します。

重要

OpenShift Container Platform 4.20 では、Intel E810 NIC が PtpConfig プラグインでサポートされています。

8.2.1. CLI を使用した PTP Operator のインストール

クラスター管理者は、CLI を使用して Operator をインストールできます。

前提条件

  • PTP に対応するハードウェアを持つノードでベアメタルハードウェアにインストールされたクラスター。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。

手順

  1. PTP Operator の namespace を作成します。

    1. 次の 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"
    2. Namespace CR を作成します。

      $ oc create -f ptp-namespace.yaml
  2. PTP Operator の Operator グループを作成します。

    1. 次の YAML を ptp-operatorgroup.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. PTP Operator にサブスクライブします。

    1. 次の 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
    2. Subscription CR を作成します。

      $ oc create -f ptp-sub.yaml
  4. Operator がインストールされていることを確認するには、以下のコマンドを入力します。

    $ oc get csv -n openshift-ptp -o custom-columns=Name:.metadata.name,Phase:.status.phase

    出力例

    Name                         Phase
    4.20.0-202301261535          Succeeded

8.2.2. Web コンソールを使用した PTP Operator のインストール

クラスター管理者は、Web コンソールを使用して PTP Operator をインストールできます。

注記

先のセクションで説明されているように namespace および Operator グループを作成する必要があります。

手順

  1. OpenShift Container Platform Web コンソールを使用して PTP Operator をインストールします。

    1. OpenShift Container Platform Web コンソールで、EcosystemSoftware Catalog をクリックします。
    2. 利用可能な Operator のリストから PTP Operator を選択してから Install をクリックします。
    3. Install Operator ページの A specific namespace on the cluster の下で openshift-ptp を選択します。次に、Install をクリックします。
  2. オプション: PTP Operator が正常にインストールされていることを確認します。

    1. EcosystemInstalled Operators ページに切り替えます。
    2. PTP OperatorStatusInstallSucceeded の状態で openshift-ptp プロジェクトにリスト表示されていることを確認します。

      注記

      インストール時に、Operator は Failed ステータスを表示する可能性があります。インストールが後に InstallSucceeded メッセージを出して正常に実行される場合は、Failed メッセージを無視できます。

      Operator がインストール済みとして表示されない場合に、さらにトラブルシューティングを実行します。

      • EcosystemInstalled Operators ページに移動し、Operator Subscriptions および Install Plans タブで Status にエラーがあるかどうかを検査します。
      • WorkloadsPods ページに移動し、openshift-ptp プロジェクトで Pod のログを確認します。

8.2.3. クラスター内の PTP 対応ネットワークデバイスの検出

PTP 対応ネットワークデバイスを設定できるように、クラスター内に存在する PTP 対応ネットワークデバイスを特定します。

前提条件

  • PTP Operator がインストールされている。

手順

  • クラスター内の 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
        namespace: openshift-ptp
        resourceVersion: "6538103"
        uid: d42fc9ad-bcbf-4590-b6d8-b676c642781a
      spec: {}
      status:
        devices:
        - name: eno1
        - name: eno2
        - name: eno3
        - name: eno4
        - name: enp5s0f0
        - name: enp5s0f1
    ...

    ここでは、以下のようになります。

    - ワーカー -0
    name パラメーターの値は、親ノードの名前と同じです。
    devices
    devices コレクションには、PTP Operator がノードに対して検出した PTP 対応デバイスのリストが含まれています。

8.2.4. linuxptp サービスをグランドマスタークロックとして設定する

ホスト NIC を設定する PtpConfig カスタムリソース (CR) を作成することで、linuxptp サービス (ptp4lphc2systs2phc) をグランドマスタークロック (T-GM) として設定できます。

ts2phc ユーティリティーを使用すると、システムクロックを PTP グランドマスタークロックと同期できるため、ノードは高精度クロック信号をダウンストリームの PTP 通常クロックおよび境界クロックにストリーミングできます。

注記

次の PtpConfig CR の例をベースとして使用して、linuxptp サービスを Intel Westport Channel E810-XXVDA4T ネットワークインターフェイスの T-GM として設定してください。

PTP 高速イベントを設定するには、ptp4lOptsptp4lConfptpClockThreshold に適切な値を設定します。ptpClockThreshold は、イベントが有効になっている場合にのみ使用されます。詳細は、「PTP 高速イベント通知パブリッシャーの設定」を参照してください。

前提条件

  • 実稼働環境の T-GM クロックの場合は、ベアメタルクラスターホストに Intel E810 Westport Channel NIC がインストールされている。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP Operator をインストールします。

手順

  1. PtpConfig CR を作成します。以下に例を示します。

    1. 要件に応じて、デプロイメントに次の T-GM 設定のいずれかを使用します。YAML を grandmaster-clock-ptp-config.yaml ファイルに保存します。

      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 -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: 1500
                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 に設定します。

    2. 以下のコマンドを実行して CR を作成します。

      $ oc create -f grandmaster-clock-ptp-config.yaml

検証

  1. PtpConfig プロファイルがノードに適用されていることを確認します。

    1. 以下のコマンドを実行して、openshift-ptp namespace の 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

    2. プロファイルが正しいことを確認します。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

8.2.4.1. 2 カード E810 NIC のグランドマスタークロックとして linuxptp サービスを設定する

NIC を設定する PtpConfig カスタムリソース (CR) を作成することにより、linuxptp サービス (ptp4lphc2systs2phc) を 2 カード E810 NIC のグランドマスタークロック (T-GM) として設定できます。

次の E810 NIC の場合、T-GM として linuxptp サービスを設定できます。

  • Intel E810-XXVDA4T Westport Channel NIC
  • Intel E810-CQDA2T Logan Beach NIC

分散型 RAN (D-RAN) のユースケースでは、次の方法で 2 カード NIC の PTP を設定できます。

  • NIC 1 を、Global Navigation Satellite System (GNSS) のタイムソースに同期します。
  • NIC 2 を、NIC 1 によって提供される 1PPS タイミング出力に同期します。この設定は、PtpConfig CR の PTP ハードウェアプラグインによって提供します。

2 カード PTP T-GM 設定では、ptp4l のインスタンス 1 つと ts2phc のインスタンス 1 つが使用されます。ptp4l および ts2phc プログラムは、各 NIC に 1 つずつ存在する 2 つの PTP ハードウェアクロック (PHC) 上で動作するようにそれぞれ設定されています。ホストのシステムクロックは、GNSS タイムソースに接続されている NIC から同期されます。

注記

次の PtpConfig CR の例をベースとして使用し、linuxptp サービスをデュアル Intel E810 ネットワークインターフェイスの T-GM として設定します。

PTP 高速イベントを設定するには、ptp4lOptsptp4lConfptpClockThreshold に適切な値を設定します。ptpClockThreshold は、イベントが有効になっている場合にのみ使用されます。詳細は、「PTP 高速イベント通知パブリッシャーの設定」を参照してください。

前提条件

  • 実稼働環境の T-GM クロックの場合は、ベアメタルクラスターホストに 2 枚の Intel E810 NIC がインストールされている。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP Operator をインストールします。

手順

  1. PtpConfig CR を作成します。以下に例を示します。

    1. 次の YAML を grandmaster-clock-ptp-config-dual-nics.yaml ファイルに保存します。

      # 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 -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: 1500
                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"
      注記

      ts2phc.nmea_serialport の値を /dev/gnss0 に設定します。

    2. 以下のコマンドを実行して CR を作成します。

      $ oc create -f grandmaster-clock-ptp-config-dual-nics.yaml

検証

  1. PtpConfig プロファイルがノードに適用されていることを確認します。

    1. 以下のコマンドを実行して、openshift-ptp namespace の 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

    2. プロファイルが正しいことを確認します。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

8.2.4.2. 3 カード E810 NIC のグランドマスタークロックとして linuxptp サービスを設定する

NIC を設定する PtpConfig カスタムリソース (CR) を作成することにより、linuxptp サービス (ptp4lphc2systs2phc) を 3 カード E810 NIC のグランドマスタークロック (T-GM) として設定できます。

次の E810 NIC の場合、3 枚の NIC を使用する T-GM として linuxptp サービスを設定できます。

  • Intel E810-XXVDA4T Westport Channel NIC
  • Intel E810-CQDA2T Logan Beach NIC

分散型 RAN (D-RAN) のユースケースでは、次の方法で 3 カード NIC の PTP を設定できます。

  • NIC 1 を、Global Navigation Satellite System (GNSS) に同期します。
  • NIC 2 と 3 を、1PPS フェイスプレート接続で NIC 1 に同期します。

次の PtpConfig CR の例をベースとして使用し、linuxptp サービスを 3 カード Intel E810 の T-GM として設定します。

前提条件

  • 実稼働環境の T-GM クロックの場合は、ベアメタルクラスターホストに 3 枚の Intel E810 NIC がインストールされている。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP Operator をインストールします。

手順

  1. PtpConfig CR を作成します。以下に例を示します。

    1. 次の YAML を three-nic-grandmaster-clock-ptp-config.yaml ファイルに保存します。

      # In this example, the three cards are connected via SMA cables:
      # - $iface_timeTx1 has the GNSS signal input
      # - $iface_timeTx2 SMA1 is connected to $iface_timeTx1 SMA1
      # - $iface_timeTx3 SMA1 is connected to $iface_timeTx1 SMA2
      apiVersion: ptp.openshift.io/v1
      kind: PtpConfig
      metadata:
        name: gm-3card
        namespace: openshift-ptp
        annotations:
          ran.openshift.io/ztp-deploy-wave: "10"
      spec:
        profile:
        - name: grandmaster
          ptp4lOpts: -2 --summary_interval -4
          phc2sysOpts: -r -u 0 -m -N 8 -R 16 -s $iface_timeTx1 -n 24
          ptpSchedulingPolicy: SCHED_FIFO
          ptpSchedulingPriority: 10
          ptpSettings:
            logReduce: "true"
          plugins:
            e810:
              enableDefaultConfig: false
              settings:
                LocalHoldoverTimeout: 14400
                LocalMaxHoldoverOffSet: 1500
                MaxInSpecOffset: 1500
              pins:
                # Syntax guide:
                # - The 1st number in each pair must be one of:
                #    0 - Disabled
                #    1 - RX
                #    2 - TX
                # - The 2nd number in each pair must match the channel number
                $iface_timeTx1:
                  SMA1: 2 1
                  SMA2: 2 2
                  U.FL1: 0 1
                  U.FL2: 0 2
                $iface_timeTx2:
                  SMA1: 1 1
                  SMA2: 0 2
                  U.FL1: 0 1
                  U.FL2: 0 2
                $iface_timeTx3:
                  SMA1: 1 1
                  SMA2: 0 2
                  U.FL1: 0 1
                  U.FL2: 0 2
              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
            #example value of nmea_serialport is /dev/gnss0
            ts2phc.nmea_serialport (?<gnss_serialport>[/\w\s/]+)
            leapfile /usr/share/zoneinfo/leap-seconds.list
            [$iface_timeTx1]
            ts2phc.extts_polarity rising
            ts2phc.extts_correction 0
            [$iface_timeTx2]
            ts2phc.master 0
            ts2phc.extts_polarity rising
            #this is a measured value in nanoseconds to compensate for SMA cable delay
            ts2phc.extts_correction -10
            [$iface_timeTx3]
            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_timeTx1]
            masterOnly 1
            [$iface_timeTx1_1]
            masterOnly 1
            [$iface_timeTx1_2]
            masterOnly 1
            [$iface_timeTx1_3]
            masterOnly 1
            [$iface_timeTx2]
            masterOnly 1
            [$iface_timeTx2_1]
            masterOnly 1
            [$iface_timeTx2_2]
            masterOnly 1
            [$iface_timeTx2_3]
            masterOnly 1
            [$iface_timeTx3]
            masterOnly 1
            [$iface_timeTx3_1]
            masterOnly 1
            [$iface_timeTx3_2]
            masterOnly 1
            [$iface_timeTx3_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
          ptpClockThreshold:
            holdOverTimeout: 5
            maxOffsetThreshold: 1500
            minOffsetThreshold: -1500
        recommend:
        - profile: grandmaster
          priority: 4
          match:
          - nodeLabel: node-role.kubernetes.io/$mcp
      注記

      ts2phc.nmea_serialport の値を /dev/gnss0 に設定します。

    2. 以下のコマンドを実行して CR を作成します。

      $ oc create -f three-nic-grandmaster-clock-ptp-config.yaml

検証

  1. PtpConfig プロファイルがノードに適用されていることを確認します。

    1. 以下のコマンドを実行して、openshift-ptp namespace の Pod の一覧を取得します。

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

      出力例

      NAME                          READY   STATUS    RESTARTS   AGE     IP             NODE
      linuxptp-daemon-74m3q         3/3     Running   3          4d15h   10.16.230.7    compute-1.example.com
      ptp-operator-5f4f48d7c-x6zkn  1/1     Running   1          4d15h   10.128.1.145   compute-1.example.com

    2. プロファイルが正しいことを確認します。次のコマンドを実行し、PtpConfig プロファイルで指定したノードに対応する linuxptp デーモンのログを調べます。

      $ oc logs linuxptp-daemon-74m3q -n openshift-ptp -c linuxptp-daemon-container

      出力例

      ts2phc[2527.586]: [ts2phc.0.config:7] adding tstamp 1742826342.000000000 to clock /dev/ptp11
      ts2phc[2527.586]: [ts2phc.0.config:7] adding tstamp 1742826342.000000000 to clock /dev/ptp7
      ts2phc[2527.586]: [ts2phc.0.config:7] adding tstamp 1742826342.000000000 to clock /dev/ptp14
      ts2phc[2527.586]: [ts2phc.0.config:7] nmea delay: 56308811 ns
      ts2phc[2527.586]: [ts2phc.0.config:6] /dev/ptp14 offset          0 s2 freq      +0
      ts2phc[2527.587]: [ts2phc.0.config:6] /dev/ptp7 offset          0 s2 freq      +0
      ts2phc[2527.587]: [ts2phc.0.config:6] /dev/ptp11 offset          0 s2 freq      -0
      I0324 14:25:05.000439  106907 stats.go:61] state updated for ts2phc =s2
      I0324 14:25:05.000504  106907 event.go:419] dpll State s2, gnss State s2, tsphc state s2, gm state s2,
      I0324 14:25:05.000906  106907 stats.go:61] state updated for ts2phc =s2
      I0324 14:25:05.001059  106907 stats.go:61] state updated for ts2phc =s2
      ts2phc[1742826305]:[ts2phc.0.config] ens4f0 nmea_status 1 offset 0 s2
      GM[1742826305]:[ts2phc.0.config] ens4f0 T-GM-STATUS s2

      ここでは、以下のようになります。

      クロック/dev/ptp<N> に tstamp <timestamp> を追加します。
      ts2phc が 特定のタイムスタンプを適用することで、PTP ハードウェアクロック (PHC) をアクティブに同期していることを示します。
      /dev/ptp<N> オフセット 0 s2 周波数 +0
      PTP デバイスと基準間の推定オフセットを表示します。オフセットが 0 で状態が s2 の場合は、完全な同期を示します。
      T-GM-STATUS s2
      Telecom Grandmaster (T-GM) がロック状態 (s2) であることを確認し、ネットワークに安定した時間基準を提供します。

8.2.5. グランドマスタークロックの PtpConfig 設定リファレンス

このリファレンスでは、linuxptp サービス (ptp4lphc2systs2phc) をグランドマスタークロックとして設定する PtpConfig カスタムリソース (CR) の設定オプションを説明します。

Expand
表8.1 PTP グランドマスタークロックの PtpConfig 設定オプション
PtpConfig CR フィールド説明

plugins

grandmaster クロック動作用に NIC を設定する .exec.cmdline オプションの配列を指定します。grandmaster クロック設定では、特定の PTP ピンを無効にする必要があります。

プラグインメカニズムにより、PTP Operator は自動ハードウェア設定を行うことができます。Intel Westport Channel NIC または Intel Logan Beach NIC では、enableDefaultConfig フィールドが true に設定されていると、PTP Operator はハードコードされたスクリプトを実行して、NIC に必要な設定を実行します。

ptp4lOpts

ptp4l サービスのシステム設定オプションを指定します。ネットワークインターフェイス名とサービス設定ファイルが自動的に追加されるため、オプションには、ネットワークインターフェイス名 -i <interface> およびサービス設定ファイル -f /etc/ptp4l.conf を含めないでください。

ptp4lConf

ptp4l をグランドマスタークロックとして起動するために必要な設定を指定します。たとえば、ens2f1 インターフェイスは、ダウンストリームに接続されたデバイスを同期します。グランドマスタークロックの場合、clockClass6 に設定し、clockAccuracy0x27 に設定します。Global Navigation Satellite System (GNSS) からタイミング信号を受信する場合は、timeSource0x20 に設定します。

tx_timestamp_timeout

データを破棄する前に、送信者からの送信 (TX) タイムスタンプを待機する最大時間を指定します。

boundary_clock_jbod

JBOD 境界クロック時間遅延値を指定します。この値は、ネットワーク時間デバイス間で受け渡される時間値を修正するために使用されます。

phc2sysOpts

phc2sys サービスのシステム設定オプションを指定します。このフィールドが空の場合、PTP Operator は phc2sys サービスを開始しません。

注記

ここにリストされているネットワークインターフェイスがグランドマスターとして設定されており、ts2phcConf および ptp4lConf フィールドで必要に応じて参照されていることを確認してください。

ptpSchedulingPolicy

ptp4l および phc2sys プロセスのスケジューリングポリシーを設定します。デフォルト値は SCHED_OTHER です。FIFO スケジューリングをサポートするシステムでは、SCHED_FIFO を使用してください。

ptpSchedulingPriority

ptpSchedulingPolicySCHED_FIFO に設定されている場合に、ptp4l および phc2sys プロセスの FIFO 優先順位を設定するには、1 ~ 65 の整数値を設定します。ptpSchedulingPriority フィールドは、ptpSchedulingPolicySCHED_OTHER に設定されている場合は使用されません。

ptpClockThreshold

オプション: ptpClockThreshold スタンザが存在しない場合には、ptpClockThreshold フィールドにデフォルト値が使用されます。スタンザはデフォルトの ptpClockThreshold 値を示します。ptpClockThreshold 値は、PTP マスタークロックが切断されてから PTP イベントが発生するまでの時間を設定します。holdOverTimeout は、PTP マスタークロックが切断されたときに、PTP クロックイベントの状態が FREERUN に変わるまでの時間値 (秒単位) です。maxOffsetThreshold および minOffsetThreshold 設定は、CLOCK_REALTIME (phc2sys) またはマスターオフセット (ptp4l) の値と比較するナノ秒単位のオフセット値を設定します。ptp4l または phc2sys のオフセット値がこの範囲外の場合、PTP クロックの状態が FREERUN に設定されます。オフセット値がこの範囲内にある場合、PTP クロックの状態が LOCKED に設定されます。

ts2phcConf

ts2phc コマンドの設定を設定します。

leapfile は、PTP Operator コンテナーイメージ内の現在のうるう秒定義ファイルへのデフォルトパスです。

ts2phc.nmea_serialport は、NMEA GPS クロックソースに接続されているシリアルポートデバイスです。設定すると、/dev/gnss<id> で GNSS 受信機にアクセスできるようになります。ホストに複数の GNSS 受信機がある場合は、次のいずれかのデバイスを列挙することで正しいデバイスを見つけることができます。

  • /sys/class/net/<eth_port>/device/gnss/
  • /sys/class/gnss/gnss<id>/device/

ts2phcOpts

ts2phc コマンドのオプションを設定します。

recommend

profile がノードに適用される方法を定義する 1 つ以上の recommend オブジェクトの配列を指定します。

.recommend.profile

profile セクションで定義されている .recommend.profile オブジェクト名を指定します。

.recommend.priority

0 から 99 までの整数値で priority を指定します。数値が大きいほど優先度が低くなるため、99 の優先度は 10 よりも低くなります。ノードが match フィールドで定義されるルールに基づいて複数のプロファイルに一致する場合、優先順位の高いプロファイルがそのノードに適用されます。

.recommend.match

.recommend.match ルールを nodeLabel または nodeName の値に指定します。

.recommend.match.nodeLabel

oc get nodes --show-labels コマンドを使用して、ノードオブジェクトの node.Labels フィールドの keynodeLabel を設定します。例: node-role.kubernetes.io/worker

.recommend.match.nodeName

oc get nodes コマンドを使用して、nodeName をノードオブジェクトの node.Name フィールドの値に設定します。compute-1.example.com はその例です。

8.2.5.1. グランドマスタークロッククラスの同期状態のリファレンス

次の表は、PTP グランドマスタークロック (T-GM) の gm.ClockClass の状態を示しています。

クロッククラスの状態では、Primary Reference Time Clock (PRTC) またはその他のタイミングソースに関連する精度と安定性に基づいて T-GM クロックが分類されます。

ホールドオーバー仕様とは、PTP クロックがプライマリータイムソースから更新を受信せずに同期を維持できる時間です。

Expand
表8.2 T-GM クロッククラスの状態
クロッククラスの状態説明

gm.ClockClass 6

T-GM クロックは LOCKED モードで PRTC に接続しています。たとえば、PRTC は GNSS タイムソースまで追跡できます。

gm.ClockClass 7

T-GM クロックは HOLDOVER モードであり、ホールドオーバー仕様の範囲内にあります。クロックソースはカテゴリー 1 の周波数ソースまで追跡できない場合があります。

gm.ClockClass 248

T-GM クロックは FREERUN モードです。

詳細は、"Phase/time traceability information", ITU-T G.8275.1/Y.1369.1 Recommendations を参照してください。

8.2.5.2. Intel E810 NIC ハードウェア設定リファレンス

ここでは、Intel E810 ハードウェアプラグイン を使用して E810 ネットワークインターフェイスを PTP グランドマスタークロックとして設定する方法を説明します。

ハードウェアピンの設定により、ネットワークインターフェイスがシステム内の他のコンポーネントやデバイスとどのようにやり取りするかが決まります。Intel E810 NIC には、外部 1PPS 信号用のコネクターが 4 つあります (SMA1SMA2U.FL1U.FL2)。

Expand
表8.3 Intel E810 NIC ハードウェアコネクターの設定
ハードウェアピン推奨設定説明

U.FL1

0 1

U.FL1 コネクター入力を無効にします。U.FL1 コネクターは出力専用です。

U.FL2

0 2

U.FL2 コネクター出力を無効にします。U.FL2 コネクターは入力専用です。

SMA1

0 1

SMA1 コネクター入力を無効にします。SMA1 コネクターは双方向です。

SMA2

0 2

SMA2 コネクター出力を無効にします。SMA2 コネクターは双方向です。

次の例に示すように、spec.profile.plugins.e810.pins パラメーターを使用して、Intel E810 NIC のピン設定を行うことができます。

pins:
      <interface_name>:
        <connector_name>: <function> <channel_number>

ここでは、以下のようになります。

<function>: ピンのロールを指定します。以下の値は、pin ロールに関連付けられています。

  • 0: 無効
  • 1: Rx (受信タイムスタンプ)
  • 2:Tx (送信タイムスタンプ)

<channel number>: 物理コネクターに関連付けられた番号。次のチャネル番号が物理コネクターに関連付けられています。

  • 1: SMA1 または U.FL1
  • 2: SMA2 または U.FL2

例:

  • 0 1: SMA1 または U.FL1 にマッピングされたピンを無効にします。
  • 1 2: Rx 機能を SMA2 または U.FL2 に割り当てます。
注記

SMA1 コネクターと U.FL1 コネクターはチャネル 1 を共有します。SMA2 コネクターと U.FL2 コネクターはチャネル 2 を共有します。

PtpConfig カスタムリソース (CR) で GNSS クロックを設定するには、spec.profile.plugins.e810.ublxCmds パラメーターを設定します。

重要

T-GM GPS アンテナケーブルシグナルの遅延を補正するには、オフセット値を設定する必要があります。最適な T-GM アンテナオフセット値を設定するには、GNSS アンテナケーブルシグナルの遅延を正確に測定します。Red Hat はこの測定をサポートしたり、必要な遅延オフセットの値を提供したりすることはできません。

これらの ublxCmds スタンザはそれぞれ、ubxtool コマンドを使用してホスト NIC に適用する設定と対応しています。以下に例を示します。

ublxCmds:
  - args:
      - "-P"
      - "29.20"
      - "-z"
      - "CFG-HW-ANT_CFG_VOLTCTRL,1"
      - "-z"
      - "CFG-TP-ANT_CABLEDELAY,<antenna_delay_offset>"
    reportOutput: false

ここでは、以下のようになります。

CFG-TP-ANT_CABLEDELAY、<antenna_delay_offset>
測定された T-GM アンテナ遅延オフセット (ナノ秒単位)。必要な遅延オフセット値を取得するには、外部テスト機器を使用してケーブル遅延を測定する必要があります。

次の表は、同等の ubxtool コマンドを示しています。

Expand
表8.4 Intel E810 ublxCmds の設定
ubxtool コマンド説明

ubxtool -P 29.20 -z CFG-HW-ANT_CFG_VOLTCTRL,1 -z CFG-TP-ANT_CABLEDELAY,<antenna_delay_offset>

アンテナ電圧制御を有効にし、UBX-MON-RF および UBX-INF-NOTICE ログメッセージでアンテナステータスの報告を許可し、GPS アンテナケーブルシグナルの遅延をオフセットする <antenna_delay_offset> 値をナノ秒単位で設定します。

ubxtool -P 29.20 -e GPS

アンテナが GPS 信号を受信できるようにします。

ubxtool -P 29.20 -d Galileo

Galileo GPS 衛星から信号を受信するようにアンテナを設定します。

ubxtool -P 29.20 -d GLONASS

アンテナが GLONASS GPS 衛星から信号を受信できないようにします。

ubxtool -P 29.20 -d BeiDou

アンテナが BeiDou GPS 衛星から信号を受信できないようにします。

ubxtool -P 29.20 -d SBAS

アンテナが SBAS GPS 衛星から信号を受信できないようにします。

ubxtool -P 29.20 -t -w 5 -v 1 -e SURVEYIN,600,50000

GNSS 受信機のサーベイインプロセスを設定して、初期位置の推定を改善します。最適な結果が得られるまでに最大 24 時間かかる場合があります。

ubxtool -P 29.20 -p MON-HW

ハードウェアの自動スキャンを 1 回実行し、NIC の状態と構成設定を報告します。

8.2.5.3. デュアル E810 NIC 設定リファレンス

ここでは、Intel E810 ハードウェアプラグイン を使用して、E810 ネットワークインターフェイスのペアを PTP グランドマスタークロック (T-GM) として設定する方法を説明します。

デュアル NIC クラスターホストを設定する前に、1PPS フェイスプレート接続を使用して 2 つの NIC を SMA1 ケーブルで接続する必要があります。

デュアル NIC T-GM を設定する際は、SMA1 接続ポートを使用して NIC を接続する場合に発生する 1PPS 信号遅延を補正する必要があります。ケーブルの長さ、周囲温度、コンポーネントと製作公差などのさまざまな要因が信号遅延に影響を与える可能性があります。遅延を補正するには、信号遅延のオフセットに使用する特定の値を計算する必要があります。

Expand
表8.5 E810 デュアル NIC T-GM PtpConfig CR リファレンス
PtpConfig フィールド説明

spec.profile.plugins.e810.pins

PTP Operator E810 ハードウェアプラグインを使用して E810 ハードウェアピンを設定します。

  • ピン 2 1 は、NIC 1 の SMA11PPS OUT 接続を有効にします。
  • ピン 1 1 は、NIC 2 の SMA11PPS IN 接続を有効にします。

spec.profile.ts2phcConf

ts2phcConf フィールドは、NIC 1 と NIC 2 のパラメーターを設定するために使用します。NIC 2 には ts2phc.master 0 を設定します。これにより、GNSS ではなく 1PPS 入力から NIC 2 のタイミングソースが設定されます。使用する特定の SMA ケーブルおよびケーブルの長さにより発生する遅延を補正するには、NIC 2 の ts2phc.extts_correction 値を設定します。設定する値は、具体的な測定値と SMA1 ケーブルの長さによって異なります。

spec.profile.ptp4lConf

複数の NIC のサポートを有効にするには、boundary_clock_jbod の値を 1 に設定します。

spec.profile.plugins.e810.pins リスト内の各値は、<function> <channel_number> 形式に従います。

ここでは、以下のようになります。

<function>: pin ロールを指定します。以下の値は、pin ロールに関連付けられています。

  • 0: 無効
  • 1: 受信 (Rx) - 1PPS IN 用
  • 2: 送信 (Tx) - 1PPS OUT 用

<channel_number>: 物理コネクターに関連付けられた番号。次のチャネル番号が物理コネクターに関連付けられています。

  • 1: SMA1 または U.FL1
  • 2: SMA2 または U.FL2

例:

  • 2 1: SMA11PPS OUT (Tx) を有効にします。
  • 1 1: SMA11PPS IN (Rx) を有効にします。

PTP Operator は、これらの値を Intel E810 ハードウェアプラグインに渡し、各 NIC の sysfs ピン設定インターフェイスに書き込みます。

8.2.5.4. 3 カード E810 NIC 設定リファレンス

ここでは、3 カード E810 NIC を PTP グランドマスタークロック (T-GM) として設定する方法を説明します。

3 カードのクラスターホストを設定する前に、1PPS フェースプレート接続を使用して 3 枚の NIC を接続する必要があります。プライマリー NIC の 1PPS_out 出力は、他の 2 枚の NIC に提供されます。

3 カードの T-GM を設定する際は、SMA1 接続ポートを使用して NIC を接続する場合に発生する 1PPS 信号遅延を補正する必要があります。ケーブルの長さ、周囲温度、コンポーネントと製作公差などのさまざまな要因が信号遅延に影響を与える可能性があります。遅延を補正するには、信号遅延のオフセットに使用する特定の値を計算する必要があります。

Expand
表8.6 3 カード E810 T-GM PtpConfig CR リファレンス
PtpConfig フィールド説明

spec.profile.plugins.e810.pins

PTP Operator E810 ハードウェアプラグインを使用して E810 ハードウェアピンを設定します。

  • $iface_timeTx1.SMA1 は、NIC 1 の SMA11PPS OUT 接続を有効にします。
  • $iface_timeTx1.SMA2 は、NIC 1 の SMA21PPS OUT 接続を有効にします。
  • $iface_timeTx2.SMA1$iface_timeTx3.SMA1 は、NIC 2 と NIC 3 の SMA11PPS IN 接続を有効にします。
  • $iface_timeTx2.SMA2$iface_timeTx3.SMA2 は、NIC 2 と NIC 3 の SMA2 接続を無効にします。

spec.profile.ts2phcConf

ts2phcConf フィールドは、NIC のパラメーターを設定するために使用します。NIC 2 と NIC 3 に ts2phc.master 0 を設定します。これにより、GNSS ではなく 1PPS 入力から NIC 2 および NIC 3 のタイミングソースが設定されます。使用する特定の SMA ケーブルとケーブルの長さにより発生する遅延を補正するには、NIC 2 と NIC 3 の ts2phc.extts_correction 値を設定します。設定する値は、具体的な測定値と SMA1 ケーブルの長さによって異なります。

spec.profile.ptp4lConf

複数の NIC のサポートを有効にするには、boundary_clock_jbod の値を 1 に設定します。

8.2.6. GNSS をソースとするグランドマスタークロックのホールドオーバー

ホールドオーバーにより、Global Navigation Satellite System (GNSS) ソースが利用できない場合でもグランドマスター (T-GM) クロックは同期パフォーマンスを維持できます。この期間中、T-GM クロックは内部オシレーターとホールドオーバーパラメーターに依存してタイミングの中断を削減します。

PTPConfig カスタムリソース (CR) で次のホールドオーバーパラメーターを設定することにより、ホールドオーバー動作を定義できます。

MaxInSpecOffset
許容される最大オフセットをナノ秒単位で指定します。T-GM クロックが MaxInSpecOffset 値を超えると、FREERUN 状態 (クロッククラス状態 gm.ClockClass 248) に遷移します。
LocalHoldoverTimeout
T-GM クロックが FREERUN 状態に遷移するまでホールドオーバー状態を維持する最大期間 (秒単位) を指定します。
LocalMaxHoldoverOffSet
ホールドオーバー状態にあるときに T-GM クロックが到達できる最大オフセットをナノ秒単位で指定します。

MaxInSpecOffset 値が LocalMaxHoldoverOffset 値より小さく、T-GM クロックが最大オフセット値を超える場合、T-GM クロックはホールドオーバー状態から FREERUN 状態に遷移します。

重要

LocalMaxHoldoverOffSet 値が MaxInSpecOffset 値より小さい場合、クロックが最大オフセットに達する前にホールドオーバータイムアウトが発生します。この問題を解決するには、MaxInSpecOffset フィールドと LocalMaxHoldoverOffset フィールドを同じ値に設定します。

クロッククラスの状態の詳細は、「グランドマスタークロッククラス同期状態リファレンス」のドキュメントを参照してください。

T-GM クロックは、ホールドオーバーパラメーターの LocalMaxHoldoverOffSetLocalHoldoverTimeout を使用してスロープを計算します。スロープは、位相オフセットが時間の経過とともに変化するレートです。これはナノ秒/秒単位で測定され、設定された値は、指定された期間内にオフセットがどれだけ増加するかを示します。

T-GM クロックはスロープ値を使用して時間ドリフトを予測および補正し、ホールドオーバー中のタイミングの中断を削減します。T-GM クロックは、次の式を使用してスロープを計算します。

  • スロープ = localMaxHoldoverOffSet/localHoldoverTimeout

    たとえば、LocalHoldOverTimeout パラメーターが 60 秒に設定され、LocalMaxHoldoverOffset パラメーターが 3000 ナノ秒に設定されている場合、スロープは次のように計算されます。

    スロープ = 3000 ナノ秒/60 秒 = 50 ナノ秒/秒

    T-GM クロックは 60 秒で最大オフセットに達します。

注記

位相オフセットはピコ秒からナノ秒に変換されます。その結果、ホールドオーバー中に計算された位相オフセットはナノ秒で表され、スロープはナノ秒/秒で表されます。

次の図は、GNSS をソースとする T-GM クロックのホールドオーバー動作を示しています。

図8.5 GNSS をソースとする T-GM クロックのホールドオーバー

GNSS をソースとする T-GM クロックのホールドオーバー

20 GNSS 信号が途絶えたため、T-GM クロックは ホールドオーバー モードに入ります。T-GM クロックは内部クロックを使用して時間の精度を維持します。

20 GNSS 信号が復旧し、T-GM クロックは ロック モードに戻ります。GNSS シグナルが復元されると、ts2phc オフセット、Digital Phase-Locked Loop (DPLL) 位相オフセット、GNSS オフセットなど、同期チェーン内のすべての依存コンポーネントが安定した LOCKED モードに達した後にのみ、T-GM クロックは再び LOCKED モードになります。

20 GNSS 信号が再び途絶え、T-GM クロックは ホールドオーバー モードに戻ります。タイムエラーの増加が始まります。

20 トレーサビリティの喪失が長期間続いたため、時間誤差が MaxInSpecOffset の しきい値を超えました。

20 GNSS 信号が復旧し、T-GM クロックの同期が再開されました。タイムエラーの減少が始まります。

20 時間誤差は減少し、MaxInSpecOffset の しきい値内に収まる。

8.2.7. 境界クロックと時間スレーブクロックへのアシストなしホールドオーバーの適用

Intel E810-XXVDA4T NIC は、PTP 境界クロック (T-BC) または通信時刻同期クロック (T-TSC) として設定されている場合、アップストリームのタイミングソースが利用できなくなった場合でも、非アシストホールドオーバー機能によって時刻同期を維持できます。

ts2phc サービスは、タイミングレシーバー (TR) ポートにバインドされた ptp4l インスタンスを監視します。たとえば、TR ポートがタイムレシーバーとしての動作を停止したり、アップストリームグランドマスタークロック (T-GM) の品質が低下したり、リンクが切断されたりすると、システムはホールドオーバーモードに入り、動的に再設定されます。

重要

T-BC および T-TSC へのアシストなしホールドオーバーの適用は、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。

Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP Operator をインストールします。
  • Intel E810-XXVDA4T NIC。

手順

  1. トリプルポート T-BC NIC を設定します。以下の例では、PtpConfig リソースに 2 つのプロファイルが含まれています。1 つは時間送信ポート (00-tbc-tt) 用で、もう 1 つはすべてのハードウェア、TR ポート、および ts2phcphc2sys プロセスを設定するためのものです。

    apiVersion: ptp.openshift.io/v1
    kind: PtpConfig
    metadata:
      name: t-bc
      namespace: openshift-ptp
    spec:
      profile:
      - name: 00-tbc-tt
        ptp4lConf: |
          [ens4f0]
          masterOnly 1 
    1
    
          [ens8f0]
          masterOnly 1 
    2
    
          [ens1f0]
          masterOnly 1 
    3
    
          [global]
          #
          # Default Data Set
          #
          twoStepFlag 1
          slaveOnly 0
          priority1 128
          priority2 128
          domainNumber 25
          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.60
          pi_integral_const 0.001
          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 AA:BB:CC:DD:EE:FF
          p2p_dst_mac BB:CC:DD:EE:FF:GG
          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 0xA0
        ptp4lOpts: -2 --summary_interval -4
        ptpSchedulingPolicy: SCHED_FIFO
        ptpSchedulingPriority: 10
        ptpSettings:
          controllingProfile: 01-tbc-tr
          logReduce: "false"
      - name: 01-tbc-tr
        phc2sysOpts: -r -n 25 -N 8 -R 16 -u 0 -m -s ens4f1 
    4
    
        plugins: 
    5
    
          e810:
            enableDefaultConfig: false
            interconnections: 
    6
    
            - gnssInput: false
              id: ens4f0
              part: E810-XXVDA4T
              phaseOutputConnectors:
              - SMA1
              - SMA2
              upstreamPort: ens4f1
            - id: ens1f0
              inputConnector:
                connector: SMA1
              part: E810-XXVDA4T
            - id: ens8f0
              inputConnector:
                connector: SMA1
              part: E810-XXVDA4T
            pins:
              ens4f0:
                SMA1: 2 1
                SMA2: 2 2
                U.FL1: 0 1
                U.FL2: 0 2
              ens1f0:
                SMA1: 1 1
                SMA2: 0 2
                U.FL1: 0 1
                U.FL2: 0 2
              ens8f0:
                SMA1: 1 1
                SMA2: 0 2
                U.FL1: 0 1
                U.FL2: 0 2
            settings:
              LocalHoldoverTimeout: 14400
              LocalMaxHoldoverOffSet: 1500
              MaxInSpecOffset: 100
        ptp4lConf: |
          # The interface name is hardware-specific
          [ens4f1]
          masterOnly 0
          [global]
          #
          # Default Data Set
          #
          twoStepFlag 1
          slaveOnly 0
          priority1 128
          priority2 128
          domainNumber 25
          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.60
          pi_integral_const 0.001
          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 AA:BB:CC:DD:EE:HH
          p2p_dst_mac BB:CC:DD:EE:FF:II
          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 1
          #
          # Clock description
          #
          productDescription ;;
          revisionData ;;
          manufacturerIdentity 00:00:00
          userDescription ;
          timeSource 0xA0
        ptp4lOpts: -2 --summary_interval -4
        ptpSchedulingPolicy: SCHED_FIFO
        ptpSchedulingPriority: 10
        ptpSettings:
          inSyncConditionThreshold: "10"
          inSyncConditionTimes: "12"
          logReduce: "false"
        ts2phcConf: |
          [global]
          use_syslog  0
          verbose 1
          logging_level 7
          ts2phc.pulsewidth 100000000
          leapfile  /usr/share/zoneinfo/leap-seconds.list
          domainNumber 25 
    7
    
          uds_address /var/run/ptp4l.0.socket 
    8
    
          [ens4f0] 
    9
    
          ts2phc.extts_polarity rising
          ts2phc.extts_correction -10
          ts2phc.master 0
          [ens1f0]
          ts2phc.extts_polarity rising
          ts2phc.extts_correction -27
          ts2phc.master 0
          [ens8f0]
          ts2phc.extts_polarity rising
          ts2phc.extts_correction -27
          ts2phc.master 0
        ts2phcOpts: -s generic -a --ts2phc.rh_external_pps 1 
    10
    
      recommend:
      - match:
        - nodeLabel: node-role.kubernetes.io/master
        priority: 4
        profile: 00-tbc-tt
      - match:
        - nodeLabel: node-role.kubernetes.io/master
        priority: 4
        profile: 01-tbc-tr
    1 2 3
    すべての TT ポートの masterOnly は 1 に設定されています。
    4
    TR プロファイルの phc2sysOpts 設定では、ノードの時刻同期のソースとしてアップストリームポート ens4f1 を指定します。
    5
    TR プロファイルには、ハードウェアプラグインセクションが含まれています。
    6
    ハードウェアプラグインの相互接続セクションには、ens4f0ens1f0ens8f0 の 3 つの NIC があります。プライマリー NIC (ens4f0) は、gnnsInput フィールドが false に設定され、かつ TR ポートを指定する upstreamPort フィールドを持つ唯一の NIC です。また、phaseOutputConnectorsSMA1SMA2 のリストもあります。次の NIC には inputConnector フィールドがあります。T-BC 設定と T-TSC 設定の両方で、タイムレシーバー NIC ens4f0 と特定の TR ポート (upstreamPort: ens4f1) を設定します。
    7
    ts2phc 設定には、アップストリーム PTP ドメインの domainNumber が含まれています。
    8
    ts2phc 設定には uds_address が含まれています。その値は重要ではありません。なぜなら、デーモンが正しいアドレスでそれにパッチを当てるからです。
    9
    ts2phc 設定には、このセットアップに参加しているすべての NIC (ens4f0ens1f0、および ens8f0) を含める必要があります。
    10
    ts2phcOpts は、-s generic でソースを汎用に設定し、-a で自動に設定します。最後のオプション --ts2phc.rh_external_pps 1 は、外部位相ソースである Digital Phase-Locked Loop (DPLL) と連携して動作するように設定します。
    注記

    単一 NIC の場合、1PPS 測定に使用する場合はすべてのピンを無効にするか、出力を有効にします。

注記

この設定を T-TSC 操作用にレンダリングするには、00-tbc-tt プロファイルを削除し、TR NIC のみをリストするように ts2phcConf セクションを調整します。

検証

T-BC ステータスを取得するには、次のコマンドを実行します。

$ oc -linuxptp-daemon-container logs ds/linuxptp-daemon --since=1s -f |grep T-BC

出力例

T-BC[1760525446]:[ts2phc.1.config] ens4f0 offset 1 T-BC-STATUS s2
T-BC[1760525447]:[ts2phc.1.config] ens4f0 offset 1 T-BC-STATUS s2
T-BC[1760525448]:[ts2phc.1.config] ens4f0 offset -1 T-BC-STATUS s2

これは 1 秒ごとに報告されます。s2 はロックされていることを示し、s1 はホールドオーバーがアクティブになっていることを示し、s0 はロック解除されていることを示します。

8.2.8. PTP グランドマスタークロックの動的なうるう秒処理の設定

PTP Operator コンテナーイメージには、リリース時に利用可能な最新の leap-seconds.list ファイルが含まれています。

PTP Operator は、Global Positioning System (GPS) アナウンスを使用してうるう秒ファイルを自動的に更新するように設定できます。

うるう秒情報は、openshift-ptp namespace の leap-configmap という名前の自動生成された ConfigMap リソースに保存されます。PTP Operator は、ts2phc プロセスがアクセスできる linuxptp-daemon Pod 内のボリュームとして leap-configmap リソースをマウントします。

GPS 衛星が新しいうるう秒データをブロードキャストすると、PTP Operator は leap-configmap リソースを新しいデータで更新します。ts2phc プロセスは変更を自動的に取得します。

注記

次の手順は参考用です。PTP Operator のバージョン 4.20 では、デフォルトで自動うるう秒管理が有効になります。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP Operator をインストールし、クラスターに PTP グランドマスタークロック (T-GM) を設定した。

手順

  1. PtpConfig CR の phc2sysOpts セクションで自動うるう秒処理を設定します。以下のオプションを設定します。

    phc2sysOpts: -r -u 0 -m -N 8 -R 16 -S 2 -s ens2f0 -n 24
    注記

    以前は、過去のうるう秒を考慮するために、phc2sys 設定 (-O -37) のオフセット調整が T-GM に必要でした。これは不要になりました。

  2. PtpConfig CR の spec.profile.plugins.e810.ublxCmds セクションで、GPS レシーバーによる NAV-TIMELS メッセージの定期的な報告を有効にするように Intel e810 NIC を設定します。以下に例を示します。

    - args: #ubxtool -P 29.20 -p CFG-MSG,1,38,248
        - "-P"
        - "29.20"
        - "-p"
        - "CFG-MSG,1,38,248"

検証

  1. 設定した 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

  2. leap-configmap リソースが PTP Operator によって正常に生成され、leap-seconds.list の最新バージョンに更新されていることを確認します。以下のコマンドを実行します。

    $ oc -n openshift-ptp get configmap leap-configmap -o jsonpath='{.data.<node_name>}'

    <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

8.2.9. linuxptp サービスを境界クロックとして設定

PtpConfig カスタムリソース (CR) オブジェクトを作成して、linuxptp サービス (ptp4lphc2sys を設定できます。

注記

次の例の PtpConfig CR を、特定のハードウェアおよび環境の境界クロックとして linuxptp サービスを設定する基礎として使用します。この例の CR は PTP 高速イベントを設定しません。PTP 高速イベントを設定するには、ptp4lOptsptp4lConfptpClockThreshold に適切な値を設定します。ptpClockThreshold は、イベントが有効になっている場合にのみ使用されます。詳細は、「PTP 高速イベント通知パブリッシャーの設定」を参照してください。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP Operator をインストールします。

手順

  1. 以下の PtpConfig CR を作成してから、YAML を boundary-clock-ptp-config.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"

    Expand
    表8.7 PTP 境界クロックの CR 設定オプション
    CR フィールド説明

    name

    PtpConfig CR の名前。

    profile

    1 つ以上の profile オブジェクトの配列を指定します。

    name

    プロファイルオブジェクトを一意に識別するプロファイルオブジェクトの名前を指定します。

    ptp4lOpts

    ptp4l サービスのシステム設定オプションを指定します。ネットワークインターフェイス名とサービス設定ファイルが自動的に追加されるため、オプションには、ネットワークインターフェイス名 -i <interface> およびサービス設定ファイル -f /etc/ptp4l.conf を含めないでください。

    ptp4lConf

    ptp4l を境界クロックとして起動するために必要な設定を指定します。たとえば、ens1f0 はグランドマスタークロックから同期し、ens1f3 は接続されたデバイスを同期します。

    <interface_1>

    同期クロックを受信するインターフェイス。

    <interface_2>

    synchronization クロックを送信するインターフェイス。

    tx_timestamp_timeout

    Intel Columbiaville 800 Series NIC の場合、tx_timestamp_timeout50 に設定します。

    boundary_clock_jbod

    Intel Columbiaville 800 Series NIC の場合、boundary_clock_jbod0 に設定されていることを確認します。Intel Fortville X710 シリーズ NIC の場合、boundary_clock_jbod1 に設定されていることを確認します。

    phc2sysOpts

    phc2sys サービスのシステム設定オプションを指定します。このフィールドが空の場合、PTP Operator は phc2sys サービスを開始しません。

    ptpSchedulingPolicy

    ptp4l と phc2sys プロセスのスケジューリングポリシー。デフォルト値は SCHED_OTHER です。FIFO スケジューリングをサポートするシステムでは、SCHED_FIFO を使用してください。

    ptpSchedulingPriority

    ptpSchedulingPolicySCHED_FIFO に設定されている場合に、ptp4l および phc2sys プロセスの FIFO の優先度を設定するために使用される 1-65 の整数値。ptpSchedulingPriority フィールドは、ptpSchedulingPolicySCHED_OTHER に設定されている場合は使用されません。

    ptpClockThreshold

    オプション: ptpClockThreshold が存在しない場合、ptpClockThreshold フィールドにはデフォルト値が使用されます。ptpClockThreshold は、PTP マスタークロックが切断されてから PTP イベントが発生するまでの時間を設定します。holdOverTimeout は、PTP マスタークロックが切断されたときに、PTP クロックイベントの状態が FREERUN に変わるまでの時間値 (秒単位) です。maxOffsetThreshold および minOffsetThreshold 設定は、CLOCK_REALTIME (phc2sys) またはマスターオフセット (ptp4l) の値と比較するナノ秒単位のオフセット値を設定します。ptp4l または phc2sys のオフセット値がこの範囲外の場合、PTP クロックの状態が FREERUN に設定されます。オフセット値がこの範囲内にある場合、PTP クロックの状態が LOCKED に設定されます。

    recommend

    profile がノードに適用される方法を定義する 1 つ以上の recommend オブジェクトの配列を指定します。

    .recommend.profile

    profile セクションで定義される .recommend.profile オブジェクト名を指定します。

    .recommend.priority

    0 から 99 までの整数値で priority を指定します。数値が大きいほど優先度が低くなるため、99 の優先度は 10 よりも低くなります。ノードが match フィールドで定義されるルールに基づいて複数のプロファイルに一致する場合、優先順位の高いプロファイルがそのノードに適用されます。

    .recommend.match

    .recommend.match ルールを nodeLabel または nodeName の値に指定します。

    .recommend.match.nodeLabel

    oc get nodes --show-labels コマンドを使用して、ノードオブジェクトの node.Labels フィールドの keynodeLabel を設定します。例: node-role.kubernetes.io/worker

    .recommend.match.nodeName

    oc get nodes コマンドを使用して、nodeName をノードオブジェクトの node.Name フィールドの値に設定します。compute-1.example.com はその例です。

  2. 以下のコマンドを実行して CR を作成します。

    $ oc create -f boundary-clock-ptp-config.yaml

検証

  1. PtpConfig プロファイルがノードに適用されていることを確認します。

    1. 以下のコマンドを実行して、openshift-ptp namespace の 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

    2. プロファイルが正しいことを確認します。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] ------------------------------------

8.2.9.1. linuxptp サービスをデュアル NIC ハードウェアの境界クロックとして設定

NIC ごとに PtpConfig カスタムリソース (CR) オブジェクトを作成することにより、linuxptp サービス (ptp4lphc2sys) をデュアル NIC ハードウェアの境界クロックとして設定できます。

デュアル NIC ハードウェアを使用すると、各 NIC を同じアップストリームリーダークロックに接続し、NIC ごとに個別の ptp4l インスタンスをダウンストリームクロックに供給することができます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP Operator をインストールします。

手順

  1. 「linuxptp サービスを境界クロックとして設定」の参照 CR を各 CR の基礎として使用して、NIC ごとに 1 つずつ、2 つの個別の PtpConfig CR を作成します。以下に例を示します。

    1. phc2sysOpts の値を指定して、boundary-clock-ptp-config-nic1.yaml を作成します。

      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: |
            [ens5f1]
            masterOnly 1
            [ens5f0]
            masterOnly 0
          ...
          phc2sysOpts: "-a -r -m -n 24 -N 8 -R 16"

      ここでは、以下のようになります。

      ptp4lConf
      ptp4l を 境界クロックとして起動するために必要なインターフェイスを指定します。たとえば、ens5f0 はグランドマスタークロックから同期し、ens5f1 は接続された機器から同期します。
      phc2sysOpts: "-a -r -m -n 24 -N 8 -R 16"
      必要な phc2sysOpts 値を設定します。-m はメッセージを stdout に出力します。linuxptp-daemon DaemonSet はログを解析し、Prometheus メトリクスを生成します。
    2. boundary-clock-ptp-config-nic2.yaml を作成し、phc2sysOpts フィールドを完全に削除して、2 番目の 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: |
            [ens7f1]
            masterOnly 1
            [ens7f0]
            masterOnly 0
      ...

      2 番目の NIC の境界クロックとして ptp4l を開始するために必要なインターフェイスを指定します。

      注記

      2 番目の NIC で phc2sys サービスを無効にするには、2 番目の PtpConfig CR から phc2sysOpts フィールドを完全に削除する必要があります。

  2. 次のコマンドを実行して、デュアル NIC PtpConfig CR を作成します。

    1. 1 番目の NIC の PTP を設定する CR を作成します。

      $ oc create -f boundary-clock-ptp-config-nic1.yaml
    2. 2 番目の NIC の PTP を設定する CR を作成します。

      $ 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

linuxptp サービス ptp4l および phc2sys を、デュアル PTP 境界クロック (T-BC) の高可用性 (HA) システムクロックとして設定できます。

高可用性システムクロックは、2 つの境界クロックとして設定されたデュアル NIC Intel E810 Salem チャネルハードウェアからの複数のタイムソースを使用します。2 つの境界クロックインスタンスが HA セットアップに参加し、それぞれ独自の設定プロファイルを持ちます。各 NIC を同じアップストリームリーダークロックに接続し、NIC ごとに個別の ptp4l インスタンスをダウンストリームクロックに供給します。

NIC を T-BC として設定する 2 つの PtpConfig カスタムリソース (CR) オブジェクトと、2 つの NIC 間の高可用性を設定する 3 番目の PtpConfig CR を作成します。

重要

HA を設定する PtpConfig CR で phc2SysOpts オプションを 1 回設定します。2 つの NIC を設定する PtpConfig CR で phc2sysOpts フィールドを空の文字列に設定します。これにより、2 つのプロファイルに対して個別の phc2sys プロセスがセットアップされなくなります。

3 番目の PtpConfig CR は、高可用性システムクロックサービスを設定します。CR は、ptp4l プロセスが実行されないように、ptp4lOpts フィールドを空の文字列に設定します。CR は、spec.profile.ptpSettings.haProfiles キーの下に ptp4l 設定のプロファイルを追加し、それらのプロファイルのカーネルソケットパスを phc2sys サービスに渡します。ptp4l 障害が発生すると、phc2sys サービスはバックアップ ptp4l 設定に切り替わります。プライマリープロファイルが再びアクティブになると、phc2sys サービスは元の状態に戻ります。

重要

HA を設定するために使用する 3 つの PtpConfig CR すべてに対して、spec.recommend.priority を同じ値に設定していることを確認します。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP Operator をインストールします。
  • Intel E810 Salem チャネルデュアル NIC を使用してクラスターノードを設定します。

手順

  1. 「linuxptp サービスをデュアル NIC ハードウェアの境界クロックとして設定」の CR を各 CR の参照として使用して、NIC ごとに 1 つずつ、2 つの個別の PtpConfig CR を作成します。

    1. phc2sysOpts フィールドに空の文字列を指定して、ha-ptp-config-nic1.yaml ファイルを作成します。以下に例を示します。

      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: |
            [ens5f1]
            masterOnly 1
            [ens5f0]
            masterOnly 0
          #...
          phc2sysOpts: ""

      ここでは、以下のようになります。

      ptp4lConf
      ptp4l を 境界クロックとして起動するために必要なインターフェイスを指定します。たとえば、ens5f0 はグランドマスタークロックから同期し、ens5f1 は接続された機器から同期します。
      phc2sysOpts: ""
      phc2sysOpts に空の文字列を設定します。これらの値は、高可用性を設定する PtpConfig CR の spec.profile.ptpSettings.haProfiles フィールドから入力されます。
    2. 次のコマンドを実行して、NIC 1 に PtpConfig CR を適用します。

      $ oc create -f ha-ptp-config-nic1.yaml
    3. phc2sysOpts フィールドに空の文字列を指定して、ha-ptp-config-nic2.yaml ファイルを作成します。以下に例を示します。

      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: ""
    4. 次のコマンドを実行して、NIC 2 に PtpConfig CR を適用します。

      $ oc create -f ha-ptp-config-nic2.yaml
  2. HA システムクロックを設定する PtpConfig CR を作成します。以下に例を示します。

    1. ptp-config-for-ha.yaml ファイルを作成します。2 つの NIC を設定する PtpConfig CR で設定されている metadata.name フィールドと一致するように haProfiles を設定します。例: 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: ""
            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"

      ptp4lOpts フィールドを空の文字列に設定します。空でない場合、p4ptl プロセスは重大なエラーで開始されます。

      重要

      個々の NIC を設定する PtpConfig CR の前に、高可用性 PtpConfig CR を適用しないでください。

    2. 次のコマンドを実行して、HA PtpConfig CR を適用します。

      $ oc create -f ptp-config-for-ha.yaml

検証

  • PTP Operator が PtpConfig CR を正しく適用したことを確認します。以下の手順を実行します。

    1. 以下のコマンドを実行して、openshift-ptp namespace の 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 は 1 つだけ存在する必要があります。

    2. 次のコマンドを実行して、プロファイルが正しいことを確認します。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] ------------------------------------

8.2.10. linuxptp サービスを通常のクロックとして設定

PtpConfig カスタムリソース (CR) オブジェクトを作成して、linuxptp サービス (ptp4lphc2sys) を通常のクロックとして設定できます。

注記

次の例の PtpConfig CR を、特定のハードウェアおよび環境の通常クロックとして linuxptp サービスを設定する基礎として使用します。この例の CR は PTP 高速イベントを設定しません。PTP 高速イベントを設定するには、ptp4lOptsptp4lConfptpClockThreshold に適切な値を設定します。ptpClockThreshold は、イベントが有効な場合にのみ必要です。詳細は、「PTP 高速イベント通知パブリッシャーの設定」を参照してください。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP Operator をインストールします。

手順

  1. 以下の PtpConfig CR を作成してから、YAML を ordinary-clock-ptp-config.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"

    Expand
    表8.8 PTP 通常クロック CR 設定のオプション
    CR フィールド説明

    name

    PtpConfig CR の名前。

    profile

    1 つ以上の profile オブジェクトの配列を指定します。各プロファイルの名前は一意である必要があります。

    interface

    ptp4l サービスで使用するネットワークインターフェイスを指定します (例: ens787f1)。

    ptp4lOpts

    ptp4l サービスのシステム設定オプションを指定します。たとえば、-2 で IEEE 802.3 ネットワークトランスポートを選択します。ネットワークインターフェイス名とサービス設定ファイルが自動的に追加されるため、オプションには、ネットワークインターフェイス名 -i <interface> およびサービス設定ファイル -f /etc/ptp4l.conf を含めないでください。このインターフェイスで PTP 高速イベントを使用するには、--summary_interval -4 を追加します。

    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 Series NIC の場合、tx_timestamp_timeout50 に設定します。

    boundary_clock_jbod

    Intel Columbiaville 800 Series NIC の場合、boundary_clock_jbod0 に設定します。

    ptpSchedulingPolicy

    ptp4lphc2sys プロセスのスケジューリングポリシー。デフォルト値は SCHED_OTHER です。FIFO スケジューリングをサポートするシステムでは、SCHED_FIFO を使用してください。

    ptpSchedulingPriority

    ptpSchedulingPolicySCHED_FIFO に設定されている場合に、ptp4l および phc2sys プロセスの FIFO の優先度を設定するために使用される 1-65 の整数値。ptpSchedulingPriority フィールドは、ptpSchedulingPolicySCHED_OTHER に設定されている場合は使用されません。

    ptpClockThreshold

    オプション: ptpClockThreshold が存在しない場合、ptpClockThreshold フィールドにはデフォルト値が使用されます。ptpClockThreshold は、PTP マスタークロックが切断されてから PTP イベントが発生するまでの時間を設定します。holdOverTimeout は、PTP マスタークロックが切断されたときに、PTP クロックイベントの状態が FREERUN に変わるまでの時間値 (秒単位) です。maxOffsetThreshold および minOffsetThreshold 設定は、CLOCK_REALTIME (phc2sys) またはマスターオフセット (ptp4l) の値と比較するナノ秒単位のオフセット値を設定します。ptp4l または phc2sys のオフセット値がこの範囲外の場合、PTP クロックの状態が FREERUN に設定されます。オフセット値がこの範囲内にある場合、PTP クロックの状態が LOCKED に設定されます。

    recommend

    profile がノードに適用される方法を定義する 1 つ以上の recommend オブジェクトの配列を指定します。

    .recommend.profile

    profile セクションで定義される .recommend.profile オブジェクト名を指定します。

    .recommend.priority

    通常クロックの .recommend.priority0 に設定します。

    .recommend.match

    .recommend.match ルールを nodeLabel または nodeName の値に指定します。

    .recommend.match.nodeLabel

    oc get nodes --show-labels コマンドを使用して、ノードオブジェクトの node.Labels フィールドの keynodeLabel を設定します。例: node-role.kubernetes.io/worker

    .recommend.match.nodeName

    oc get nodes コマンドを使用して、nodeName をノードオブジェクトの node.Name フィールドの値に設定します。compute-1.example.com はその例です。

  2. 次のコマンドを実行して、PtpConfig CR を作成します。

    $ oc create -f ordinary-clock-ptp-config.yaml

検証

  1. PtpConfig プロファイルがノードに適用されていることを確認します。

    1. 以下のコマンドを実行して、openshift-ptp namespace の 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

    2. プロファイルが正しいことを確認します。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] ------------------------------------

8.2.10.1. PTP の通常クロックリファレンスとしての Intel Columbiaville E800 シリーズ NIC

次の表は、Intel Columbiaville E800 シリーズ NIC を通常のクロックとして使用するために、PTP リファレンス設定に加える必要がある変更を説明します。クラスターに適用する PtpConfig カスタムリソース (CR) に変更を加えます。

Expand
表8.9 Intel Columbiaville NIC の推奨 PTP 設定
PTP 設定推奨設定

phc2sysOpts

-a -r -m -n 24 -N 8 -R 16

tx_timestamp_timeout

50

boundary_clock_jbod

0

注記

phc2sysOpts の場合、-m はメッセージを stdout に出力します。linuxptp-daemon DaemonSet はログを解析し、Prometheus メトリクスを生成します。

PtpConfig カスタムリソース (CR) オブジェクトを作成することで、linuxptp サービス (ptp4lphc2sys) をデュアルポート NIC 冗長性を備えた通常のクロックとして設定できます。

通常のクロックのデュアルポート NIC 設定では、1 つのポートに障害が発生した場合、スタンバイポートが引き継ぎ、PTP タイミング同期を維持します。

重要

linuxptp サービスをデュアルポート NIC 冗長性を備えた通常のクロックとして設定することは、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。

Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP Operator をインストールします。
  • 冗長性のある通常のクロックとしてデュアルポート NIC を使用するためのハードウェア要件を確認する。詳細は、「デュアルポート NIC を使用して PTP 通常クロックの冗長性を向上させる」を参照してください。

手順

  1. 次の PtpConfig CR を作成し、YAML を oc-dual-port-ptp-config.yaml ファイルに保存します。

    PTP 通常クロックデュアルポート設定の例

    apiVersion: ptp.openshift.io/v1
    kind: PtpConfig
    metadata:
      name: ordinary-clock-1
      namespace: openshift-ptp
    spec:
      profile:
      - name: oc-dual-port
        phc2sysOpts: -a -r -n 24 -N 8 -R 16 -u 0
        ptp4lConf: |-
          [ens3f2]
          masterOnly 0
          [ens3f3]
          masterOnly 0
    
          [global]
          #
          # Default Data Set
          #
          slaveOnly 1
    #...

    ここでは、以下のようになります。

    phc2sysOpts: -a -r -n 24 -N 8 -R 16 -u 0
    phc2sys サービスのシステム設定オプションを指定します。
    ptp4lConf
    ptp4l サービスのインターフェイス設定を指定します。この例では、ens3f2 および ens3f3 インターフェイスに masterOnly 0 を設定すると、ens3 インターフェイスの両方のポートがリーダークロックまたはフォロワークロックとして実行できるようになります。この設定は、slaveOnly 1 仕様と組み合わせることで、1 つのポートがアクティブな通常クロックとして動作し、他のポートが Listening ポート状態でスタンバイ通常クロックとして動作するようにします。
    奴隷のみ 1
    ptp4l を通常のクロックとしてのみ実行するように設定します。
  2. 次のコマンドを実行して、PtpConfig CR を作成します。

    $ oc create -f oc-dual-port-ptp-config.yaml

検証

  1. PtpConfig プロファイルがノードに適用されていることを確認します。

    1. 以下のコマンドを実行して、openshift-ptp namespace の 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

    2. プロファイルが正しいことを確認します。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: oc-dual-port
      I1115 09:41:17.117616 4143292 daemon.go:102] Interface: ens787f1
      I1115 09:41:17.117620 4143292 daemon.go:102] Ptp4lOpts: -2 --summary_interval -4
      I1115 09:41:17.117623 4143292 daemon.go:102] Phc2sysOpts: -a -r -n 24 -N 8 -R 16 -u 0
      I1115 09:41:17.117626 4143292 daemon.go:116] ------------------------------------

8.2.11. PTP ハードウェアの FIFO 優先スケジューリングの設定

低遅延のパフォーマンスを確保する必要のある通信業者などのデプロイメントタイプでは、PTP デーモンスレッドが、残りのインフラストラクチャーコンポーネントとともに、限られた CPU リソースで実行されます。デフォルトでは、PTP スレッドは SCHED_OTHER ポリシーで実行されます。負荷が高いと、エラーなしで運用する必要のある、これらのスレッドのスケジューリングでレイテンシーが発生する可能性があります。

スケジューリングのレイテンシーでエラーが発生する可能性を軽減するために、SCHED_FIFO ポリシーでスレッドを実行できるように、PTP Operator の linuxptp サービスを設定できます。PtpConfig CR に SCHED_FIFO が設定されている場合には、ptp4lphc2sys は、PtpConfig CR の ptpSchedulingPriority フィールドで設定された優先順位で、chrt の下の親コンテナーで実行されます。

注記

ptpSchedulingPolicy の設定は任意です。レイテンシーエラーが発生している場合にのみ必要です。

手順

  1. PtpConfig CR プロファイルを編集します。

    $ oc edit PtpConfig -n openshift-ptp
  2. ptpSchedulingPolicyptpSchedulingPriority フィールドを変更します。

    apiVersion: ptp.openshift.io/v1
    kind: PtpConfig
    metadata:
      name: <ptp_config_name>
      namespace: openshift-ptp
    ...
    spec:
      profile:
      - name: "profile1"
    ...
        ptpSchedulingPolicy: SCHED_FIFO
        ptpSchedulingPriority: 10

    ここでは、以下のようになります。

    ptp スケジューリングポリシー: SCHED_FIFO
    ptp4l および phc2sys プロセスのスケジューリングポリシーを設定します。FIFO スケジューリングをサポートするシステムでは、SCHED_FIFO を使用してください。
    ptp スケジューリング優先度: 10
    ptp4l および phc2sys プロセスの FIFO 優先度の設定に使用する 1~65 の整数値を設定します。
  3. 保存して終了すると、PtpConfig CR に変更が適用されます。

検証

  1. PtpConfig CR が適用された linuxptp-daemon Pod と対応するノードの名前を取得します。

    $ 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

  2. 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

8.2.12. PTP ログ抑制の設定

linuxptp-daemon は、デバッグに使用できるログを生成します。ストレージ容量が制限されている通信業者などのデプロイメントタイプでは、これらのログによりストレージ需要が増大する可能性があります。現在、デフォルトのロギング率が高く、ログが 24 時間以内にローテーションされてしまうため、変更を追跡して問題を特定することが困難になっています。

マスターオフセット値を報告するログメッセージを除外するように PtpConfig カスタムリソース (CR) を設定することで基本的にログを削減できます。マスターオフセットログメッセージは、現在のノードのクロックとマスタークロックの差をナノ秒単位で報告します。ただし、この方法では、フィルタリングされたログの概要ステータスは表示されません。拡張ログ抑制機能を使用すると、PTP ログのログ記録レートを設定できます。特定のログ記録レートを設定すると、トラブルシューティングに不可欠な情報を保持しながら、linuxptp-daemon によって生成されるログの量を削減できます。拡張ログ抑制機能を使用すると、オフセットがそのしきい値よりも高い場合でもオフセットログを表示するしきい値も指定できます。

8.2.12.1. PTP のログフィルタリングの設定

PtpConfig カスタムリソース (CR) を変更して、基本的なログフィルタリングを設定し、マスターオフセット値を報告するログメッセージを除外します。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP Operator をインストールします。

手順

  1. PtpConfig CR を編集します。

    $ oc edit PtpConfig -n openshift-ptp
  2. 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 に戻すと、マスターオフセットメッセージを含めることができます。

  3. 保存して終了すると、PtpConfig CR に変更が適用されます。

検証

  1. PtpConfig CR が適用された linuxptp-daemon Pod と対応するノードの名前を取得します。

    $ 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

  2. 次のコマンドを実行して、マスターオフセットメッセージがログから除外されていることを確認します。

    $ oc -n openshift-ptp logs <linux_daemon_container> -c linuxptp-daemon-container | grep "master offset"
    • <linux_daemon_container>linuxptp-daemon Pod の名前です。たとえば 、linuxptp-daemon-gmv2n です

      logReduce 仕様を設定する場合、このコマンドは linuxptp デーモンのログに master offset のインスタンスを報告しません。

8.2.12.2. 拡張 PTP ログ抑制の設定

基本的なログ抑制を使用することで、頻繁に発生するログを効果的に除外します。ただし、フィルタリングされたログのまとめが定期的に必要な場合は、拡張ログ抑制機能を使用してください。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP Operator をインストールします。

手順

  1. PtpConfig カスタムリソース (CR) を編集します。

    $ oc edit PtpConfig -n openshift-ptp
  2. spec.profile セクションに ptpSettings.logReduce 仕様を追加し、値を enhanced に設定します。

    apiVersion: ptp.openshift.io/v1
    kind: PtpConfig
    metadata:
      name: <ptp_config_name>
      namespace: openshift-ptp
    ...
    spec:
      profile:
      - name: "profile1"
    ...
        ptpSettings:
          logReduce: "enhanced"
  3. オプション: サマリーログの間隔と、マスターオフセットログのしきい値 (ナノ秒単位) を設定します。たとえば、間隔を 60 秒、しきい値を 100 ナノ秒に設定するには、spec.profile セクションに ptpSettings.logReduce 仕様を追加し、値を enhanced 60s 100 に設定します。

    apiVersion: ptp.openshift.io/v1
    kind: PtpConfig
    metadata:
      name: <ptp_config_name>
      namespace: openshift-ptp
    spec:
      profile:
      - name: "profile1"
        ptpSettings:
          logReduce: "enhanced 60s 100"
    • デフォルトでは、値が指定されていない場合、linuxptp-daemon は 30 秒ごとにサマリーログを生成するように設定されています。この設定例では、デーモンは 60 秒ごとにサマリーログを生成し、マスターオフセットログのしきい値として 100 ナノ秒が設定されています。つまり、デーモンは指定された間隔でのみサマリーログを生成します。ただし、マスターからのクロックのオフセットがプラスまたはマイナス 100 ナノ秒を超えると、その特定のログエントリーが記録されます。
  4. オプション: マスターオフセットしきい値なしで間隔を設定するには、YAML で logReduce フィールドを enhanced 60s に設定します。

    apiVersion: ptp.openshift.io/v1
    kind: PtpConfig
    metadata:
      name: <ptp_config_name>
      namespace: openshift-ptp
    spec:
      profile:
      - name: "profile1"
        ptpSettings:
          logReduce: "enhanced 60s"
  5. 保存して終了すると、PtpConfig CR に変更が適用されます。

検証

  1. 次のコマンドを実行して、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

  2. 次のコマンドを実行して、マスターオフセットメッセージがログから除外されていることを確認します。

    $ oc -n openshift-ptp logs <linux_daemon_container> -c linuxptp-daemon-container | grep "master offset"
    • <linux_daemon_container>linuxptp-daemon Pod の名前です。たとえば、linuxptp-daemon-gmv2n です

8.2.13. 時刻同期の継続性を確保するために、GNSS フェイルオーバーを NTP に設定する

全地球航法衛星システム (GNSS) から Network Time Protocol (NTP) への自動フェイルオーバーにより、プライマリー信号が失われた場合でも時刻同期の継続性が維持され、通信事業者の運用におけるシステム安定性が確保されます。

通信事業者は、時刻同期の継続性とシステムの安定性を確保するために、時刻源の冗長性を必要とする。

OpenShift Container Platform は、同期を維持するための自動フェイルオーバー機能を提供します。このシステムは、主要な時刻ソースとして GNSS(phc2sys 社提供) を利用しています。妨害電波やアンテナの故障など、主要な信号の損失から保護するために、システムは自動的に二次的な時刻ソースである chronyd によって提供される NTP に切り替わります。信号が回復すると、システムは自動的に phc2sys に切り替わり、同期を再開します。

ts2phc.holdover パラメーターを秒単位で設定することで、時刻同期の安定性を制御できます。この値は、GNSS レシーバーなどの主要な時刻 (ToD) ソースが失われた後、内部制御アルゴリズムが PHC の同期を継続できる最大時間を決定します。アルゴリズムは、安定状態 (SERVO_LOCKED_STABLE) を維持している場合にのみ実行を継続できます。プロセスが設定された保持期間を過ぎると、回復不能な一次信号損失が発生したことを示します。システムはその後、NTP などの二次的な情報源へのフェイルオーバーを可能にする。

8.2.13.1. GNSS フェイルオーバー機能を備えた PTP グランドマスター設定の作成

衛星信号が利用できない場合に、全地球航法衛星システム (GNSS) から Network Time Protocol (NTP) への自動フェイルオーバー機能を備えた、Precision Time Protocol (PTP) 通信グランドマスタークロックを設定します。

この手順では、Intel E810 Westport Channel NIC を PTP グランドマスタークロックとして使用し、GNSS から NTP へのフェイルオーバー機能を備えた T-GM(Telecom Grandmaster) クロックを設定します。

前提条件

  • 実稼働環境の T-GM クロックの場合は、ベアメタルクラスターホストに Intel E810 Westport Channel NIC がインストールされている。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP Operator をインストールします。

手順

  1. 以下のコマンドを実行して、PTPOperator のインストールを確認してください。

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

    出力は、PTP Operator Pod と linuxptp-daemon Pod のリスト表示と類似しています。

    NAME                            READY   STATUS    RESTARTS   AGE   IP              NODE                       NOMINATED NODE   READINESS GATES
    linuxptp-daemon-4xk9m           2/2     Running   0          15m   192.168.1.101   worker-0.cluster.local     <none>           <none>
    linuxptp-daemon-7bv2n           2/2     Running   0          15m   192.168.1.102   worker-1.cluster.local     <none>           <none>
    linuxptp-daemon-9cp4r           2/2     Running   0          15m   192.168.1.103   worker-2.cluster.local     <none>           <none>
    linuxptp-daemon-kw8h5           2/2     Running   0          15m   192.168.1.104   worker-3.cluster.local     <none>           <none>
    linuxptp-daemon-m3j7t           2/2     Running   0          15m   192.168.1.105   worker-4.cluster.local     <none>           <none>
    ptp-operator-75c77dbf86-xm9kl   1/1     Running   0          20m   10.129.0.45     master-1.cluster.local     <none>           <none>
    • ptp-operator-*: PTPOperatorPod (クラスター内のインスタンスは 1 つ)
    • linuxptp-daemon-*: linuxptp デーモン Pod。PtpConfig プロファイルに一致する各ノード上で、デーモン Pod が実行されます。各デーモン Pod の READY 列に 2/2 と 表示され、両方のコンテナー (linuxptp-daemon-containerkube-rbac-proxy) が実行されていることを示します。

      注記

      linuxptp-daemon Pod の数は、DaemonSet のデプロイメントを制御する PtpOperatorConfig で定義されたノードラベルによって決定されます。ステップ 4 で示した PtpConfig プロファイルのマッチングは、実行中のデーモンに適用される特定の PTP 設定を決定するだけです。この例では、オペレーターの設定は 5 つのワーカーノードすべてを対象としています。シングルノードの OpenShift クラスターの場合、設定はワーカーとして機能するコントロールプレーンノードのみを対象としているため、linuxptp-daemon Pod は 1 つしか表示されません。

  2. 以下のコマンドを実行して、どのネットワークインターフェイスがハードウェアタイムスタンプをサポートしているかを確認してください。

    $ oc get NodePtpDevice -n openshift-ptp -o yaml

    出力は以下のようになり、PTP 対応ネットワークインターフェイスを持つノードの NodePtpDevice リソースを示します。

    apiVersion: v1
    items:
    - apiVersion: ptp.openshift.io/v1
      kind: NodePtpDevice
      metadata:
        name: worker-0.cluster.local
        namespace: openshift-ptp
      spec: {}
      status:
        devices:
        - name: ens7f0
          hwConfig:
            phcIndex: 0
        - name: ens7f1
          hwConfig:
            phcIndex: 1
    - apiVersion: ptp.openshift.io/v1
      kind: NodePtpDevice
      metadata:
        name: worker-1.cluster.local
        namespace: openshift-ptp
      spec: {}
      status:
        devices:
        - name: ens7f0
          hwConfig:
            phcIndex: 0
        - name: ens7f1
          hwConfig:
            phcIndex: 1
    kind: List
    metadata:
      resourceVersion: ""

    この例では出力されています。

    • ens7f0ens7f1 は PTP 対応インターフェイス (Intel E810 NIC ポート) です。
    • phcIndex は PTP ハードウェアクロック番号を示します (/dev/ptp0/dev/ptp1 などにマッピングされます)。

      注記

      出力には、PTP 対応インターフェイスを持つノードごとに 1 つの NodePtpDevice リソースが表示されます。この例では、5 つのワーカーノードに Intel E810 NIC が搭載されています。シングルノードの OpenShift クラスターの場合、NodePtpDevice リソースは 1 つしか表示されません。

  3. PTP プロファイルは、マッチングにノードラベルを使用します。マシン設定プール (MCP) を確認し、以下のコマンドを実行してノードラベルを見つけてください。

    $ oc get mcp

    出力は以下の例のようになります。

    NAME     CONFIG                   UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE
    master   rendered-master-a1b1**   True      False      False      3              3                   3                   0                    45d
    worker   rendered-worker-f6e5**   True      False      False      5              5                   5                   0                    45d
    注記

    CONFIG 列には、レンダリングされた MachineConfig の切り捨てられたハッシュ値が表示されます。実際の出力では、これは rendered-master-a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 のような 64 文字のハッシュになります。

    • この例では、<MCP-name> はワーカーノードの場合は worker、コントロールプレーンノードの場合は master となります。ほとんどの T-GM デプロイメントではワーカーノードを使用するため、<MCP-name> として worker を 使用します。
    • シングルノードの OpenShift クラスターの場合、<MCP-name>マスター です (ワーカー MCP には MACHINECOUNT が 0 と表示されます)。
  4. T-GM クロックを GNSS から NTP へのフェイルオーバーで設定する PtpConfig カスタムリソース (CR) を作成します。以下の YAML 設定を ptp-config-gnss-ntp-failover.yaml という名前のファイルに保存し、<MCP-name> を前の手順で取得したマシン設定プールの名前に置き換えてください。

    # The grandmaster profile is provided for testing only
    # It is not installed on production clusters
    apiVersion: ptp.openshift.io/v1
    kind: PtpConfig
    metadata:
      name: grandmaster
      namespace: openshift-ptp
      annotations:
        ran.openshift.io/ztp-deploy-wave: "10"
    spec:
      profile:
      - name: "grandmaster"
        ptp4lOpts: "-2 --summary_interval -4"
        phc2sysOpts: -r -u 0 -m -N 8 -R 16 -s ens7f0 -n 24
        ptpSchedulingPolicy: SCHED_FIFO
        ptpSchedulingPriority: 10
        ptpSettings:
          logReduce: "true"
    
        # --- FAILOVER CONFIGURATION ---
        # Holdover time: 14400 seconds (4 hours) before switching to NTP
        ts2phcOpts: "--ts2phc.holdover 14400"
    
        # Configure Chronyd (Secondary Time Source)
        chronydOpts: "-d"
        chronydConf: |
          server time.nist.gov iburst
          makestep 1.0 -1
          pidfile /var/run/chronyd.pid
    
        plugins:
          # E810 Hardware-Specific Configuration
          e810:
            enableDefaultConfig: false
            settings:
              LocalHoldoverTimeout: 14400
              LocalMaxHoldoverOffSet: 1500
              MaxInSpecOffset: 1500
            pins:
              # Syntax guide:
              # - The 1st number in each pair must be one of:
              #    0 - Disabled
              #    1 - RX
              #    2 - TX
              # - The 2nd number in each pair must match the channel number
              ens7f0:
                SMA1: 0 1
                SMA2: 0 2
                U.FL1: 0 1
                U.FL2: 0 2
            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
    
          # NTP Failover Plugin
          ntpfailover:
            gnssFailover: true
    
        # --- GNSS (ts2phc) CONFIGURATION (Primary Source) ---
        ts2phcConf: |
          [nmea]
          ts2phc.master 1
          [global]
          use_syslog  0
          verbose 1
          logging_level 7
          ts2phc.pulsewidth 100000000
          ts2phc.nmea_serialport /dev/ttyGNSS_1700_0
          leapfile  /usr/share/zoneinfo/leap-seconds.list
          [ens7f0]
          ts2phc.extts_polarity rising
          ts2phc.extts_correction 0
    
        # --- PTP4L CONFIGURATION (Grandmaster Role) ---
        ptp4lConf: |
          [ens7f0]
          masterOnly 1
          [ens7f1]
          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
        ptpClockThreshold:
          holdOverTimeout: 5
          maxOffsetThreshold: 100
          minOffsetThreshold: -100
      recommend:
      - profile: "grandmaster"
        priority: 4
        match:
        - nodeLabel: node-role.kubernetes.io/<MCP-name>
    重要

    例として挙げたインターフェイス名 (ens7f0ens7f1) を、手順 2 で見つけた実際の E810 NIC インターフェイス名に置き換えてください。一般的な E810 インターフェイスの命名パターンには、ens7f0ens8f0eth0enp2s0f0 などがあります。正確な名称は、システムファームウェアの設定と Linux ネットワークデバイスの命名規則によって異なります。また、/dev/ttyGNSS_1700_0 を実際の GNSS シリアルポートデバイスのパスに置き換えてください。シングルノードの OpenShift クラスターの場合は、nodeLabel の一致条件で <MCP-name> をmaster に置き換えてください。ワーカーノードを T-GM として使用するマルチノードクラスターの場合は、worker を使用します。

    設定には以下のコンポーネントが含まれます。

    • PTP4L のオプション:

      • -2: PTP バージョン 2 を使用する
      • --summary_interval -4: 2^(-4) = 0.0625 秒ごとにログサマリーを出力します
    • PHC2SYS のオプション:

      • -r: PTP ハードウェアクロックからシステムクロックを同期する
      • -u 0: 更新レート乗数
      • -m: メッセージを標準出力に表示する
      • -N 8: ptp4l のドメイン番号
      • -R 16: 更新レート
      • -s ens7f0: ソースインターフェイス (E810 インターフェイス名に置き換えてください)
      • -n 24: ドメイン番号
    • フェイルオーバー設定:

      • ts2phcOpts --ts2phc.holdover 14400: NTP に切り替える前に 4 時間ホールドオーバーします
      • chronydConf: フェイルオーバー用の NTP サーバー設定 。time.nist.gov を希望する NTP サーバーに置き換えてください。
      • ntpfailover プラグイン: gnssFailover: true で GNSS から NTP への自動切り替えを有効にします
    • E810 プラグインの設定:

      • LocalHoldoverTimeout: 14400: E810 ハードウェアホールドオーバータイムアウト (4 時間)
      • ピン:E810 の物理ピン (U.FL2、SMA1、SMA2、U.FL1) における 1PPS 入力の設定
      • ublxCmds:u-blox GNSS レシーバーを設定するためのコマンド (GPS の有効化、他の衛星システムの無効化、測量モードの設定)
    • GNSS (ts2phc) 設定:

      • ts2phc.nmea_serialport/dev/ttyGNSS_1700_0: GNSS シリアルポートデバイスパス (実際の GNSS デバイスに置き換えてください)
      • ts2phc.extts_polarity rising: 立ち上がりエッジで 1PPS 信号
      • ts2phc.pulsewidth 100000000: 1PPS パルス幅 (ナノ秒)
    • PTP4L の設定:

      • masterOnly 1: インターフェイスは PTP マスターとしてのみ機能します
      • clockClass 6:GPS 同期品質レベル
      • ドメイン番号 24:PTP ドメイン
      • clock_type BC: 境界クロックモード
      • time_stamping hardware: E810 NIC のハードウェアタイムスタンプを使用する
  5. 以下のコマンドを実行して、PtpConfig CR を適用します。

    $ oc apply -f ptp-config-gnss-ntp-failover.yaml

    出力は以下の例のようになります。

    ptpconfig.ptp.openshift.io/grandmaster created

検証

  1. PTP デーモンは 30 秒ごとにプロファイルの更新を確認します。約 30 秒待ってから、以下のコマンドを実行して確認してください。

    $ oc get ptpconfig -n openshift-ptp

    出力は以下の例のようになります。

    NAME           AGE
    grandmaster    2m
  2. NodePtpDevice でプロファイルが適用されているかどうかを確認するには、次のコマンドを実行します。<node_name> をノードのホスト名に置き換えてください。

    $ oc describe nodeptpdevice <node_name> -n openshift-ptp

    たとえば、ワーカーノードを持つマルチノードクラスターの場合: worker-0.cluster.local

    シングルノードの OpenShift クラスターの場合は、コントロールプレーンノード名を使用します。コントロールプレーンノード名は、以下のコマンドを実行することで確認できます。

    $ oc get nodes
  3. デーモンのログを監視して、プロファイルがロードされているかどうかを確認してください。

    $ oc get pods -n openshift-ptp | grep linuxptp-daemon

    次に、ログを確認し、<linuxptp-daemon-pod> を 前のコマンドで取得した実際の Pod 名に置き換えてください。

    $ oc logs -n openshift-ptp <linuxptp-daemon-pod> -c linuxptp-daemon-container --tail=100

    ログにおける成功指標は以下のとおりです。

    • プロファイルの読み込み - プロファイルを読み込んでいます
    • applyNodePTPProfiles 内 - プロファイルが適用されています
    • ノードエラーに対して PTP プロファイルが存在しません
  4. 以下のコマンドを実行して、chronyd の 状態を確認し、NTP がセカンダリー時刻ソースとして実行されていることを確認してください。

    $ oc logs -n openshift-ptp <linuxptp-daemon-pod> -c linuxptp-daemon-container | grep chronyd

    出力は以下の例のようになります。

    chronyd version 4.5 starting
    Added source ID#0000000001 (time.nist.gov)
  5. 以下のコマンドを実行して、GNSS/gpsd を確認してください。

    $ oc logs -n openshift-ptp <linuxptp-daemon-pod> -c linuxptp-daemon-container | grep gpsd

    GNSS が正常に機能している場合、出力には以下のように表示されます。

    • gpsd が正常に起動しました
    • そのようなファイルまたはディレクトリーは存在しません というエラーは存在しません。
  6. 以下のコマンドを実行して、ts2phc (GNSS 同期) の状態を確認してください。

    $ oc logs -n openshift-ptp <linuxptp-daemon-pod> -c linuxptp-daemon-container | grep ts2phc
  7. 以下のコマンドを実行して、phc2sys (システムクロック同期) の状態を確認してください。

    $ oc logs -n openshift-ptp <linuxptp-daemon-pod> -c linuxptp-daemon-container | grep phc2sys

    出力には、phc2sys の同期ステータスメッセージが表示されます。

    phc2sys[xxx]: CLOCK_REALTIME phc offset -17 s2 freq -13865 delay 2305

この手順では、Intel E810 Westport Channel NIC を PTP グランドマスタークロックとして使用し、GNSS から NTP へのフェイルオーバー機能を備えた、シングルノードの OpenShift 上に T-GM(Telecom Grandmaster) クロックを設定します。

前提条件

  • 実稼働環境で T-GM クロックを使用する場合は、ベアメタル設定のシングルノード OpenShift ホストに Intel E810 Westport Channel NIC をインストールしてください。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP Operator をインストールします。

手順

  1. 以下のコマンドを実行して、PTPOperator のインストールを確認してください。

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

    出力は以下のようになり、PTP Operator pod と単一の linuxptp-daemon pod がリスト表示されます。

    NAME                            READY   STATUS    RESTARTS   AGE   IP              NODE                   NOMINATED NODE   READINESS GATES
    linuxptp-daemon-xz8km           2/2     Running   0          15m   192.168.1.50    mysno-sno.demo.lab     <none>           <none>
    ptp-operator-75c77dbf86-xm9kl   1/1     Running   0          20m   10.129.0.45     mysno-sno.demo.lab     <none>           <none>
    • ptp-operator-*: PTP Operator Pod (クラスター内のインスタンスは 1 つ)。
    • linuxptp-daemon-*: linuxptp デーモン Pod。シングルノードの OpenShift では、マスターノード上で実行されるデーモン Pod は 1 つだけです。デーモン Pod の READY 列に 2/2 と 表示されていれば、両方のコンテナー (linuxptp-daemon-containerkube-rbac-proxy) が実行されていることを示しています。
  2. 以下のコマンドを実行して、どのネットワークインターフェイスがハードウェアタイムスタンプをサポートしているかを確認してください。

    $ oc get NodePtpDevice -n openshift-ptp -o yaml

    出力は以下の例のようになり、PTP 対応ネットワークインターフェイスを備えたシングルノードの OpenShift ノードの NodePtpDevice リソースを示しています。

    apiVersion: v1
    items:
    - apiVersion: ptp.openshift.io/v1
      kind: NodePtpDevice
      metadata:
        name: mysno-sno.demo.lab
        namespace: openshift-ptp
      spec: {}
      status:
        devices:
        - name: ens7f0
          hwConfig:
            phcIndex: 0
        - name: ens7f1
          hwConfig:
            phcIndex: 1
    kind: List
    metadata:
      resourceVersion: ""

    この例では出力されています。

    • ens7f0ens7f1 は PTP 対応インターフェイス (Intel E810 NIC ポート) です。
    • phcIndex は PTP ハードウェアクロック番号を示します (/dev/ptp0/dev/ptp1 などにマッピングされます)。

      注記

      シングルノードの OpenShift クラスターでは、単一のマスターノードに対して 1 つの NodePtpDevice リソースのみが表示されます。

  3. PTP プロファイルは、マッチングにノードラベルを使用します。マシン設定プール (MCP) を確認し、マスター MCP を検証するには、次のコマンドを実行します。

    $ oc get mcp

    出力は以下の例のようになります。

    NAME     CONFIG                  UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE
    master   rendered-master-a1b1*   True      False      False      1              1                   1                   0                    45d
    worker   rendered-worker-f6e5*   True      False      False      0              0                   0                   0                    45d
    注記

    CONFIG 列には、レンダリングされた MachineConfig の切り捨てられたハッシュ値が表示されます。実際の出力では、これは rendered-master-a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 のような 64 文字のハッシュになります。

    シングルノードの OpenShift クラスターでは、マスター MCP の MACHINECOUNT は 1(シングルノード) を示し、ワーカー MCP の MACHINECOUNT は 0 を示します。PTP プロファイルは マスター ノードラベルを対象とする必要があります。

  4. T-GM クロックを GNSS から NTP へのフェイルオーバーで設定する PtpConfig カスタムリソース (CR) を作成します。以下の YAML 設定を ptp-config-gnss-ntp-failover-sno.yaml という名前のファイルに保存してください。

    # The grandmaster profile is provided for testing only
    # It is not installed on production clusters
    apiVersion: ptp.openshift.io/v1
    kind: PtpConfig
    metadata:
      name: grandmaster
      namespace: openshift-ptp
      annotations:
        ran.openshift.io/ztp-deploy-wave: "10"
    spec:
      profile:
      - name: "grandmaster"
        ptp4lOpts: "-2 --summary_interval -4"
        phc2sysOpts: -r -u 0 -m -N 8 -R 16 -s ens7f0 -n 24
        ptpSchedulingPolicy: SCHED_FIFO
        ptpSchedulingPriority: 10
        ptpSettings:
          logReduce: "true"
    
        # --- FAILOVER CONFIGURATION ---
        # Holdover time: 14400 seconds (4 hours) before switching to NTP
        ts2phcOpts: "--ts2phc.holdover 14400"
    
        # Configure Chronyd (Secondary Time Source)
        chronydOpts: "-d"
        chronydConf: |
          server time.nist.gov iburst
          makestep 1.0 -1
          pidfile /var/run/chronyd.pid
    
        plugins:
          # E810 Hardware-Specific Configuration
          e810:
            enableDefaultConfig: false
            settings:
              LocalHoldoverTimeout: 14400
              LocalMaxHoldoverOffSet: 1500
              MaxInSpecOffset: 1500
            pins:
              # Syntax guide:
              # - The 1st number in each pair must be one of:
              #    0 - Disabled
              #    1 - RX
              #    2 - TX
              # - The 2nd number in each pair must match the channel number
              ens7f0:
                SMA1: 0 1
                SMA2: 0 2
                U.FL1: 0 1
                U.FL2: 0 2
            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
    
          # NTP Failover Plugin
          ntpfailover:
            gnssFailover: true
    
        # --- GNSS (ts2phc) CONFIGURATION (Primary Source) ---
        ts2phcConf: |
          [nmea]
          ts2phc.master 1
          [global]
          use_syslog  0
          verbose 1
          logging_level 7
          ts2phc.pulsewidth 100000000
          ts2phc.nmea_serialport /dev/ttyGNSS_1700_0
          leapfile  /usr/share/zoneinfo/leap-seconds.list
          [ens7f0]
          ts2phc.extts_polarity rising
          ts2phc.extts_correction 0
    
        # --- PTP4L CONFIGURATION (Grandmaster Role) ---
        ptp4lConf: |
          [ens7f0]
          masterOnly 1
          [ens7f1]
          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
        ptpClockThreshold:
          holdOverTimeout: 5
          maxOffsetThreshold: 100
          minOffsetThreshold: -100
      recommend:
      - profile: "grandmaster"
        priority: 4
        match:
        - nodeLabel: node-role.kubernetes.io/master
    重要

    例として挙げたインターフェイス名 (ens7f0ens7f1) を、手順 2 で見つけた実際の E810 NIC インターフェイス名に置き換えてください。一般的な E810 インターフェイスの命名パターンには、ens7f0ens8f0eth0enp2s0f0 などがあります。正確な名称は、システム BIOS の設定と Linux ネットワークデバイスの命名規則によって異なります。また、/dev/ttyGNSS_1700_0 を実際の GNSS シリアルポートデバイスのパスに置き換えてください。nodeLabelnode-role.kubernetes.io/master に設定されており、すべての役割を担うシングルノードの OpenShift マスターノードを対象としています。

    設定には以下のコンポーネントが含まれます。

    • PTP4L オプション:

      • -2: PTP バージョン 2 を使用する
      • --summary_interval -4: 2^(-4) = 0.0625 秒ごとにログサマリーを出力します
    • PHC2SYS のオプション:

      • -r: PTP ハードウェアクロックからシステムクロックを同期する
      • -u 0: 更新レート乗数
      • -m: メッセージを標準出力に表示する
      • -N 8: ptp4l のドメイン番号
      • -R 16: 更新レート
      • -s ens7f0: ソースインターフェイス (E810 インターフェイス名に置き換えてください)
      • -n 24: ドメイン番号
    • フェイルオーバー設定:

      • ts2phcOpts --ts2phc.holdover 14400: NTP に切り替える前に 4 時間ホールドオーバーします
      • chronydConf: フェイルオーバー用の NTP サーバー設定 。time.nist.gov を希望する NTP サーバーに置き換えてください。
      • ntpfailover プラグイン: gnssFailover: true で GNSS から NTP への自動切り替えを有効にします。
    • E810 プラグインの設定:

      • LocalHoldoverTimeout: 14400: E810 ハードウェアホールドオーバータイムアウト (4 時間)
      • ピン:E810 の物理ピン (U.FL2、SMA1、SMA2、U.FL1) における 1PPS 入力の設定
      • ublxCmds:u-blox GNSS レシーバーを設定するためのコマンド (GPS の有効化、他の衛星システムの無効化、測量モードの設定)
    • GNSS (ts2phc) 設定:

      • ts2phc.nmea_serialport/dev/ttyGNSS_1700_0: GNSS シリアルポートデバイスパス (実際の GNSS デバイスに置き換えてください)
      • ts2phc.extts_polarity rising: 立ち上がりエッジで 1PPS 信号
      • ts2phc.pulsewidth 100000000: 1PPS パルス幅 (ナノ秒)
    • PTP4L の設定:

      • masterOnly 1: インターフェイスは PTP マスターとしてのみ機能します
      • clockClass 6:GPS 同期品質レベル
      • ドメイン番号 24:PTP ドメイン
      • clock_type BC: 境界クロックモード
      • time_stamping hardware: E810 NIC のハードウェアタイムスタンプを使用する
  5. 以下のコマンドを実行して、PtpConfig CR を適用します。

    $ oc apply -f ptp-config-gnss-ntp-failover-sno.yaml

    出力は以下の例のようになります。

    ptpconfig.ptp.openshift.io/grandmaster created

検証

  1. PTP デーモンは 30 秒ごとにプロファイルの更新を確認します。約 30 秒待ってから、以下のコマンドを実行して確認してください。

    $ oc get ptpconfig -n openshift-ptp

    出力は以下の例のようになります。

    NAME           AGE
    grandmaster    2m
  2. プロファイルが適用されているかどうか、NodePtpDevice を確認してください。まず、シングルノードの OpenShift ノード名を取得します。

    $ oc get nodes

    出力は以下の例のようになります。

    NAME                 STATUS   ROLES                         AGE     VERSION
    mysno-sno.demo.lab   Ready    control-plane,master,worker   4h19m   v1.34.1

    次に、ノード名を使用して NodePtpDevice を記述します。

    $ oc describe nodeptpdevice mysno-sno.demo.lab -n openshift-ptp
  3. デーモンのログを監視して、プロファイルがロードされているかどうかを確認してください。まず、デーモン Pod 名を取得します。

    $ oc get pods -n openshift-ptp | grep linuxptp-daemon

    出力には、単一の linuxptp-daemonPod が表示されます。

    linuxptp-daemon-xz8km           2/2     Running   0          15m

    次に、Pod 名を使用してログを確認します。

    $ oc logs -n openshift-ptp linuxptp-daemon-xz8km -c linuxptp-daemon-container --tail=100

    ログにおける成功指標は以下のとおりです。

    • プロファイルの読み込み - プロファイルを読み込んでいます
    • applyNodePTPProfiles 内 - プロファイルが適用されています
    • ノードエラーに対して PTP プロファイルが存在しません
  4. 以下のコマンドを実行して、chronyd の 状態を確認し、NTP がセカンダリー時刻ソースとして実行されていることを確認してください。

    $ oc logs -n openshift-ptp linuxptp-daemon-xz8km -c linuxptp-daemon-container | grep chronyd

    出力は以下の例のようになります。

    chronyd version 4.5 starting
    Added source ID#0000000001 (time.nist.gov)
  5. 以下のコマンドを実行して、GNSS/gpsd を確認してください。

    $ oc logs -n openshift-ptp linuxptp-daemon-xz8km -c linuxptp-daemon-container | grep gpsd

    GNSS が正常に機能している場合、出力には以下のように表示されます。

    • gpsd が正常に起動しました
    • そのようなファイルまたはディレクトリーは存在しません というエラーは存在しません。
  6. 以下のコマンドを実行して、ts2phc (GNSS 同期) の状態を確認してください。

    $ oc logs -n openshift-ptp linuxptp-daemon-xz8km -c linuxptp-daemon-container | grep ts2phc
  7. 以下のコマンドを実行して、phc2sys (システムクロック同期) の状態を確認してください。

    $ oc logs -n openshift-ptp linuxptp-daemon-xz8km -c linuxptp-daemon-container | grep phc2sys

    出力には、phc2sys の同期ステータスメッセージが表示されます。

    phc2sys[xxx]: CLOCK_REALTIME phc offset -17 s2 freq -13865 delay 2305

8.2.14. 一般的な PTP Operator の問題のトラブルシューティング

以下の手順を実行して、PTP Operator で典型的な問題のトラブルシューティングを行います。

前提条件

  • OpenShift Container Platform CLI (oc) をインストールします。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP をサポートするホストを使用して、PTP Operator をベアメタルクラスターにインストールします。

手順

  1. 設定されたノードのクラスターに 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 高速イベントバスが有効な場合には、準備できた linuxptp-daemon Pod の数は 3/3 になります。PTP 高速イベントバスが有効になっていない場合、2/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

  3. ノードで利用可能な 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

  4. 対応するノードの linuxptp-daemon Pod にアクセスし、PTP インターフェイスがプライマリークロックに正常に同期されていることを確認します。

    1. 以下のコマンドを実行して、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

    2. リモートシェルが必要な linuxptp-daemon コンテナーへのリモートシェルです。

      $ oc rsh -n openshift-ptp -c linuxptp-daemon-container <linux_daemon_container>

      ここでは、以下のようになります。

      <linux_daemon_container>
      診断するコンテナーです (例: linuxptp-daemon-lmvgn)。
    3. linuxptp-daemon コンテナーへのリモートシェル接続では、PTP 管理クライアント (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

  5. GNSS をソースとするグランドマスタークロックの場合は、次のコマンドを実行して、ツリー内 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

  6. GNSS をソースとするグランドマスタークロックの場合は、linuxptp-daemon コンテナーが GNSS アンテナから信号を受信していることを確認します。コンテナーが 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

8.2.15. Intel 800 シリーズ NIC の CGU の DPLL ファームウェアバージョンを取得する

クラスターノードへのデバッグシェルを開き、NIC ハードウェアを照会することで、Intel 800 シリーズ NIC の Clock Generation Unit (CGU) の digital phase-locked loop (DPLL) ファームウェアバージョンを取得できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • クラスターホストに Intel 800 シリーズ NIC がインストールされている。
  • PTP をサポートするホストを含むベアメタルクラスターに PTP Operator をインストールしている。

手順

  1. 次のコマンドを実行してデバッグ Pod を起動します。

    $ oc debug node/<node_name>

    ここでは、以下のようになります。

    <node_name>
    Intel 800 シリーズ NIC をインストールしたノードです。
  2. 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
    fw.cgu 8032.16973825.6021

    ここでは、以下のようになります。

    cgu.id 36
    CGU ハードウェアのリビジョン番号。
    fw.cgu 8032.16973825.6021
    CGU で実行されている DPLL ファームウェアのバージョンは 6201、DPLL モデルは 8032 です。文字列 16973825 は、DPLL ファームウェアバージョン (1.3.0.1) のバイナリーバージョンの短縮表現です。
    注記

    ファームウェアバージョンには、先頭のニブルと、バージョン番号の各部分に対する 3 つのオクテットがあります。16973825 を 2 進数で表すと 0001 0000 0011 0000 0000 0000 0001 になります。バイナリー値を使用してファームウェアバージョンをデコードします。以下に例を示します。

    Expand
    表8.10 DPLL ファームウェアバージョン
    バイナリー部分10 進数値

    0001

    1

    0000 0011

    3

    0000 0000

    0

    0000 0001

    1

8.2.16. PTP Operator データの収集

oc adm must-gather コマンドを使用すると、PTP Operator に関連する機能やオブジェクトなど、クラスターに関する情報を収集できます。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • OpenShift CLI (oc) がインストールされている。
  • PTP Operator がインストールされている。

手順

  • must-gather を使用して PTP Operator データを収集するには、PTP Operator must-gather イメージを指定する必要があります。

    $ oc adm must-gather --image=registry.redhat.io/openshift4/ptp-must-gather-rhel9:v4.20

8.3. REST API v2 を使用した PTP イベントコンシューマーアプリケーションの開発

ベアメタルクラスターノードで Precision Time Protocol (PTP) イベントを利用するコンシューマーアプリケーションを開発する場合は、コンシューマーアプリケーションを別のアプリケーション Pod にデプロイします。コンシューマーアプリケーションは、PTP イベント REST API v2 を使用して PTP イベントをサブスクライブします。

注記

以下の情報は、PTP イベントを使用するコンシューマーアプリケーションを開発するための一般的なガイダンスです。完全なイベントコンシューマーアプリケーションの例は、この情報の範囲外です。

8.3.1. PTP 高速イベント通知フレームワークについて

Precision Time Protocol (PTP) 高速イベント REST API v2 を使用して、ベアメタルクラスターノードが生成する PTP イベントにクラスターアプリケーションをサブスクライブします。

注記

高速イベント通知フレームワークは、通信に REST API を使用します。PTP イベント REST API v2 は、O-RAN ALLIANCE Specifications で提供されている O-RAN O-Cloud Notification API Specification for Event Consumers 4.0 に基づいています。

8.3.2. PTP イベント REST API v2 を使用した PTP イベントの取得

アプリケーションは、プロデューサー側のクラウドイベントプロキシーサイドカーで O-RAN v4 互換の REST API を使用して PTP イベントをサブスクライブします。cloud-event-proxy サイドカーコンテナーは、プライマリーアプリケーションのリソースをまったく使用せずに、大幅な待機時間なしで、プライマリーアプリケーションコンテナーと同じリソースにアクセスできます。

図8.6 PTP イベントプロデューサー REST API v2 からの PTP 高速イベントの使用の概要

PTP イベントプロデューサー REST API からの PTP 高速イベントの使用の概要
20 イベントはクラスターホスト上で生成されます
PTP Operator が管理する Pod の linuxptp-daemon プロセスは、Kubernetes DaemonSet として実行され、さまざまな linuxptp プロセス (ptp4lphc2sys、およびオプションでグランドマスタークロック用の ts2phc) を管理します。linuxptp-daemon は、イベントを UNIX ドメインソケットに渡します。
20 イベントはクラウドイベントプロキシーサイドカーに渡されます
PTP プラグインは、UNIX ドメインソケットからイベントを読み取り、PTP Operator が管理する Pod 内の cloud-event-proxy サイドカーに渡します。cloud-event-proxy は、イベントを Kubernetes インフラストラクチャーから Cloud-Native Network Functions (CNF) に低レイテンシーで配信します。
20 イベントが公開されました
PTP Operator 管理 Pod 内の cloud-event-proxy サイドカーはイベントを処理し、PTP イベント REST API v2 を使用してイベントを公開します。
20 コンシューマーアプリケーションが購読を要求し、購読したイベントを受信する
コンシューマーアプリケーションは、プロデューサー cloud-event-proxy サイドカーに API リクエストを送信して、PTP イベントサブスクリプションを作成します。サブスクライブされると、コンシューマーアプリケーションはリソース修飾子で指定されたアドレスをリッスンし、PTP イベントを受信して処理します。

8.3.3. PTP 高速イベント通知パブリッシャーの設定

クラスター内のネットワークインターフェイスの PTP 高速イベント通知の使用を開始するには、PTP Operator PtpOperatorConfig カスタムリソース (CR) で高速イベントパブリッシャーを有効にし、作成する PtpConfig CR に ptpClockThreshold 値を設定する必要があります。

前提条件

  • OpenShift Container Platform CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP Operator がインストールされている。

手順

  1. デフォルトの PTP Operator 設定を変更して、PTP 高速イベントを有効にします。

    1. 次の YAML を ptp-operatorconfig.yaml ファイルに保存します。

      apiVersion: ptp.openshift.io/v1
      kind: PtpOperatorConfig
      metadata:
        name: default
        namespace: openshift-ptp
      spec:
        daemonNodeSelector:
          node-role.kubernetes.io/worker: ""
        ptpEventConfig:
          enableEventPublisher: true 
      1
      1
      enableEventPublishertrue に設定して、PTP 高速イベント通知を有効にします。
    2. PtpOperatorConfig CR を更新します。

      $ oc apply -f ptp-operatorconfig.yaml
  2. PTP 対応インターフェイスの PtpConfig カスタムリソースを作成し、ptpClockThreshold および ptp4lOpts に必要な値を設定します。次の YAML は、PtpConfig CR で設定する必要のある値 (必須) を示しています。

    spec:
      profile:
      - name: "profile1"
        interface: "enp5s0f0"
        ptp4lOpts: "-2 -s --summary_interval -4" 
    1
    
        phc2sysOpts: "-a -r -m -n 24 -N 8 -R 16" 
    2
    
        ptp4lConf: "" 
    3
    
        ptpClockThreshold: 
    4
    
          holdOverTimeout: 5
          maxOffsetThreshold: 100
          minOffsetThreshold: -100
    1
    --summary_interval -4 を追加して、PTP 高速イベントを使用します。
    2
    phc2sysOpts の値が必要です。-m はメッセージを stdout に出力します。linuxptp-daemon DaemonSet はログを解析し、Prometheus メトリクスを生成します。
    3
    デフォルトの /etc/ptp4l.conf ファイルを置き換える設定が含まれる文字列を指定します。デフォルト設定を使用するには、フィールドを空のままにします。
    4
    オプション: ptpClockThreshold スタンザが存在しない場合は、ptpClockThreshold フィールドにデフォルト値が使用されます。スタンザは、デフォルトの ptpClockThreshold 値を示します。ptpClockThreshold 値は、PTP マスタークロックが PTP イベントが発生する前に切断されてからの期間を設定します。holdOverTimeout は、PTP マスタークロックが切断されたときに、PTP クロックイベントの状態が FREERUN に変わるまでの時間値 (秒単位) です。maxOffsetThreshold および minOffsetThreshold 設定は、CLOCK_REALTIME (phc2sys) またはマスターオフセット (ptp4l) の値と比較するナノ秒単位のオフセット値を設定します。ptp4l または phc2sys のオフセット値がこの範囲外の場合、PTP クロックの状態が FREERUN に設定されます。オフセット値がこの範囲内にある場合、PTP クロックの状態が LOCKED に設定されます。

8.3.4. PTP イベント REST API v2 コンシューマーアプリケーションリファレンス

PTP イベントコンシューマーアプリケーションには次の機能が必要です。

  1. POST ハンドラーで実行され、クラウドネイティブ PTP イベントの JSON ペイロードを受信する Web サービス
  2. PTP イベントプロデューサーをサブスクライブするための createSubscription 関数
  3. PTP イベントプロデューサーの現在の状態をポーリングする getCurrentState 関数

次の Go スニペットの例は、これらの要件を示しています。

Go での PTP イベントコンシューマーサーバー関数の例

func server() {
  http.HandleFunc("/event", getEvent)
  http.ListenAndServe(":9043", nil)
}

func getEvent(w http.ResponseWriter, req *http.Request) {
  defer req.Body.Close()
  bodyBytes, err := io.ReadAll(req.Body)
  if err != nil {
    log.Errorf("error reading event %v", err)
  }
  e := string(bodyBytes)
  if e != "" {
    processEvent(bodyBytes)
    log.Infof("received event %s", string(bodyBytes))
  }
  w.WriteHeader(http.StatusNoContent)
}

PTP イベントの例 Go の createSubscription 関数

import (
"github.com/redhat-cne/sdk-go/pkg/pubsub"
"github.com/redhat-cne/sdk-go/pkg/types"
v1pubsub "github.com/redhat-cne/sdk-go/v1/pubsub"
)

// Subscribe to PTP events using v2 REST API
s1,_:=createsubscription("/cluster/node/<node_name>/sync/sync-status/sync-state")
s2,_:=createsubscription("/cluster/node/<node_name>/sync/ptp-status/lock-state")
s3,_:=createsubscription("/cluster/node/<node_name>/sync/gnss-status/gnss-sync-status")
s4,_:=createsubscription("/cluster/node/<node_name>/sync/sync-status/os-clock-sync-state")
s5,_:=createsubscription("/cluster/node/<node_name>/sync/ptp-status/clock-class")

// Create PTP event subscriptions POST
func createSubscription(resourceAddress string) (sub pubsub.PubSub, err error) {
  var status int
  apiPath := "/api/ocloudNotifications/v2/"
  localAPIAddr := "consumer-events-subscription-service.cloud-events.svc.cluster.local:9043" // vDU service API address
  apiAddr := "ptp-event-publisher-service-<node_name>.openshift-ptp.svc.cluster.local:9043" 
1

  apiVersion := "2.0"

  subURL := &types.URI{URL: url.URL{Scheme: "http",
    Host: apiAddr
    Path: fmt.Sprintf("%s%s", apiPath, "subscriptions")}}
  endpointURL := &types.URI{URL: url.URL{Scheme: "http",
    Host: localAPIAddr,
    Path: "event"}}

  sub = v1pubsub.NewPubSub(endpointURL, resourceAddress, apiVersion)
  var subB []byte

  if subB, err = json.Marshal(&sub); err == nil {
    rc := restclient.New()
    if status, subB = rc.PostWithReturn(subURL, subB); status != http.StatusCreated {
      err = fmt.Errorf("error in subscription creation api at %s, returned status %d", subURL, status)
    } else {
      err = json.Unmarshal(subB, &sub)
    }
  } else {
    err = fmt.Errorf("failed to marshal subscription for %s", resourceAddress)
  }
  return
}

1
<node_name> を、PTP イベントを生成しているノードの FQDN に置き換えます。compute-1.example.com はその例です。

Go の PTP イベントコンシューマー getCurrentState 関数の例

//Get PTP event state for the resource
func getCurrentState(resource string) {
  //Create publisher
  url := &types.URI{URL: url.URL{Scheme: "http",
    Host: "ptp-event-publisher-service-<node_name>.openshift-ptp.svc.cluster.local:9043", 
1

    Path: fmt.SPrintf("/api/ocloudNotifications/v2/%s/CurrentState",resource}}
  rc := restclient.New()
  status, event := rc.Get(url)
  if status != http.StatusOK {
    log.Errorf("CurrentState:error %d from url %s, %s", status, url.String(), event)
  } else {
    log.Debugf("Got CurrentState: %s ", event)
  }
}

1
<node_name> を、PTP イベントを生成しているノードの FQDN に置き換えます。compute-1.example.com はその例です。

PTP イベント REST API v2 で使用するために PTP イベントコンシューマーアプリケーションをデプロイする場合は、次の PTP イベントコンシューマーカスタムリソース (CR) の例を参照として使用します。

参照クラウドイベントコンシューマー namespace

apiVersion: v1
kind: Namespace
metadata:
  name: cloud-events
  labels:
    security.openshift.io/scc.podSecurityLabelSync: "false"
    pod-security.kubernetes.io/audit: "privileged"
    pod-security.kubernetes.io/enforce: "privileged"
    pod-security.kubernetes.io/warn: "privileged"
    name: cloud-events
    openshift.io/cluster-monitoring: "true"
  annotations:
    workload.openshift.io/allowed: management

リファレンスクラウドイベントコンシューマーのデプロイメント

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cloud-consumer-deployment
  namespace: cloud-events
  labels:
    app: consumer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: consumer
  template:
    metadata:
      annotations:
        target.workload.openshift.io/management: '{"effect": "PreferredDuringScheduling"}'
      labels:
        app: consumer
    spec:
      nodeSelector:
        node-role.kubernetes.io/worker: ""
      serviceAccountName: consumer-sa
      containers:
        - name: cloud-event-consumer
          image: cloud-event-consumer
          imagePullPolicy: Always
          args:
            - "--local-api-addr=consumer-events-subscription-service.cloud-events.svc.cluster.local:9043"
            - "--api-path=/api/ocloudNotifications/v2/"
            - "--http-event-publishers=ptp-event-publisher-service-NODE_NAME.openshift-ptp.svc.cluster.local:9043"
          env:
            - name: NODE_NAME
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
            - name: CONSUMER_TYPE
              value: "PTP"
            - name: ENABLE_STATUS_CHECK
              value: "true"
      volumes:
        - name: pubsubstore
          emptyDir: {}

参照クラウドイベントコンシューマーサービスアカウント

apiVersion: v1
kind: ServiceAccount
metadata:
  name: consumer-sa
  namespace: cloud-events

リファレンスクラウドイベントコンシューマーサービス

apiVersion: v1
kind: Service
metadata:
  annotations:
    prometheus.io/scrape: "true"
  name: consumer-events-subscription-service
  namespace: cloud-events
  labels:
    app: consumer-service
spec:
  ports:
    - name: sub-port
      port: 9043
  selector:
    app: consumer
  sessionAffinity: None
  type: ClusterIP

8.3.6. REST API v2 を使用した PTP イベントのサブスクライブ

cloud-event-consumer アプリケーションコンテナーをデプロイし、PTP Operator が管理する Pod 内の cloud-event-proxy コンテナーが投稿する PTP イベントに cloud-event-consumer アプリケーションをサブスクライブします。

適切なサブスクリプション要求ペイロードを渡して、http://ptp-event-publisher-service-NODE_NAME.openshift-ptp.svc.cluster.local:9043/api/ocloudNotifications/v2/subscriptionsPOST 要求を送信することにより、コンシューマーアプリケーションを PTP イベントにサブスクライブします。

注記

9043 は、PTP イベントプロデューサー Pod にデプロイされた cloud-event-proxy コンテナーのデフォルトポートです。必要に応じて、アプリケーションに異なるポートを設定できます。

アプリケーション Pod 内の cloud-event-consumer コンテナーが Precision Time Protocol (PTP) イベントを受信していることを確認します。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP Operator をインストールして設定している。
  • クラウドイベントアプリケーション Pod と PTP イベントコンシューマーアプリケーションをデプロイしている。

手順

  1. デプロイされたイベントコンシューマーアプリケーションのログを確認します。たとえば、以下のコマンドを実行します。

    $ oc -n cloud-events logs -f deployment/cloud-consumer-deployment

    出力例

    time = "2024-09-02T13:49:01Z"
    level = info msg = "transport host path is set to  ptp-event-publisher-service-compute-1.openshift-ptp.svc.cluster.local:9043"
    time = "2024-09-02T13:49:01Z"
    level = info msg = "apiVersion=2.0, updated apiAddr=ptp-event-publisher-service-compute-1.openshift-ptp.svc.cluster.local:9043, apiPath=/api/ocloudNotifications/v2/"
    time = "2024-09-02T13:49:01Z"
    level = info msg = "Starting local API listening to :9043"
    time = "2024-09-02T13:49:06Z"
    level = info msg = "transport host path is set to  ptp-event-publisher-service-compute-1.openshift-ptp.svc.cluster.local:9043"
    time = "2024-09-02T13:49:06Z"
    level = info msg = "checking for rest service health"
    time = "2024-09-02T13:49:06Z"
    level = info msg = "health check http://ptp-event-publisher-service-compute-1.openshift-ptp.svc.cluster.local:9043/api/ocloudNotifications/v2/health"
    time = "2024-09-02T13:49:07Z"
    level = info msg = "rest service returned healthy status"
    time = "2024-09-02T13:49:07Z"
    level = info msg = "healthy publisher; subscribing to events"
    time = "2024-09-02T13:49:07Z"
    level = info msg = "received event {\"specversion\":\"1.0\",\"id\":\"ab423275-f65d-4760-97af-5b0b846605e4\",\"source\":\"/sync/ptp-status/clock-class\",\"type\":\"event.sync.ptp-status.ptp-clock-class-change\",\"time\":\"2024-09-02T13:49:07.226494483Z\",\"data\":{\"version\":\"1.0\",\"values\":[{\"ResourceAddress\":\"/cluster/node/compute-1.example.com/ptp-not-set\",\"data_type\":\"metric\",\"value_type\":\"decimal64.3\",\"value\":\"0\"}]}}"

  2. オプション: linuxptp-daemon デプロイメントから oc とポート転送ポート 9043 を使用して REST API をテストします。たとえば、以下のコマンドを実行します。

    $ oc port-forward -n openshift-ptp ds/linuxptp-daemon 9043:9043

    出力例

    Forwarding from 127.0.0.1:9043 -> 9043
    Forwarding from [::1]:9043 -> 9043
    Handling connection for 9043

    新しいシェルプロンプトを開き、REST API v2 エンドポイントをテストします。

    $ curl -X GET http://localhost:9043/api/ocloudNotifications/v2/health

    出力例

    OK

8.3.8. PTP 高速イベントメトリクスのモニタリング

linuxptp-daemon が実行されているクラスターノードから PTP 高速イベントメトリクスを監視できます。事前に設定された自己更新型の Prometheus モニタリングスタックを使用して、OpenShift Container Platform Web コンソールで PTP 高速イベントメトリクスをモニタリングできます。

前提条件

  • OpenShift Container Platform CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • PTP 対応ハードウェアを搭載したノードに PTP Operator をインストールし、設定します。

手順

  1. 次のコマンドを実行して、ノードのデバッグ Pod を起動します。

    $ oc debug node/<node_name>
  2. linuxptp-daemon コンテナーによって公開された PTP メトリクスを確認します。たとえば、以下のコマンドを実行します。

    sh-4.4# curl http://localhost:9091/metrics

    出力例

    # HELP cne_api_events_published Metric to get number of events published by the rest api
    # TYPE cne_api_events_published gauge
    cne_api_events_published{address="/cluster/node/compute-1.example.com/sync/gnss-status/gnss-sync-status",status="success"} 1
    cne_api_events_published{address="/cluster/node/compute-1.example.com/sync/ptp-status/lock-state",status="success"} 94
    cne_api_events_published{address="/cluster/node/compute-1.example.com/sync/ptp-status/class-change",status="success"} 18
    cne_api_events_published{address="/cluster/node/compute-1.example.com/sync/sync-status/os-clock-sync-state",status="success"} 27

  3. オプション: cloud-event-proxy コンテナーのログでも PTP イベントを見つけることができます。たとえば、以下のコマンドを実行します。

    $ oc logs -f linuxptp-daemon-cvgr6 -n openshift-ptp -c cloud-event-proxy
  4. OpenShift Container Platform Web コンソールで PTP イベントを表示するには、クエリーする PTP メトリクスの名前 (例: openshift_ptp_offset_ns) をコピーします。
  5. OpenShift Container Platform Web コンソールで、ObserveMetrics をクリックします。
  6. PTP メトリクスを Expression フィールドに貼り付け、Run queries をクリックします。

8.3.9. PTP 高速イベントメトリクスのリファレンス

次の表は、linuxptp-daemon サービスが実行されているクラスターノードから利用できる PTP 高速イベントメトリクスを説明します。

Expand
表8.11 PTP 高速イベントメトリクス
メトリクス説明

openshift_ptp_clock_class

インターフェイスの PTP クロッククラスを返します。PTP クロッククラスの可能な値は、6 (LOCKED)、7 (PRC UNLOCKED IN-SPEC)、52 (PRC UNLOCKED OUT-OF-SPEC)、187 (PRC UNLOCKED OUT-OF-SPEC)、135 (T-BC HOLDOVER IN-SPEC)、165 (T-BC HOLDOVER OUT-OF-SPEC)、248 (DEFAULT)、または 255 (SLAVE ONLY CLOCK) です。

{node="compute-1.example.com",process="ptp4l"} 6

openshift_ptp_clock_state

インターフェイスの現在の PTP クロック状態を返します。PTP クロック状態の可能な値は、FREERUNLOCKED、または HOLDOVER です。

{iface="CLOCK_REALTIME", node="compute-1.example.com", process="phc2sys"} 1

openshift_ptp_delay_ns

タイミングパケットを送信するプライマリークロックとタイミングパケットを受信するセカンダリークロックの間の遅延をナノ秒単位で返します。

{from="master", iface="ens2fx", node="compute-1.example.com", process="ts2phc"} 0

openshift_ptp_ha_profile_status

異なる NIC に複数のタイムソースがある場合に、高可用性システムクロックの現在のステータスを返します。可能な値は 0 (INACTIVE) と 1 (ACTIVE) です。

{node="node1",process="phc2sys",profile="profile1"} 1 {node="node1",process="phc2sys",profile="profile2"} 0

openshift_ptp_frequency_adjustment_ns

2 つの PTP クロック間の周波数調整をナノ秒単位で返します。たとえば、アップストリームクロックと NIC の間、システムクロックと NIC の間、または PTP ハードウェアクロック (phc) と NIC の間などです。

{from="phc", iface="CLOCK_REALTIME", node="compute-1.example.com", process="phc2sys"} -6768

openshift_ptp_interface_role

インターフェイスに設定された PTP クロックの役割を返します。可能な値は、0 (PASSIVE)、1 (SLAVE)、2 (MASTER)、3 (FAULTY)、4 (UNKNOWN)、または 5 (LISTENING) です。

{iface="ens2f0", node="compute-1.example.com", process="ptp4l"} 2

openshift_ptp_max_offset_ns

2 つのクロックまたはインターフェイス間の最大オフセットをナノ秒単位で返します。たとえば、アップストリーム GNSS クロックと NIC (ts2phc) の間、または PTP ハードウェアクロック (phc) とシステムクロック (phc2sys) の間などです。

{from="master", iface="ens2fx", node="compute-1.example.com", process="ts2phc"} 1.038099569e+09

openshift_ptp_offset_ns

DPLL クロックまたは GNSS クロックソースと NIC ハードウェアクロック間のオフセットをナノ秒単位で返します。

{from="phc", iface="CLOCK_REALTIME", node="compute-1.example.com", process="phc2sys"} -9

openshift_ptp_process_restart_count

ptp4l および ts2phc プロセスが再起動した回数を返します。

{config="ptp4l.0.config", node="compute-1.example.com",process="phc2sys"} 1

openshift_ptp_process_status

PTP プロセスが実行中かどうかを示すステータスコードを返します。

{config="ptp4l.0.config", node="compute-1.example.com",process="phc2sys"} 1

openshift_ptp_threshold

HoldOverTimeoutMaxOffsetThreshold、および MinOffsetThreshold の値を返します。

  • holdOverTimeout は、PTP マスタークロックが切断されたときに、PTP クロックイベントの状態が FREERUN に変わるまでの時間値 (秒単位) です。
  • maxOffsetThreshold および minOffsetThreshold は、NIC の PtpConfig CR で設定した CLOCK_REALTIME (phc2sys) またはマスターオフセット (ptp4l) の値と比較されるナノ秒単位のオフセット値です。

{node="compute-1.example.com", profile="grandmaster", threshold="HoldOverTimeout"} 5

8.3.9.1. T-GM が有効な場合のみ PTP 高速イベントメトリクス

次の表は、PTP グランドマスタークロック (T-GM) が有効な場合にのみ使用できる PTP 高速イベントメトリクスを示しています。

Expand
表8.12 T-GM が有効な場合の PTP 高速イベントメトリクス
メトリクス説明

openshift_ptp_frequency_status

NIC の Digital Phase-Locked Loop (DPLL) 周波数の現在のステータスを返します。可能な値は、-1 (UNKNOWN)、0 (INVALID)、1 (FREERUN)、2 (LOCKED)、3 (LOCKED_HO_ACQ)、または 4 (HOLDOVER) です。

{from="dpll",iface="ens2fx",node="compute-1.example.com",process="dpll"} 3

openshift_ptp_nmea_status

NMEA 接続の現在のステータスを返します。NMEA は、1PPS NIC 接続に使用されるプロトコルです。可能な値は 0 (UNAVAILABLE) と 1 (AVAILABLE) です。

{iface="ens2fx",node="compute-1.example.com",process="ts2phc"} 1

openshift_ptp_phase_status

NIC の DPLL 位相のステータスを返します。可能な値は、-1 (UNKNOWN)、0 (INVALID)、1 (FREERUN)、2 (LOCKED)、3 (LOCKED_HO_ACQ)、または 4 (HOLDOVER) です。

{from="dpll",iface="ens2fx",node="compute-1.example.com",process="dpll"} 3

openshift_ptp_pps_status

NIC 1PPS 接続の現在のステータスを返します。1PPS 接続は、接続された NIC 間のタイミングを同期するために使用します。可能な値は 0 (UNAVAILABLE) と 1 (AVAILABLE) です。

{from="dpll",iface="ens2fx",node="compute-1.example.com",process="dpll"} 1

openshift_ptp_gnss_status

Global Navigation Satellite System (GNSS) 接続の現在のステータスを返します。GNSS は、衛星ベースの測位、ナビゲーション、およびタイミングサービスを世界中に提供します。可能な値は、0 (NOFIX)、1 (DEAD RECKONING ONLY)、2 (2D-FIX)、3 (3D-FIX)、4 (GPS+DEAD RECKONING FIX)、5 (TIME ONLY FIX) です。

{from="gnss",iface="ens2fx",node="compute-1.example.com",process="gnss"} 3

8.4. PTP イベント REST API v2 リファレンス

次の REST API v2 エンドポイントを使用して、cloud-event-consumer アプリケーションを、Precision Time Protocol (PTP) イベントプロデューサー Pod の http://ptp-event-publisher-service-NODE_NAME.openshift-ptp.svc.cluster.local:9043/api/ocloudNotifications/v2 に投稿された PTP イベントにサブスクライブします。

8.4.1. PTP イベント REST API v2 エンドポイント

8.4.1.1. api/ocloudNotifications/v2/subscriptions
HTTP メソッド

GET api/ocloudNotifications/v2/subscriptions

説明

サブスクリプションのリストを返します。サブスクリプションが存在する場合は、サブスクリプションの一覧とともに 200 OK のステータスコードが返されます。

API 応答の例

[
 {
  "ResourceAddress": "/cluster/node/compute-1.example.com/sync/sync-status/os-clock-sync-state",
  "EndpointUri": "http://consumer-events-subscription-service.cloud-events.svc.cluster.local:9043/event",
  "SubscriptionId": "ccedbf08-3f96-4839-a0b6-2eb0401855ed",
  "UriLocation": "http://ptp-event-publisher-service-compute-1.openshift-ptp.svc.cluster.local:9043/api/ocloudNotifications/v2/subscriptions/ccedbf08-3f96-4839-a0b6-2eb0401855ed"
 },
 {
  "ResourceAddress": "/cluster/node/compute-1.example.com/sync/ptp-status/clock-class",
  "EndpointUri": "http://consumer-events-subscription-service.cloud-events.svc.cluster.local:9043/event",
  "SubscriptionId": "a939a656-1b7d-4071-8cf1-f99af6e931f2",
  "UriLocation": "http://ptp-event-publisher-service-compute-1.openshift-ptp.svc.cluster.local:9043/api/ocloudNotifications/v2/subscriptions/a939a656-1b7d-4071-8cf1-f99af6e931f2"
 },
 {
  "ResourceAddress": "/cluster/node/compute-1.example.com/sync/ptp-status/lock-state",
  "EndpointUri": "http://consumer-events-subscription-service.cloud-events.svc.cluster.local:9043/event",
  "SubscriptionId": "ba4564a3-4d9e-46c5-b118-591d3105473c",
  "UriLocation": "http://ptp-event-publisher-service-compute-1.openshift-ptp.svc.cluster.local:9043/api/ocloudNotifications/v2/subscriptions/ba4564a3-4d9e-46c5-b118-591d3105473c"
 },
 {
  "ResourceAddress": "/cluster/node/compute-1.example.com/sync/gnss-status/gnss-sync-status",
  "EndpointUri": "http://consumer-events-subscription-service.cloud-events.svc.cluster.local:9043/event",
  "SubscriptionId": "ea0d772e-f00a-4889-98be-51635559b4fb",
  "UriLocation": "http://ptp-event-publisher-service-compute-1.openshift-ptp.svc.cluster.local:9043/api/ocloudNotifications/v2/subscriptions/ea0d772e-f00a-4889-98be-51635559b4fb"
 },
 {
  "ResourceAddress": "/cluster/node/compute-1.example.com/sync/sync-status/sync-state",
  "EndpointUri": "http://consumer-events-subscription-service.cloud-events.svc.cluster.local:9043/event",
  "SubscriptionId": "762999bf-b4a0-4bad-abe8-66e646b65754",
  "UriLocation": "http://ptp-event-publisher-service-compute-1.openshift-ptp.svc.cluster.local:9043/api/ocloudNotifications/v2/subscriptions/762999bf-b4a0-4bad-abe8-66e646b65754"
 }
]

HTTP メソッド

POST api/ocloudNotifications/v2/subscriptions

説明

適切なペイロードを渡すことで、必要なイベントの新しいサブスクリプションを作成します。

次の PTP イベントをサブスクライブできます。

  • sync-state イベント
  • lock-state イベント
  • gnss-sync-status events イベント
  • os-clock-sync-state イベント
  • clock-class イベント
Expand
表8.13 クエリーパラメーター
パラメーター

subscription

data

同期状態サブスクリプションペイロードの例

{
"EndpointUri": "http://consumer-events-subscription-service.cloud-events.svc.cluster.local:9043/event",
"ResourceAddress": "/cluster/node/{node_name}/sync/sync-status/sync-state"
}

PTP ロック状態イベントサブスクリプションペイロードの例

{
"EndpointUri": "http://consumer-events-subscription-service.cloud-events.svc.cluster.local:9043/event",
"ResourceAddress": "/cluster/node/{node_name}/sync/ptp-status/lock-state"
}

PTP gnss-sync-status イベントサブスクリプションペイロードの例

{
"EndpointUri": "http://consumer-events-subscription-service.cloud-events.svc.cluster.local:9043/event",
"ResourceAddress": "/cluster/node/{node_name}/sync/gnss-status/gnss-sync-status"
}

PTP os-clock-sync-state イベントサブスクリプションペイロードの例

{
"EndpointUri": "http://consumer-events-subscription-service.cloud-events.svc.cluster.local:9043/event",
"ResourceAddress": "/cluster/node/{node_name}/sync/sync-status/os-clock-sync-state"
}

PTP clock-class イベントサブスクリプションペイロードの例

{
"EndpointUri": "http://consumer-events-subscription-service.cloud-events.svc.cluster.local:9043/event",
"ResourceAddress": "/cluster/node/{node_name}/sync/ptp-status/clock-class"
}

API 応答の例

{
    "ResourceAddress": "/cluster/node/compute-1.example.com/sync/ptp-status/lock-state",
    "EndpointUri": "http://consumer-events-subscription-service.cloud-events.svc.cluster.local:9043/event",
    "SubscriptionId": "620283f3-26cd-4a6d-b80a-bdc4b614a96a",
    "UriLocation": "http://ptp-event-publisher-service-compute-1.openshift-ptp.svc.cluster.local:9043/api/ocloudNotifications/v2/subscriptions/620283f3-26cd-4a6d-b80a-bdc4b614a96a"
}

次のサブスクリプションステータスイベントが発生する可能性があります。

Expand
表8.14 PTP イベントの REST API v2 サブスクリプションステータスコード
ステータスコード説明

201 Created

サブスクリプションが作成されたことを示します。

400 Bad Request

リクエストが不正または無効であったため、サーバーが要求を処理できなかったことを示します。

404 Not Found

サブスクリプションリソースが利用できないことを示します。

409 Conflict

サブスクリプションがすでに存在することを示します。

HTTP メソッド

DELETE api/ocloudNotifications/v2/subscriptions

説明

すべてのサブスクリプションを削除します。

API 応答の例

{
"status": "deleted all subscriptions"
}

8.4.1.2. api/ocloudNotifications/v2/subscriptions/{subscription_id}
HTTP メソッド

GET api/ocloudNotifications/v2/subscriptions/{subscription_id}

説明

ID が subscription_id のサブスクリプションの詳細を返します。

Expand
表8.15 グローバルパスパラメーター
パラメーター

subscription_id

string

API 応答の例

{
    "ResourceAddress": "/cluster/node/compute-1.example.com/sync/ptp-status/lock-state",
    "EndpointUri": "http://consumer-events-subscription-service.cloud-events.svc.cluster.local:9043/event",
    "SubscriptionId": "620283f3-26cd-4a6d-b80a-bdc4b614a96a",
    "UriLocation": "http://ptp-event-publisher-service-compute-1.openshift-ptp.svc.cluster.local:9043/api/ocloudNotifications/v2/subscriptions/620283f3-26cd-4a6d-b80a-bdc4b614a96a"
}

HTTP メソッド

DELETE api/ocloudNotifications/v2/subscriptions/{subscription_id}

説明

ID subscription_id のサブスクリプションを削除します。

Expand
表8.16 グローバルパスパラメーター
パラメーター

subscription_id

string

Expand
表8.17 HTTP 応答コード
HTTP レスポンス説明

204 No Content

Success

8.4.1.3. api/ocloudNotifications/v2/health
HTTP メソッド

GET api/ocloudNotifications/v2/health/

説明

ocloudNotifications REST API の正常性ステータスを返します。

Expand
表8.18 HTTP 応答コード
HTTP レスポンス説明

200 OK

Success

8.4.1.4. api/ocloudNotifications/v2/publishers
HTTP メソッド

GET api/ocloudNotifications/v2/publishers

説明

クラスターノードの発行者の詳細のリストを返します。関連する機器の状態が変化すると、システムは通知を生成します。

機器の同期ステータスのサブスクリプションを組み合わせて使用すると、システム全体の同期状態の詳細なビューを提供できます。

API 応答の例

[
  {
    "ResourceAddress": "/cluster/node/compute-1.example.com/sync/sync-status/sync-state",
    "EndpointUri": "http://localhost:9043/api/ocloudNotifications/v2/dummy",
    "SubscriptionId": "4ea72bfa-185c-4703-9694-cdd0434cd570",
    "UriLocation": "http://localhost:9043/api/ocloudNotifications/v2/publishers/4ea72bfa-185c-4703-9694-cdd0434cd570"
  },
  {
    "ResourceAddress": "/cluster/node/compute-1.example.com/sync/sync-status/os-clock-sync-state",
    "EndpointUri": "http://localhost:9043/api/ocloudNotifications/v2/dummy",
    "SubscriptionId": "71fbb38e-a65d-41fc-823b-d76407901087",
    "UriLocation": "http://localhost:9043/api/ocloudNotifications/v2/publishers/71fbb38e-a65d-41fc-823b-d76407901087"
  },
  {
    "ResourceAddress": "/cluster/node/compute-1.example.com/sync/ptp-status/clock-class",
    "EndpointUri": "http://localhost:9043/api/ocloudNotifications/v2/dummy",
    "SubscriptionId": "7bc27cad-03f4-44a9-8060-a029566e7926",
    "UriLocation": "http://localhost:9043/api/ocloudNotifications/v2/publishers/7bc27cad-03f4-44a9-8060-a029566e7926"
  },
  {
    "ResourceAddress": "/cluster/node/compute-1.example.com/sync/ptp-status/lock-state",
    "EndpointUri": "http://localhost:9043/api/ocloudNotifications/v2/dummy",
    "SubscriptionId": "6e7b6736-f359-46b9-991c-fbaed25eb554",
    "UriLocation": "http://localhost:9043/api/ocloudNotifications/v2/publishers/6e7b6736-f359-46b9-991c-fbaed25eb554"
  },
  {
    "ResourceAddress": "/cluster/node/compute-1.example.com/sync/gnss-status/gnss-sync-status",
    "EndpointUri": "http://localhost:9043/api/ocloudNotifications/v2/dummy",
    "SubscriptionId": "31bb0a45-7892-45d4-91dd-13035b13ed18",
    "UriLocation": "http://localhost:9043/api/ocloudNotifications/v2/publishers/31bb0a45-7892-45d4-91dd-13035b13ed18"
  }
]

Expand
表8.19 HTTP 応答コード
HTTP レスポンス説明

200 OK

Success

8.4.1.5. api/ocloudNotifications/v2/{resource_address}/CurrentState
HTTP メソッド

GET api/ocloudNotifications/v2/cluster/node/{node_name}/sync/ptp-status/lock-state/CurrentState

GET api/ocloudNotifications/v2/cluster/node/{node_name}/sync/sync-status/os-clock-sync-state/CurrentState

GET api/ocloudNotifications/v2/cluster/node/{node_name}/sync/ptp-status/clock-class/CurrentState

GET api/ocloudNotifications/v2/cluster/node/{node_name}/sync/sync-status/sync-state/CurrentState

GET api/ocloudNotifications/v2/cluster/node/{node_name}/sync/gnss-status/gnss-sync-state/CurrentState

説明

クラスターノードの os-clock-sync-stateclock-classlock-stategnss-sync-status、または sync-state イベントの現在の状態を返します。

  • os-clock-sync-state 通知は、ホストオペレーティングシステムのクロック同期状態を示します。LOCKED または FREERUN 状態になります。
  • clock-class 通知は、PTP クロッククラスの現在の状態を説明します。
  • lock-state 通知は、PTP 機器のロック状態の現在のステータスを示します。LOCKEDHOLDOVER、または FREERUN 状態になります。
  • sync-state 通知は、PTP クロックの lock-state 状態と os-clock-sync-state 状態のうち、最も同期されていない状態の現在のステータスを示します。
  • gnss-sync-status 通知は、GNSS クロックの同期状態を説明します。
Expand
表8.20 グローバルパスパラメーター
パラメーター

resource_address

string

ロック状態 API レスポンスの例

{
  "id": "c1ac3aa5-1195-4786-84f8-da0ea4462921",
  "type": "event.sync.ptp-status.ptp-state-change",
  "source": "/cluster/node/compute-1.example.com/sync/ptp-status/lock-state",
  "dataContentType": "application/json",
  "time": "2023-01-10T02:41:57.094981478Z",
  "data": {
    "version": "1.0",
    "values": [
      {
        "ResourceAddress": "/cluster/node/compute-1.example.com/ens5fx/master",
        "data_type": "notification",
        "value_type": "enumeration",
        "value": "LOCKED"
      },
      {
        "ResourceAddress": "/cluster/node/compute-1.example.com/ens5fx/master",
        "data_type": "metric",
        "value_type": "decimal64.3",
        "value": "29"
      }
    ]
  }
}

os-clock-sync-state API レスポンスの例

{
  "specversion": "0.3",
  "id": "4f51fe99-feaa-4e66-9112-66c5c9b9afcb",
  "source": "/cluster/node/compute-1.example.com/sync/sync-status/os-clock-sync-state",
  "type": "event.sync.sync-status.os-clock-sync-state-change",
  "subject": "/cluster/node/compute-1.example.com/sync/sync-status/os-clock-sync-state",
  "datacontenttype": "application/json",
  "time": "2022-11-29T17:44:22.202Z",
  "data": {
    "version": "1.0",
    "values": [
      {
        "ResourceAddress": "/cluster/node/compute-1.example.com/CLOCK_REALTIME",
        "data_type": "notification",
        "value_type": "enumeration",
        "value": "LOCKED"
      },
      {
        "ResourceAddress": "/cluster/node/compute-1.example.com/CLOCK_REALTIME",
        "data_type": "metric",
        "value_type": "decimal64.3",
        "value": "27"
      }
    ]
  }
}

clock-class API レスポンスの例

{
  "id": "064c9e67-5ad4-4afb-98ff-189c6aa9c205",
  "type": "event.sync.ptp-status.ptp-clock-class-change",
  "source": "/cluster/node/compute-1.example.com/sync/ptp-status/clock-class",
  "dataContentType": "application/json",
  "time": "2023-01-10T02:41:56.785673989Z",
  "data": {
    "version": "1.0",
    "values": [
      {
        "ResourceAddress": "/cluster/node/compute-1.example.com/ens5fx/master",
        "data_type": "metric",
        "value_type": "decimal64.3",
        "value": "165"
      }
    ]
  }
}

同期状態 API 応答の例

{
    "specversion": "0.3",
    "id": "8c9d6ecb-ae9f-4106-82c4-0a778a79838d",
    "source": "/sync/sync-status/sync-state",
    "type": "event.sync.sync-status.synchronization-state-change",
    "subject": "/cluster/node/compute-1.example.com/sync/sync-status/sync-state",
    "datacontenttype": "application/json",
    "time": "2024-08-28T14:50:57.327585316Z",
    "data":
    {
        "version": "1.0",
        "values": [
        {
            "ResourceAddress": "/cluster/node/compute-1.example.com/sync/sync-status/sync-state",
            "data_type": "notification",
            "value_type": "enumeration",
            "value": "LOCKED"
        }]
    }
}

gnss-sync-state API 応答の例

{
  "id": "435e1f2a-6854-4555-8520-767325c087d7",
  "type": "event.sync.gnss-status.gnss-state-change",
  "source": "/cluster/node/compute-1.example.com/sync/gnss-status/gnss-sync-status",
  "dataContentType": "application/json",
  "time": "2023-09-27T19:35:33.42347206Z",
  "data": {
    "version": "1.0",
    "values": [
      {
        "ResourceAddress": "/cluster/node/compute-1.example.com/ens2fx/master",
        "data_type": "notification",
        "value_type": "enumeration",
        "value": "SYNCHRONIZED"
      },
      {
        "ResourceAddress": "/cluster/node/compute-1.example.com/ens2fx/master",
        "data_type": "metric",
        "value_type": "decimal64.3",
        "value": "5"
      }
    ]
  }
}

Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat
トップに戻る