高度なネットワーキング
OpenShift Container Platform の専門的かつ高度なネットワーキングトピック
概要
第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:
mode: "All"
sourcePlacement:
nodeSelector:
checkNodes: groupA
tolerations:
- key: myTaint
effect: NoSchedule
operator: Exists
targetPlacement:
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フィールドを使用して、sourceNodePod をさらに指定できます。これは、ソース Pod とターゲット Pod の両方でオプションです。省略することも、両方使用することも、いずれか一方だけ使用することもできます。 - 4
- オプション: 接続チェックのターゲット Pod のセレクターを指定します。
nodeSelectorおよびtolerationsフィールドを使用して、targetNodePod をさらに指定できます。これは、ソース Pod とターゲット Pod の両方でオプションです。省略することも、両方使用することも、いずれか一方だけ使用することもできます。
1.3. Pod 接続チェックの配置の設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、cluster という名前の network.config.openshift.io オブジェクトを変更することで、接続チェック Pod が実行するノードを設定できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。
手順
次のコマンドを入力して、接続チェックの設定を編集します。
$ oc edit network.config.openshift.io cluster-
テキストエディターで、
networkDiagnosticsスタンザを更新して、ソース Pod とターゲット Pod に必要なノードセレクターを指定します。 - 変更を保存してテキストエディターを終了します。
検証
- 次のコマンドを入力して、ソース 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 オブジェクトフィールドは、以下の表で説明されています。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
以下の形式のオブジェクトの名前:
|
|
|
|
オブジェクトが関連付けられる namespace。この値は、常に |
|
|
|
接続チェックの起点となる Pod の名前 (例: |
|
|
|
|
|
|
| 使用する TLS 証明書の設定。 |
|
|
| 使用される TLS 証明書の名前 (ある場合)。デフォルト値は空の文字列です。 |
|
|
| 接続テストの状態を表す、および最近の接続の成功および失敗に関するログ。 |
|
|
| 接続チェックと最新のステータスと以前のステータス。 |
|
|
| 試行に失敗した接続テストのログ。 |
|
|
| 停止が生じた期間が含まれる接続テストのログ。 |
|
|
| 試行に成功した接続テストのログ。 |
以下の表は、status.conditions 配列内のオブジェクトのフィールドを説明しています。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
| 接続の条件がある状態から別の状態に移行した時間。 |
|
|
| 人が判読できる形式の最後の移行に関する詳細。 |
|
|
| マシンの読み取り可能な形式での移行の最後のステータス。 |
|
|
| 状態のテータス。 |
|
|
| 状態のタイプ。 |
以下の表は、status.conditions 配列内のオブジェクトのフィールドを説明しています。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
| 接続の障害が解決された時点からのタイムスタンプ。 |
|
|
| 接続ログエントリー (停止の正常な終了に関連するログエントリーを含む)。 |
|
|
| 人が判読できる形式の停止に関する詳細情報の要約。 |
|
|
| 接続の障害が最初に検知された時点からのタイムスタンプ。 |
|
|
| 元の障害を含む接続ログのエントリー。 |
1.4.1. 接続ログフィールド リンクのコピーリンクがクリップボードにコピーされました!
接続ログエントリーのフィールドの説明は以下の表で説明されています。オブジェクトは以下のフィールドで使用されます。
-
status.failures[] -
status.successes[] -
status.outages[].startLogs[] -
status.outages[].endLogs[]
| フィールド | 型 | 説明 |
|---|---|---|
|
|
| アクションの期間を記録します。 |
|
|
| ステータスを人が判読できる形式で提供します。 |
|
|
|
ステータスの理由をマシンが判読できる形式で提供します。値は |
|
|
| ログエントリーが成功または失敗であるかを示します。 |
|
|
| 接続チェックの開始時間。 |
1.5. エンドポイントのネットワーク接続の確認 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、API サーバー、ロードバランサー、サービス、Pod などのエンドポイントの接続を確認し、ネットワーク診断が有効になっていることを確認できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。
手順
次のコマンドを入力して、ネットワーク診断が有効になっていることを確認します。
$ oc get network.config.openshift.io cluster -o yaml出力例
# ... status: # ... conditions: - lastTransitionTime: "2024-05-27T08:28:39Z" message: "" reason: AsExpected status: "True" type: NetworkDiagnosticsAvailable次のコマンドを入力して、現在の
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接続テストログを表示します。
- 直前のコマンドの出力から、接続ログを確認するエンドポイントを特定します。
次のコマンドを入力してオブジェクトを表示します。
$ 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. 移行プロセスの仕組み リンクのコピーリンクがクリップボードにコピーされました!
以下の表は、プロセスのユーザーが開始する手順と、移行が応答として実行するアクション間を区分して移行プロセスを要約しています。
| ユーザーが開始する手順 | OpenShift Container Platform アクティビティー |
|---|---|
| Cluster Network Operator 設定で次の値を指定します。
| Cluster Network Operator (CNO): 各フィールドが有効な値に設定されていることを確認します。
指定の値が有効な場合に、CNO は、クラスターネットワークの MTU が Machine Config Operator (MCO): クラスター内の各ノードのローリングリブートを実行します。 |
| クラスター上のノードのプライマリーネットワークインターフェイスの MTU を再設定します。これは、次のいずれかの方法を使用して実行できます。
| 該当なし |
|
ネットワークプラグインの CNO 設定で | 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 値を受け入れる準備ができていることを確認できます。
手順
ハードウェア MTU の設定を準備します。
ハードウェア MTU が DHCP で指定されている場合は、次の dnsmasq 設定などで DHCP 設定を更新します。
dhcp-option-force=26,<mtu>ここでは、以下のようになります。
<mtu>- DHCP サーバーがアドバタイズするハードウェア MTU を指定します。
- ハードウェア MTU が PXE を使用したカーネルコマンドラインで指定されている場合は、それに応じてその設定を更新します。
ハードウェア MTU が NetworkManager 接続設定で指定されている場合は、以下のステップを実行します。OpenShift Container Platform では、これは、DHCP、カーネルコマンドラインなどの方法でネットワーク設定を明示的に指定していない場合のデフォルトのアプローチです。変更なしで次の手順を機能させるには、全クラスターノードで、同じ基盤となるネットワーク設定を使用する必要があります。
次のコマンドを入力して、プライマリーネットワークインターフェイスを見つけます。
$ oc debug node/<node_name> -- chroot /host nmcli -g connection.interface-name c show ovs-if-phys0ここでは、以下のようになります。
<node_name>- クラスター内のノードの名前を指定します。
<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 つはクラスター内のワーカーノード用に、2 つの
MachineConfigオブジェクトを作成します。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設定ファイルのローカルファイル名を指定します。
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設定ファイルのローカルファイル名を指定します。
次のコマンドを実行して、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 変更に備えてクラスターを準備するために、ノードのローリング再起動を実行します。
手順
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} } } } }'Machine Config Operator は、各マシン設定プール内のマシンを更新するときに、各ノードを 1 つずつ再起動します。すべてのノードが更新されるまで待機する必要があります。以下のコマンドを実行してマシン設定プールのステータスを確認します。
$ oc get machineconfigpools正常に更新されたノードには、
UPDATED=true、UPDATING=false、DEGRADED=falseのステータスがあります。注記Machine Config Operator は、デフォルトでプールごとに 1 つずつマシンを更新するため、クラスターのサイズに応じて移行にかかる合計時間が増加します。
2.2.5. マシン設定の検証 リンクのコピーリンクがクリップボードにコピーされました!
ホストマシンの設定を確認し、最大伝送単位 (MTU) の移行が正常に適用されたことを確認してください。設定状態とシステム設定を確認することで、ノードが正しい移行スクリプトを使用していることを確認できます。
手順
ホスト上の新規マシン設定のステータスを確認します。
マシン設定の状態と適用されたマシン設定の名前をリスト表示するには、以下のコマンドを入力します。
$ 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フィールドの値と等しくなります。
-
マシン設定が正しいことを確認するには、以下のコマンドを入力します。
$ 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 が各ノードを正常に再起動および更新したことを確認する作業が含まれます。
手順
基盤となるネットワークインターフェイスの MTU 値を更新します。
NetworkManager 接続設定で新しい MTU を指定する場合は、次のコマンドを入力します。MachineConfig Operator は、クラスター内のノードのローリングリブートを自動的に実行します。
$ for manifest in control-plane-interface worker-interface; do oc create -f $manifest.yaml done- DHCP サーバーオプションまたはカーネルコマンドラインと PXE を使用して新しい MTU を指定する場合は、インフラストラクチャーに必要な変更を加えます。
Machine Config Operator は、各マシン設定プール内のマシンを更新するときに、各ノードを 1 つずつ再起動します。すべてのノードが更新されるまで待機する必要があります。以下のコマンドを実行してマシン設定プールのステータスを確認します。
$ oc get machineconfigpools正常に更新されたノードには、
UPDATED=true、UPDATING=false、DEGRADED=falseのステータスがあります。注記Machine Config Operator は、デフォルトでプールごとに 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フィールドの値と等しくなります。
-
マシン設定が正しいことを確認するには、以下のコマンドを入力します。
$ 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 移行を完了します。これによりクラスター設定が更新され、プロセスを完了するためにノードのローリングリブートがトリガーされます。
手順
MTU の移行を完了するために、OVN-Kubernetes ネットワークプラグインに対して次のコマンドを入力します。
$ oc patch Network.operator.openshift.io cluster --type=merge --patch \ '{"spec": { "migration": null, "defaultNetwork":{ "ovnKubernetesConfig": { "mtu": <mtu> }}}}'ここでは、以下のようになります。
<mtu>-
<overlay_to>で指定した新しいクラスターネットワーク MTU を指定します。
MTU の移行が完了すると、各マシン設定プールノードが 1 つずつ再起動します。すべてのノードが更新されるまで待機する必要があります。以下のコマンドを実行してマシン設定プールのステータスを確認します。
$ oc get machineconfigpools正常に更新されたノードには、
UPDATED=true、UPDATING=false、DEGRADED=falseのステータスがあります。
検証
クラスターネットワークの現在の MTU を取得するには、次のコマンドを入力します。
$ oc describe network.config clusterノードのプライマリーネットワークインターフェイスの現在の MTU を取得します。
クラスター内のノードをリスト表示するには、次のコマンドを入力します。
$ oc get nodesノードのプライマリーネットワークインターフェイスの現在の 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 ボンディングは、eno0 や eno1 などの物理インターフェイスリンクを介して、異なる仮想マシンポートからのトラフィックを分散します。さらに、どちらの物理インターフェイスからの Ingress トラフィックも、OVS ブリッジのセットを通過して仮想マシンに到達できます。
図3.1 2 つの NAD を持つローカルネット上で動作する OVS balance-slb モード
OVS ボンディングを使用して、balance-slb モードインターフェイスをプライマリーまたはセカンダリーネットワークタイプに統合できます。OVS ボンディングでは、次の点に注意してください。
- OVN-Kubernetes CNI プラグインをサポートし、プラグインと簡単に統合できます。
-
ネイティブで
balance-slbモードをサポートします。
前提条件
-
プライマリーネットワークに複数の物理インターフェイスが接続されており、それらのインターフェイスを
MachineConfigファイルで定義した。 -
マニフェストオブジェクトを作成し、カスタマイズした
br-exブリッジをオブジェクト設定ファイルで定義した。 - プライマリーネットワークに複数の物理インターフェイスが接続されており、それらのインターフェイスを NAD CRD ファイルで定義した。
手順
クラスター内に存在するベアメタルホストごとに、クラスターの
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 を実行する最小設定の一部です。
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-exMTU を手動で設定します。
base64コマンドを使用して、NMState 設定ファイルのインターフェイスコンテンツをエンコードします。$ base64 -w0 <nmstate_configuration>.yml<nmstate_configuration>:-w0オプションは、base64 エンコード操作中の行折り返しを防止します。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 など、ノードへの短いホスト名パスを指定できます。
各
MachineConfigマニフェストファイルを./<installation_directory>/manifestsディレクトリーに保存します。<installation_directory>は、インストールプログラムがファイルを作成するディレクトリーです。Machine Config Operator (MCO) が各マニフェストファイルからコンテンツを取得し、ローリング更新中に選択されたすべてのノードにそのコンテンツを一貫して適用します。
3.2. カーネル結合 リンクのコピーリンクがクリップボードにコピーされました!
カーネルボンディング (Linux カーネルに組み込まれた機能で、複数のイーサネットインターフェイス間でリンクアグリゲーションを行う機能) を使用することで、単一の論理的な物理インターフェイスを作成できます。カーネルボンディングにより、複数のネットワークインターフェイスを単一の論理インターフェイスに結合することが可能になり、帯域幅の増加やリンク障害発生時の冗長性確保によってネットワークパフォーマンスを向上させることができます。
OVS ボンディングに依存するボンディングインターフェイスがない場合、カーネルボンディングがデフォルトモードになります。このボンディング方式では、サポートされている OVS ボンディングと同等のカスタマイズ性は得られません。
カーネルボンディング モードの場合、ボンディングインターフェイスはブリッジインターフェイスの外部に存在し、つまりデータパス内には存在しません。このモードでは、ネットワークトラフィックはボンディングインターフェイスポート上で送受信されず、代わりにカーネルレベルでの MAC アドレス割り当てのための追加のブリッジング機能が必要となります。
ノードのネットワークコントローラーインターフェイス (NIC) で カーネルボンディング モードを有効にした場合、Media Access Control (MAC) アドレスのフェイルオーバーを指定する必要があります。この設定により、eno1f0 や eno2f0 などのボンディングインターフェイスとのノード通信の問題が防止されます。
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ロールを持つユーザーとしてクラスターにアクセスできる。
手順
以下の 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:,sctpMachineConfigオブジェクトを作成するには、以下のコマンドを入力します。$ oc create -f load-sctp-module.yamlオプション: MachineConfig Operator が設定変更を適用している間にノードのステータスを確認するには、以下のコマンドを入力します。ノードのステータスが
Readyに移行すると、設定の更新が適用されます。$ oc get nodes
4.3. SCTP (Stream Control Transmission Protocol) が有効になっていることの確認 リンクのコピーリンクがクリップボードにコピーされました!
SCTP がクラスターで機能することを確認するには、SCTP トラフィックをリッスンするアプリケーションで Pod を作成し、これをサービスに関連付け、公開されたサービスに接続します。
前提条件
-
クラスターからインターネットにアクセスし、
ncパッケージをインストールすること。 -
OpenShift CLI (
oc) がインストールされている。 -
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。
手順
SCTP リスナーを起動する Pod を作成します。
以下の 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以下のコマンドを入力して Pod を作成します。
$ oc create -f sctp-server.yaml
SCTP リスナー Pod のサービスを作成します。
以下の 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サービスを作成するには、以下のコマンドを入力します。
$ oc create -f sctp-service.yaml
SCTP クライアントの Pod を作成します。
以下の 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"]Podオブジェクトを作成するには、以下のコマンドを入力します。$ oc apply -f sctp-client.yaml
サーバーで SCTP リスナーを実行します。
サーバー Pod に接続するには、以下のコマンドを入力します。
$ oc rsh sctpserverSCTP リスナーを起動するには、以下のコマンドを入力します。
$ nc -l 30102 --sctp
サーバーの SCTP リスナーに接続します。
- ターミナルプログラムで新規のターミナルウィンドウまたはタブを開きます。
sctpserviceサービスの IP アドレスを取得します。以下のコマンドを入力します。$ oc get services sctpservice -o go-template='{{.spec.clusterIP}}{{"\n"}}'クライアント Pod に接続するには、以下のコマンドを入力します。
$ oc rsh sctpclientSCTP クライアントを起動するには、以下のコマンドを入力します。
<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 は、固定の値が 0 の pod_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 に存在する場合は、次の操作を行う必要があります。
-
既存の
FRRConfigurationCR がopenshift-frr-k8snamespace にコピーされていることを確認します。 -
サードパーティークラスターコンポーネントが、作成する
FRRConfigurationCR に新しい 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 カスタムリソースのパラメーターは、次の表に記載されています。
| パラメーター | 型 | 説明 |
|---|---|---|
|
|
| FRR が設定するルーターを指定します (VRF ごとに 1 つ)。 |
|
|
| セッションのローカル側で使用する AS 番号 (ASN)。 |
|
|
|
|
|
|
| このルーターからセッションを確立するために使用するホスト VRF を指定します。 |
|
|
| BGP セッションを確立する近隣を指定します。 |
|
|
|
セッションのリモート終了に使用する ASN を指定します。このパラメーターを使用する場合、 |
|
|
|
明示的に設定せずに、セッションのリモートエンドに使用する ASN を検出します。同じ ASN を持つネイバーの場合は |
|
|
|
セッションを確立する IP アドレスを指定します。このパラメーターを使用する場合、 |
|
|
| セッションを確立するときに使用するインターフェイス名を指定します。このパラメーターを使用して、番号なし BGP ピアリングを設定します。2 つの BGP ピア間には、ポイントツーポイントのレイヤー 2 接続が必要です。番号なし BGP ピアリングは、IPv4、IPv6、またはデュアルスタックで使用できますが、IPv6 RA (ルーターアドバタイズメント) を有効にする必要があります。各インターフェイスは 1 つの BGP 接続に制限されます。 |
|
|
|
セッションを確立するときにダイアリングするポートを指定します。デフォルト値は |
|
|
|
BGP セッションの確立に使用するパスワードを指定します。 |
|
|
|
ネイバーの認証シークレットの名前を指定します。シークレットは "kubernetes.io/basic-auth" タイプであり、FRR-K8s デーモンと同じ namespace にある必要があります。キー "password" はパスワードをシークレットに保存します。 |
|
|
| RFC4271 に従って、要求された BGP ホールド時間を指定します。デフォルトは 180s です。 |
|
|
|
RFC4271 に従って、要求された BGP キープアライブ時間を指定します。デフォルトは |
|
|
| BGP が近隣に次に接続を試行するまで待機する時間を指定します。 |
|
|
| BGP ピアが複数ホップ離れているかどうかを示します。 |
|
|
| BGP セッションに関連付けられた BFD セッションに使用する BFD プロファイルの名前を指定します。設定されていない場合、BFD セッションは設定されません。 |
|
|
| 近隣にアドバタイズする接頭辞のリストと、関連するプロパティーを表します。 |
|
|
| 近隣にアドバタイズする接頭辞のリストを指定します。このリストは、ルーターで定義した接頭辞と一致する必要があります。 |
|
|
|
接頭辞を処理するときに使用するモードを指定します。接頭辞リスト内の接頭辞のみを許可するように |
|
|
| アドバタイズされたローカルプリファレンスに関連付けられた接頭辞を指定します。ローカル設定に関連付けられた接頭辞を、アドバタイズが許可される接頭辞に指定する必要があります。 |
|
|
| ローカル設定に関連付けられた接頭辞を指定します。 |
|
|
| 接頭辞に関連付けられたローカル設定を指定します。 |
|
|
| アドバタイズされた BGP コミュニティーに関連付けられた接頭辞を指定します。アドバタイズする接頭辞のリストに、ローカル設定に関連付けられた接頭辞を含める必要があります。 |
|
|
| コミュニティーに関連付けられた接頭辞を指定します。 |
|
|
| 接頭辞に関連付けられたコミュニティーを指定します。 |
|
|
| 近隣から受信する接頭辞を指定します。 |
|
|
| 近隣から受信する情報を指定します。 |
|
|
| 近隣から許可される接頭辞を指定します。 |
|
|
|
接頭辞を処理するときに使用するモードを指定します。 |
|
|
| MP BGP を無効にして、IPv4 と IPv6 のルート交換を別々の BGP セッションに分離しないようにします。 |
|
|
| このルーターインスタンスからアドバタイズするすべての接頭辞を指定します。 |
|
|
| ネイバーを設定する際に使用する BFD プロファイルのリストを指定します。 |
|
|
| 設定の他の部分で参照される BFD プロファイルの名前。 |
|
|
|
このシステムが制御パケットを受信できる最小間隔をミリ秒単位で指定します。デフォルトは |
|
|
|
このシステムが BFD 制御パケットを送信するために使用する、ジッターを除いた最小送信間隔をミリ秒単位で指定します。デフォルトは |
|
|
| パケット損失を判定するための検出乗数を設定します。接続損失検出タイマーを決定するには、リモート送信間隔にこの値を乗算します。 |
|
|
|
このシステムが処理できる最小のエコー受信送信間隔をミリ秒単位で設定します。デフォルトは |
|
|
| エコー送信モードを有効または無効にします。このモードはデフォルトで無効になっており、マルチホップ設定ではサポートされていません。 |
|
|
| セッションを passive としてマークします。passive セッションでは接続を開始せず、応答を開始する前にピアからの制御パケットを待機します。 |
|
|
| マルチホップセッションのみ。着信 BFD 制御パケットの最小予想 TTL を設定します。 |
|
|
| この設定の適用を試みるノードを制限します。指定した場合、指定されたセレクターに一致するラベルが割り当てられたノードのみが設定の適用を試みます。指定されていない場合は、すべてのノードがこの設定を適用しようとします。 |
|
|
| 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 を移動するには、次のコマンドを入力します。
openshift-frr-k8snamespace を作成するには、次のコマンドを入力します。$ oc create namespace openshift-frr-k8s移行を自動化するには、次の内容のシェルスクリプトを
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 -移行を実行するには、次のコマンドを実行します。
$ 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) のフィールドについては、次の表で説明しています。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
|
|
|
|
アドバタイズする異なるタイプのネットワークを含めることができる配列を指定します。 |
|
|
|
OVN-Kubernetes ドリブンの |
|
|
| デフォルトのクラスターネットワークとクラスターユーザー定義ネットワーク (CUDN) の間でアドバタイズするネットワークを指定します。 |
|
|
|
アドバタイズメントを選択したノードに制限します。 |
|
|
|
どのルーターでルートをアドバタイズするかを決定します。ルートは、選択された |
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 を介してアドバタイズされます。
- 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 にインポートされます。
7.1.3.3. クラスターユーザー定義ネットワークから BGP 経由で VPN を使用して Pod IP をアドバタイズする リンクのコピーリンクがクリップボードにコピーされました!
このシナリオでは、VLAN インターフェイスは、blue ネットワークに関連付けられた VRF デバイスにアタッチされます。このセットアップは VRF lite 設計を提供します。FRR-K8S は、blue ネットワーク VRF/VLAN リンク上の対応する BGP セッションを介してのみ、blue ネットワークをネクストホップの Provide Edge (PE) ルーターにアドバタイズするために使用されます。red テナントは同じ設定を使用します。blue および red ネットワークには、export: true というラベルが付けられています。
このシナリオでは、EgressIP の使用はサポートされていません。
次の図はこの設定を示しています。
- 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 デバイス内でアドバタイズメントが行われるように、targetVRF が auto に設定されています。このシナリオでは、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 デーモンコンテナーを実行する予定のクラスターにアクセスできるベアメタルシステムがある。
手順
次のコマンドを実行して、
RouteAdvertisementsフィーチャーゲートが有効になっていることを確認します。$ oc get featuregate -oyaml | grep -i routeadvertisement出力例
- name: RouteAdvertisements次のコマンドを実行して、Cluster Network Operator (CNO) を設定します。
$ oc patch Network.operator.openshift.io cluster --type=merge \ -p=' {"spec":{ "additionalRoutingCapabilities": { "providers": ["FRR"]}, "defaultNetwork":{"ovnKubernetesConfig"{ "routeAdvertisements":"Enabled" }}}}'CNO がすべてのノードを再起動するために数分かかる場合があります。
次のコマンドを実行して、ノードの 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次のコマンドを実行して、各ノードのデフォルトの 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"]}次のコマンドを実行して、ベアメタルハイパーバイザーで、使用する外部 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'次の例に示すように、各ノードの 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次の内容が含まれるファイルを、
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.-
frr.confファイルとdaemonsファイルの両方を、同じディレクトリー (例:/tmp/frr) に保存します。 次のコマンドを実行して、外部 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次の
FRRConfiguration設定およびRouteAdvertisements設定を作成します。次の内容で
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次の内容で
ra.yamlファイルを作成します。ra.yaml設定ファイルの例apiVersion: k8s.ovn.org/v1 kind: RouteAdvertisements metadata: name: default spec: nodeSelector: {} frrConfigurationSelector: {} networkSelectors: - networkSelectionType: DefaultNetwork advertisements: - "PodNetwork" - "EgressIP"
次のコマンドを実行して、
receive_all.yamlファイルとra.yamlファイルを適用します。$ for f in receive_all.yaml ra.yaml; do oc apply -f $f; done
検証
設定が適用されたか検証します。
次のコマンドを実行して、
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次のコマンドを実行して、
RouteAdvertisements設定が作成されたか検証します。$ oc get ra -A出力例
NAME STATUS default Accepted
次のコマンドを実行して、外部 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前のステップで取得したコンテナー 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次のコマンドを実行して、各クラスターノードの
frr-k8sPod を見つけます。$ 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>次のコマンドを実行して、OpenShift Container Platform クラスターから、FRR コンテナー内にあるクラスターノードの
frr-k8sPod 上の BGP ルートを確認します。$ oc -n openshift-frr-k8s -c frr rsh frr-k8s-86wmq次のコマンドを実行して、クラスターノードからの IP ルートを確認します。
sh-5.1# vtysh出力例
Hello, this is FRRouting (version 8.5.3). Copyright 1996-2005 Kunihiro Ishiguro, et al.次のコマンドを実行して、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次のコマンドを実行して、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.次のコマンドを実行して、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 クロックの主な 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 パッケージには、システムクロック同期用の ts2phc、pmc、ptp4l、および 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 クロックを同期するためのプログラム ubxtool、gspipe、gpsd が含まれています。
- ubxtool
-
ubxtoolCLI を使用すると、u-blox GPS システムと通信できます。ubxtoolCLI は、u-blox バイナリープロトコルを使用して GPS と通信します。 - gpspipe
-
gpspipeはgpsd出力に接続し、それを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 との同期の概要
- 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 グランドマスタークロック
注記デュアル 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 シリーズ
- 冗長性が向上した通常のクロックとしてインターフェイスを設定する前に、NVIDIA BlueField-3 シリーズ DPU を NIC モードで設定する必要があります。NIC モードの設定の詳細は、NIC Mode for BlueField-3 (NVIDIA ドキュメント)、BlueField Management (NVIDIA ドキュメント)、および Configuring NIC Mode on BlueField-3 from Host BIOS HII UEFI Menu (NVIDIA ドキュメント) を参照してください。
- NIC モードに変更した後は、カードを再起動する必要があります。カードの再起動の詳細は、NVIDIA BlueField のリセットおよび再起動の手順 (NVIDIA ドキュメント) を参照してください。
- 適切な 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 グランドマスタークロック
注記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権限を持つユーザーとしてログインしている。
手順
PTP Operator の namespace を作成します。
次の 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"NamespaceCR を作成します。$ oc create -f ptp-namespace.yaml
PTP Operator の Operator グループを作成します。
次の YAML を
ptp-operatorgroup.yamlファイルに保存します。apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: ptp-operators namespace: openshift-ptp spec: targetNamespaces: - openshift-ptpOperatorGroupCR を作成します。$ oc create -f ptp-operatorgroup.yaml
PTP Operator にサブスクライブします。
次の YAML を
ptp-sub.yamlファイルに保存します。apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: ptp-operator-subscription namespace: openshift-ptp spec: channel: "stable" name: ptp-operator source: redhat-operators sourceNamespace: openshift-marketplaceSubscriptionCR を作成します。$ oc create -f ptp-sub.yaml
Operator がインストールされていることを確認するには、以下のコマンドを入力します。
$ oc get csv -n openshift-ptp -o custom-columns=Name:.metadata.name,Phase:.status.phase出力例
Name Phase 4.20.0-202301261535 Succeeded
8.2.2. Web コンソールを使用した PTP Operator のインストール リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、Web コンソールを使用して PTP Operator をインストールできます。
先のセクションで説明されているように namespace および Operator グループを作成する必要があります。
手順
OpenShift Container Platform Web コンソールを使用して PTP Operator をインストールします。
- OpenShift Container Platform Web コンソールで、Ecosystem → Software Catalog をクリックします。
- 利用可能な Operator のリストから PTP Operator を選択してから Install をクリックします。
- Install Operator ページの A specific namespace on the cluster の下で openshift-ptp を選択します。次に、Install をクリックします。
オプション: PTP Operator が正常にインストールされていることを確認します。
- Ecosystem → Installed Operators ページに切り替えます。
PTP Operator が Status が InstallSucceeded の状態で openshift-ptp プロジェクトにリスト表示されていることを確認します。
注記インストール時に、Operator は Failed ステータスを表示する可能性があります。インストールが後に InstallSucceeded メッセージを出して正常に実行される場合は、Failed メッセージを無視できます。
Operator がインストール済みとして表示されない場合に、さらにトラブルシューティングを実行します。
- Ecosystem → Installed Operators ページに移動し、Operator Subscriptions および Install Plans タブで Status にエラーがあるかどうかを検査します。
-
Workloads → Pods ページに移動し、
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 サービス (ptp4l、phc2sys、ts2phc) をグランドマスタークロック (T-GM) として設定できます。
ts2phc ユーティリティーを使用すると、システムクロックを PTP グランドマスタークロックと同期できるため、ノードは高精度クロック信号をダウンストリームの PTP 通常クロックおよび境界クロックにストリーミングできます。
次の PtpConfig CR の例をベースとして使用して、linuxptp サービスを Intel Westport Channel E810-XXVDA4T ネットワークインターフェイスの T-GM として設定してください。
PTP 高速イベントを設定するには、ptp4lOpts、ptp4lConf、ptpClockThreshold に適切な値を設定します。ptpClockThreshold は、イベントが有効になっている場合にのみ使用されます。詳細は、「PTP 高速イベント通知パブリッシャーの設定」を参照してください。
前提条件
- 実稼働環境の T-GM クロックの場合は、ベアメタルクラスターホストに Intel E810 Westport Channel NIC がインストールされている。
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - PTP Operator をインストールします。
手順
PtpConfigCR を作成します。以下に例を示します。要件に応じて、デプロイメントに次の 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に設定します。以下のコマンドを実行して CR を作成します。
$ oc create -f grandmaster-clock-ptp-config.yaml
検証
PtpConfigプロファイルがノードに適用されていることを確認します。以下のコマンドを実行して、
openshift-ptpnamespace の Pod の一覧を取得します。$ oc get pods -n openshift-ptp -o wide出力例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-74m2g 3/3 Running 3 4d15h 10.16.230.7 compute-1.example.com ptp-operator-5f4f48d7c-x7zkf 1/1 Running 1 4d15h 10.128.1.145 compute-1.example.comプロファイルが正しいことを確認します。
PtpConfigプロファイルで指定したノードに対応するlinuxptpデーモンのログを検査します。以下のコマンドを実行します。$ oc logs linuxptp-daemon-74m2g -n openshift-ptp -c linuxptp-daemon-container出力例
ts2phc[94980.334]: [ts2phc.0.config] nmea delay: 98690975 ns ts2phc[94980.334]: [ts2phc.0.config] ens3f0 extts index 0 at 1676577329.999999999 corr 0 src 1676577330.901342528 diff -1 ts2phc[94980.334]: [ts2phc.0.config] ens3f0 master offset -1 s2 freq -1 ts2phc[94980.441]: [ts2phc.0.config] nmea sentence: GNRMC,195453.00,A,4233.24427,N,07126.64420,W,0.008,,160223,,,A,V phc2sys[94980.450]: [ptp4l.0.config] CLOCK_REALTIME phc offset 943 s2 freq -89604 delay 504 phc2sys[94980.512]: [ptp4l.0.config] CLOCK_REALTIME phc offset 1000 s2 freq -89264 delay 474
8.2.4.1. 2 カード E810 NIC のグランドマスタークロックとして linuxptp サービスを設定する リンクのコピーリンクがクリップボードにコピーされました!
NIC を設定する PtpConfig カスタムリソース (CR) を作成することにより、linuxptp サービス (ptp4l、phc2sys、ts2phc) を 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 タイミング出力に同期します。この設定は、
PtpConfigCR の 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 高速イベントを設定するには、ptp4lOpts、ptp4lConf、ptpClockThreshold に適切な値を設定します。ptpClockThreshold は、イベントが有効になっている場合にのみ使用されます。詳細は、「PTP 高速イベント通知パブリッシャーの設定」を参照してください。
前提条件
- 実稼働環境の T-GM クロックの場合は、ベアメタルクラスターホストに 2 枚の Intel E810 NIC がインストールされている。
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - PTP Operator をインストールします。
手順
PtpConfigCR を作成します。以下に例を示します。次の 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に設定します。以下のコマンドを実行して CR を作成します。
$ oc create -f grandmaster-clock-ptp-config-dual-nics.yaml
検証
PtpConfigプロファイルがノードに適用されていることを確認します。以下のコマンドを実行して、
openshift-ptpnamespace の Pod の一覧を取得します。$ oc get pods -n openshift-ptp -o wide出力例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-74m2g 3/3 Running 3 4d15h 10.16.230.7 compute-1.example.com ptp-operator-5f4f48d7c-x7zkf 1/1 Running 1 4d15h 10.128.1.145 compute-1.example.comプロファイルが正しいことを確認します。
PtpConfigプロファイルで指定したノードに対応するlinuxptpデーモンのログを検査します。以下のコマンドを実行します。$ oc logs linuxptp-daemon-74m2g -n openshift-ptp -c linuxptp-daemon-container出力例
ts2phc[509863.660]: [ts2phc.0.config] nmea delay: 347527248 ns ts2phc[509863.660]: [ts2phc.0.config] ens2f0 extts index 0 at 1705516553.000000000 corr 0 src 1705516553.652499081 diff 0 ts2phc[509863.660]: [ts2phc.0.config] ens2f0 master offset 0 s2 freq -0 I0117 18:35:16.000146 1633226 stats.go:57] state updated for ts2phc =s2 I0117 18:35:16.000163 1633226 event.go:417] dpll State s2, gnss State s2, tsphc state s2, gm state s2, ts2phc[1705516516]:[ts2phc.0.config] ens2f0 nmea_status 1 offset 0 s2 GM[1705516516]:[ts2phc.0.config] ens2f0 T-GM-STATUS s2 ts2phc[509863.677]: [ts2phc.0.config] ens7f0 extts index 0 at 1705516553.000000010 corr -10 src 1705516553.652499081 diff 0 ts2phc[509863.677]: [ts2phc.0.config] ens7f0 master offset 0 s2 freq -0 I0117 18:35:16.016597 1633226 stats.go:57] state updated for ts2phc =s2 phc2sys[509863.719]: [ptp4l.0.config] CLOCK_REALTIME phc offset -6 s2 freq +15441 delay 510 phc2sys[509863.782]: [ptp4l.0.config] CLOCK_REALTIME phc offset -7 s2 freq +15438 delay 502
8.2.4.2. 3 カード E810 NIC のグランドマスタークロックとして linuxptp サービスを設定する リンクのコピーリンクがクリップボードにコピーされました!
NIC を設定する PtpConfig カスタムリソース (CR) を作成することにより、linuxptp サービス (ptp4l、phc2sys、ts2phc) を 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 をインストールします。
手順
PtpConfigCR を作成します。以下に例を示します。次の 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に設定します。以下のコマンドを実行して CR を作成します。
$ oc create -f three-nic-grandmaster-clock-ptp-config.yaml
検証
PtpConfigプロファイルがノードに適用されていることを確認します。以下のコマンドを実行して、
openshift-ptpnamespace の 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プロファイルが正しいことを確認します。次のコマンドを実行し、
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 サービス (ptp4l、phc2sys、ts2phc) をグランドマスタークロックとして設定する PtpConfig カスタムリソース (CR) の設定オプションを説明します。
| PtpConfig CR フィールド | 説明 |
|---|---|
|
|
grandmaster クロック動作用に NIC を設定する
プラグインメカニズムにより、PTP Operator は自動ハードウェア設定を行うことができます。Intel Westport Channel NIC または Intel Logan Beach NIC では、 |
|
|
|
|
|
|
|
| データを破棄する前に、送信者からの送信 (TX) タイムスタンプを待機する最大時間を指定します。 |
|
| JBOD 境界クロック時間遅延値を指定します。この値は、ネットワーク時間デバイス間で受け渡される時間値を修正するために使用されます。 |
|
|
注記
ここにリストされているネットワークインターフェイスがグランドマスターとして設定されており、 |
|
|
|
|
|
|
|
|
オプション: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8.2.5.1. グランドマスタークロッククラスの同期状態のリファレンス リンクのコピーリンクがクリップボードにコピーされました!
次の表は、PTP グランドマスタークロック (T-GM) の gm.ClockClass の状態を示しています。
クロッククラスの状態では、Primary Reference Time Clock (PRTC) またはその他のタイミングソースに関連する精度と安定性に基づいて T-GM クロックが分類されます。
ホールドオーバー仕様とは、PTP クロックがプライマリータイムソースから更新を受信せずに同期を維持できる時間です。
| クロッククラスの状態 | 説明 |
|---|---|
|
|
T-GM クロックは |
|
|
T-GM クロックは |
|
|
T-GM クロックは |
詳細は、"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 つあります (SMA1、SMA2、U.FL1、U.FL2)。
| ハードウェアピン | 推奨設定 | 説明 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
次の例に示すように、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 コマンドを示しています。
| ubxtool コマンド | 説明 |
|---|---|
|
|
アンテナ電圧制御を有効にし、 |
|
| アンテナが GPS 信号を受信できるようにします。 |
|
| Galileo GPS 衛星から信号を受信するようにアンテナを設定します。 |
|
| アンテナが GLONASS GPS 衛星から信号を受信できないようにします。 |
|
| アンテナが BeiDou GPS 衛星から信号を受信できないようにします。 |
|
| アンテナが SBAS GPS 衛星から信号を受信できないようにします。 |
|
| GNSS 受信機のサーベイインプロセスを設定して、初期位置の推定を改善します。最適な結果が得られるまでに最大 24 時間かかる場合があります。 |
|
| ハードウェアの自動スキャンを 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 信号遅延を補正する必要があります。ケーブルの長さ、周囲温度、コンポーネントと製作公差などのさまざまな要因が信号遅延に影響を与える可能性があります。遅延を補正するには、信号遅延のオフセットに使用する特定の値を計算する必要があります。
| PtpConfig フィールド | 説明 |
|---|---|
|
| PTP Operator E810 ハードウェアプラグインを使用して E810 ハードウェアピンを設定します。
|
|
|
|
|
|
複数の NIC のサポートを有効にするには、 |
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:SMA1で1PPS OUT(Tx) を有効にします。 -
1 1:SMA1で1PPS 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 信号遅延を補正する必要があります。ケーブルの長さ、周囲温度、コンポーネントと製作公差などのさまざまな要因が信号遅延に影響を与える可能性があります。遅延を補正するには、信号遅延のオフセットに使用する特定の値を計算する必要があります。
| PtpConfig フィールド | 説明 |
|---|---|
|
| PTP Operator E810 ハードウェアプラグインを使用して E810 ハードウェアピンを設定します。
|
|
|
|
|
|
複数の NIC のサポートを有効にするには、 |
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 クロックは、ホールドオーバーパラメーターの LocalMaxHoldoverOffSet と LocalHoldoverTimeout を使用してスロープを計算します。スロープは、位相オフセットが時間の経過とともに変化するレートです。これはナノ秒/秒単位で測定され、設定された値は、指定された期間内にオフセットがどれだけ増加するかを示します。
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 クロックは ホールドオーバー モードに入ります。T-GM クロックは内部クロックを使用して時間の精度を維持します。
GNSS 信号が復旧し、T-GM クロックは ロック モードに戻ります。GNSS シグナルが復元されると、ts2phc オフセット、Digital Phase-Locked Loop (DPLL) 位相オフセット、GNSS オフセットなど、同期チェーン内のすべての依存コンポーネントが安定した LOCKED モードに達した後にのみ、T-GM クロックは再び LOCKED モードになります。
GNSS 信号が再び途絶え、T-GM クロックは ホールドオーバー モードに戻ります。タイムエラーの増加が始まります。
トレーサビリティの喪失が長期間続いたため、時間誤差が MaxInSpecOffset の しきい値を超えました。
GNSS 信号が復旧し、T-GM クロックの同期が再開されました。タイムエラーの減少が始まります。
時間誤差は減少し、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。
手順
トリプルポート T-BC NIC を設定します。以下の例では、
PtpConfigリソースに 2 つのプロファイルが含まれています。1 つは時間送信ポート (00-tbc-tt) 用で、もう 1 つはすべてのハードウェア、TR ポート、およびts2phcとphc2sysプロセスを設定するためのものです。apiVersion: ptp.openshift.io/v1 kind: PtpConfig metadata: name: t-bc namespace: openshift-ptp spec: profile: - name: 00-tbc-tt ptp4lConf: | [ens4f0] masterOnly 11 [ens8f0] masterOnly 12 [ens1f0] masterOnly 13 [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 ens4f14 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 257 uds_address /var/run/ptp4l.0.socket8 [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 110 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
- ハードウェアプラグインの相互接続セクションには、
ens4f0、ens1f0、ens8f0の 3 つの NIC があります。プライマリー NIC (ens4f0) は、gnnsInputフィールドがfalseに設定され、かつ TR ポートを指定するupstreamPortフィールドを持つ唯一の NIC です。また、phaseOutputConnectors、SMA1、SMA2のリストもあります。次の NIC にはinputConnectorフィールドがあります。T-BC 設定と T-TSC 設定の両方で、タイムレシーバー NICens4f0と特定の TR ポート (upstreamPort: ens4f1) を設定します。 - 7
ts2phc設定には、アップストリーム PTP ドメインのdomainNumberが含まれています。- 8
ts2phc設定にはuds_addressが含まれています。その値は重要ではありません。なぜなら、デーモンが正しいアドレスでそれにパッチを当てるからです。- 9
ts2phc設定には、このセットアップに参加しているすべての NIC (ens4f0、ens1f0、および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) を設定した。
手順
PtpConfigCR のphc2sysOptsセクションで自動うるう秒処理を設定します。以下のオプションを設定します。phc2sysOpts: -r -u 0 -m -N 8 -R 16 -S 2 -s ens2f0 -n 24注記以前は、過去のうるう秒を考慮するために、
phc2sys設定 (-O -37) のオフセット調整が T-GM に必要でした。これは不要になりました。PtpConfigCR の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"
検証
設定した 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 218leap-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 サービス (ptp4l、phc2sys を設定できます。
次の例の PtpConfig CR を、特定のハードウェアおよび環境の境界クロックとして linuxptp サービスを設定する基礎として使用します。この例の CR は PTP 高速イベントを設定しません。PTP 高速イベントを設定するには、ptp4lOpts、ptp4lConf、ptpClockThreshold に適切な値を設定します。ptpClockThreshold は、イベントが有効になっている場合にのみ使用されます。詳細は、「PTP 高速イベント通知パブリッシャーの設定」を参照してください。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - PTP Operator をインストールします。
手順
以下の
PtpConfigCR を作成してから、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 フィールド 説明 namePtpConfigCR の名前。profile1 つ以上の
profileオブジェクトの配列を指定します。nameプロファイルオブジェクトを一意に識別するプロファイルオブジェクトの名前を指定します。
ptp4lOptsptp4lサービスのシステム設定オプションを指定します。ネットワークインターフェイス名とサービス設定ファイルが自動的に追加されるため、オプションには、ネットワークインターフェイス名-i <interface>およびサービス設定ファイル-f /etc/ptp4l.confを含めないでください。ptp4lConfptp4lを境界クロックとして起動するために必要な設定を指定します。たとえば、ens1f0はグランドマスタークロックから同期し、ens1f3は接続されたデバイスを同期します。<interface_1>同期クロックを受信するインターフェイス。
<interface_2>synchronization クロックを送信するインターフェイス。
tx_timestamp_timeoutIntel Columbiaville 800 Series NIC の場合、
tx_timestamp_timeoutを50に設定します。boundary_clock_jbodIntel Columbiaville 800 Series NIC の場合、
boundary_clock_jbodが0に設定されていることを確認します。Intel Fortville X710 シリーズ NIC の場合、boundary_clock_jbodが1に設定されていることを確認します。phc2sysOptsphc2sysサービスのシステム設定オプションを指定します。このフィールドが空の場合、PTP Operator はphc2sysサービスを開始しません。ptpSchedulingPolicyptp4l と phc2sys プロセスのスケジューリングポリシー。デフォルト値は
SCHED_OTHERです。FIFO スケジューリングをサポートするシステムでは、SCHED_FIFOを使用してください。ptpSchedulingPriorityptpSchedulingPolicyがSCHED_FIFOに設定されている場合に、ptp4lおよびphc2sysプロセスの FIFO の優先度を設定するために使用される 1-65 の整数値。ptpSchedulingPriorityフィールドは、ptpSchedulingPolicyがSCHED_OTHERに設定されている場合は使用されません。ptpClockThresholdオプション:
ptpClockThresholdが存在しない場合、ptpClockThresholdフィールドにはデフォルト値が使用されます。ptpClockThresholdは、PTP マスタークロックが切断されてから PTP イベントが発生するまでの時間を設定します。holdOverTimeoutは、PTP マスタークロックが切断されたときに、PTP クロックイベントの状態がFREERUNに変わるまでの時間値 (秒単位) です。maxOffsetThresholdおよびminOffsetThreshold設定は、CLOCK_REALTIME(phc2sys) またはマスターオフセット (ptp4l) の値と比較するナノ秒単位のオフセット値を設定します。ptp4lまたはphc2sysのオフセット値がこの範囲外の場合、PTP クロックの状態がFREERUNに設定されます。オフセット値がこの範囲内にある場合、PTP クロックの状態がLOCKEDに設定されます。recommendprofileがノードに適用される方法を定義する 1 つ以上のrecommendオブジェクトの配列を指定します。.recommend.profileprofileセクションで定義される.recommend.profileオブジェクト名を指定します。.recommend.priority0から99までの整数値でpriorityを指定します。数値が大きいほど優先度が低くなるため、99の優先度は10よりも低くなります。ノードがmatchフィールドで定義されるルールに基づいて複数のプロファイルに一致する場合、優先順位の高いプロファイルがそのノードに適用されます。.recommend.match.recommend.matchルールをnodeLabelまたはnodeNameの値に指定します。.recommend.match.nodeLabeloc get nodes --show-labelsコマンドを使用して、ノードオブジェクトのnode.LabelsフィールドのkeyでnodeLabelを設定します。例:node-role.kubernetes.io/worker。.recommend.match.nodeNameoc get nodesコマンドを使用して、nodeNameをノードオブジェクトのnode.Nameフィールドの値に設定します。compute-1.example.comはその例です。以下のコマンドを実行して CR を作成します。
$ oc create -f boundary-clock-ptp-config.yaml
検証
PtpConfigプロファイルがノードに適用されていることを確認します。以下のコマンドを実行して、
openshift-ptpnamespace の Pod の一覧を取得します。$ oc get pods -n openshift-ptp -o wide出力例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-4xkbb 1/1 Running 0 43m 10.1.196.24 compute-0.example.com linuxptp-daemon-tdspf 1/1 Running 0 43m 10.1.196.25 compute-1.example.com ptp-operator-657bbb64c8-2f8sj 1/1 Running 0 43m 10.129.0.61 control-plane-1.example.comプロファイルが正しいことを確認します。
PtpConfigプロファイルで指定したノードに対応するlinuxptpデーモンのログを検査します。以下のコマンドを実行します。$ oc logs linuxptp-daemon-4xkbb -n openshift-ptp -c linuxptp-daemon-container出力例
I1115 09:41:17.117596 4143292 daemon.go:107] in applyNodePTPProfile I1115 09:41:17.117604 4143292 daemon.go:109] updating NodePTPProfile to: I1115 09:41:17.117607 4143292 daemon.go:110] ------------------------------------ I1115 09:41:17.117612 4143292 daemon.go:102] Profile Name: profile1 I1115 09:41:17.117616 4143292 daemon.go:102] Interface: I1115 09:41:17.117620 4143292 daemon.go:102] Ptp4lOpts: -2 I1115 09:41:17.117623 4143292 daemon.go:102] Phc2sysOpts: -a -r -n 24 I1115 09:41:17.117626 4143292 daemon.go:116] ------------------------------------
8.2.9.1. linuxptp サービスをデュアル NIC ハードウェアの境界クロックとして設定 リンクのコピーリンクがクリップボードにコピーされました!
NIC ごとに PtpConfig カスタムリソース (CR) オブジェクトを作成することにより、linuxptp サービス (ptp4l、phc2sys) をデュアル NIC ハードウェアの境界クロックとして設定できます。
デュアル NIC ハードウェアを使用すると、各 NIC を同じアップストリームリーダークロックに接続し、NIC ごとに個別の ptp4l インスタンスをダウンストリームクロックに供給することができます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - PTP Operator をインストールします。
手順
「linuxptp サービスを境界クロックとして設定」の参照 CR を各 CR の基礎として使用して、NIC ごとに 1 つずつ、2 つの個別の
PtpConfigCR を作成します。以下に例を示します。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-daemonDaemonSetはログを解析し、Prometheus メトリクスを生成します。
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 番目のPtpConfigCR からphc2sysOptsフィールドを完全に削除する必要があります。
次のコマンドを実行して、デュアル NIC
PtpConfigCR を作成します。1 番目の NIC の PTP を設定する CR を作成します。
$ oc create -f boundary-clock-ptp-config-nic1.yaml2 番目の NIC の PTP を設定する CR を作成します。
$ oc create -f boundary-clock-ptp-config-nic2.yaml
検証
PTP Operator が両方の NIC に
PtpConfigCR を適用したことを確認します。デュアル 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
8.2.9.2. デュアル NIC Intel E810 PTP 境界クロック用の高可用性システムクロックとして linuxptp を設定する リンクのコピーリンクがクリップボードにコピーされました!
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 を使用してクラスターノードを設定します。
手順
「linuxptp サービスをデュアル NIC ハードウェアの境界クロックとして設定」の CR を各 CR の参照として使用して、NIC ごとに 1 つずつ、2 つの個別の
PtpConfigCR を作成します。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に空の文字列を設定します。これらの値は、高可用性を設定するPtpConfigCR のspec.profile.ptpSettings.haProfilesフィールドから入力されます。
次のコマンドを実行して、NIC 1 に
PtpConfigCR を適用します。$ oc create -f ha-ptp-config-nic1.yamlphc2sysOptsフィールドに空の文字列を指定して、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: ""次のコマンドを実行して、NIC 2 に
PtpConfigCR を適用します。$ oc create -f ha-ptp-config-nic2.yaml
HA システムクロックを設定する
PtpConfigCR を作成します。以下に例を示します。ptp-config-for-ha.yamlファイルを作成します。2 つの NIC を設定するPtpConfigCR で設定されているmetadata.nameフィールドと一致するようにhaProfilesを設定します。例:haProfiles: ha-ptp-config-nic1,ha-ptp-config-nic2apiVersion: 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 を設定する
PtpConfigCR の前に、高可用性PtpConfigCR を適用しないでください。次のコマンドを実行して、HA
PtpConfigCR を適用します。$ oc create -f ptp-config-for-ha.yaml
検証
PTP Operator が
PtpConfigCR を正しく適用したことを確認します。以下の手順を実行します。以下のコマンドを実行して、
openshift-ptpnamespace の 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-daemonPod は 1 つだけ存在する必要があります。次のコマンドを実行して、プロファイルが正しいことを確認します。
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 サービス (ptp4l、phc2sys) を通常のクロックとして設定できます。
次の例の PtpConfig CR を、特定のハードウェアおよび環境の通常クロックとして linuxptp サービスを設定する基礎として使用します。この例の CR は PTP 高速イベントを設定しません。PTP 高速イベントを設定するには、ptp4lOpts、ptp4lConf、ptpClockThreshold に適切な値を設定します。ptpClockThreshold は、イベントが有効な場合にのみ必要です。詳細は、「PTP 高速イベント通知パブリッシャーの設定」を参照してください。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - PTP Operator をインストールします。
手順
以下の
PtpConfigCR を作成してから、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 フィールド 説明 namePtpConfigCR の名前。profile1 つ以上の
profileオブジェクトの配列を指定します。各プロファイルの名前は一意である必要があります。interfaceptp4lサービスで使用するネットワークインターフェイスを指定します (例:ens787f1)。ptp4lOptsptp4lサービスのシステム設定オプションを指定します。たとえば、-2で IEEE 802.3 ネットワークトランスポートを選択します。ネットワークインターフェイス名とサービス設定ファイルが自動的に追加されるため、オプションには、ネットワークインターフェイス名-i <interface>およびサービス設定ファイル-f /etc/ptp4l.confを含めないでください。このインターフェイスで PTP 高速イベントを使用するには、--summary_interval -4を追加します。phc2sysOptsphc2sysサービスのシステム設定オプションを指定します。このフィールドが空の場合、PTP Operator はphc2sysサービスを開始しません。Intel Columbiaville 800 Series NIC の場合、phc2sysOptsオプションを-a -r -m -n 24 -N 8 -R 16に設定します。-mはメッセージをstdoutに出力します。linuxptp-daemonDaemonSetはログを解析し、Prometheus メトリクスを生成します。ptp4lConfデフォルトの
/etc/ptp4l.confファイルを置き換える設定が含まれる文字列を指定します。デフォルト設定を使用するには、フィールドを空のままにします。tx_timestamp_timeoutIntel Columbiaville 800 Series NIC の場合、
tx_timestamp_timeoutを50に設定します。boundary_clock_jbodIntel Columbiaville 800 Series NIC の場合、
boundary_clock_jbodを0に設定します。ptpSchedulingPolicyptp4lとphc2sysプロセスのスケジューリングポリシー。デフォルト値はSCHED_OTHERです。FIFO スケジューリングをサポートするシステムでは、SCHED_FIFOを使用してください。ptpSchedulingPriorityptpSchedulingPolicyがSCHED_FIFOに設定されている場合に、ptp4lおよびphc2sysプロセスの FIFO の優先度を設定するために使用される 1-65 の整数値。ptpSchedulingPriorityフィールドは、ptpSchedulingPolicyがSCHED_OTHERに設定されている場合は使用されません。ptpClockThresholdオプション:
ptpClockThresholdが存在しない場合、ptpClockThresholdフィールドにはデフォルト値が使用されます。ptpClockThresholdは、PTP マスタークロックが切断されてから PTP イベントが発生するまでの時間を設定します。holdOverTimeoutは、PTP マスタークロックが切断されたときに、PTP クロックイベントの状態がFREERUNに変わるまでの時間値 (秒単位) です。maxOffsetThresholdおよびminOffsetThreshold設定は、CLOCK_REALTIME(phc2sys) またはマスターオフセット (ptp4l) の値と比較するナノ秒単位のオフセット値を設定します。ptp4lまたはphc2sysのオフセット値がこの範囲外の場合、PTP クロックの状態がFREERUNに設定されます。オフセット値がこの範囲内にある場合、PTP クロックの状態がLOCKEDに設定されます。recommendprofileがノードに適用される方法を定義する 1 つ以上のrecommendオブジェクトの配列を指定します。.recommend.profileprofileセクションで定義される.recommend.profileオブジェクト名を指定します。.recommend.priority通常クロックの
.recommend.priorityを0に設定します。.recommend.match.recommend.matchルールをnodeLabelまたはnodeNameの値に指定します。.recommend.match.nodeLabeloc get nodes --show-labelsコマンドを使用して、ノードオブジェクトのnode.LabelsフィールドのkeyでnodeLabelを設定します。例:node-role.kubernetes.io/worker。.recommend.match.nodeNameoc get nodesコマンドを使用して、nodeNameをノードオブジェクトのnode.Nameフィールドの値に設定します。compute-1.example.comはその例です。次のコマンドを実行して、
PtpConfigCR を作成します。$ oc create -f ordinary-clock-ptp-config.yaml
検証
PtpConfigプロファイルがノードに適用されていることを確認します。以下のコマンドを実行して、
openshift-ptpnamespace の Pod の一覧を取得します。$ oc get pods -n openshift-ptp -o wide出力例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-4xkbb 1/1 Running 0 43m 10.1.196.24 compute-0.example.com linuxptp-daemon-tdspf 1/1 Running 0 43m 10.1.196.25 compute-1.example.com ptp-operator-657bbb64c8-2f8sj 1/1 Running 0 43m 10.129.0.61 control-plane-1.example.comプロファイルが正しいことを確認します。
PtpConfigプロファイルで指定したノードに対応するlinuxptpデーモンのログを検査します。以下のコマンドを実行します。$ oc logs linuxptp-daemon-4xkbb -n openshift-ptp -c linuxptp-daemon-container出力例
I1115 09:41:17.117596 4143292 daemon.go:107] in applyNodePTPProfile I1115 09:41:17.117604 4143292 daemon.go:109] updating NodePTPProfile to: I1115 09:41:17.117607 4143292 daemon.go:110] ------------------------------------ I1115 09:41:17.117612 4143292 daemon.go:102] Profile Name: profile1 I1115 09:41:17.117616 4143292 daemon.go:102] Interface: ens787f1 I1115 09:41:17.117620 4143292 daemon.go:102] Ptp4lOpts: -2 -s I1115 09:41:17.117623 4143292 daemon.go:102] Phc2sysOpts: -a -r -n 24 I1115 09:41:17.117626 4143292 daemon.go:116] ------------------------------------
8.2.10.1. PTP の通常クロックリファレンスとしての Intel Columbiaville E800 シリーズ NIC リンクのコピーリンクがクリップボードにコピーされました!
次の表は、Intel Columbiaville E800 シリーズ NIC を通常のクロックとして使用するために、PTP リファレンス設定に加える必要がある変更を説明します。クラスターに適用する PtpConfig カスタムリソース (CR) に変更を加えます。
| PTP 設定 | 推奨設定 |
|---|---|
|
|
|
|
|
|
|
|
|
phc2sysOpts の場合、-m はメッセージを stdout に出力します。linuxptp-daemon DaemonSet はログを解析し、Prometheus メトリクスを生成します。
8.2.10.2. デュアルポート NIC 冗長性を備えた通常のクロックとして linuxptp サービスを設定する リンクのコピーリンクがクリップボードにコピーされました!
PtpConfig カスタムリソース (CR) オブジェクトを作成することで、linuxptp サービス (ptp4l、phc2sys) をデュアルポート NIC 冗長性を備えた通常のクロックとして設定できます。
通常のクロックのデュアルポート NIC 設定では、1 つのポートに障害が発生した場合、スタンバイポートが引き継ぎ、PTP タイミング同期を維持します。
linuxptp サービスをデュアルポート NIC 冗長性を備えた通常のクロックとして設定することは、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - PTP Operator をインストールします。
- 冗長性のある通常のクロックとしてデュアルポート NIC を使用するためのハードウェア要件を確認する。詳細は、「デュアルポート NIC を使用して PTP 通常クロックの冗長性を向上させる」を参照してください。
手順
次の
PtpConfigCR を作成し、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を通常のクロックとしてのみ実行するように設定します。
次のコマンドを実行して、
PtpConfigCR を作成します。$ oc create -f oc-dual-port-ptp-config.yaml
検証
PtpConfigプロファイルがノードに適用されていることを確認します。以下のコマンドを実行して、
openshift-ptpnamespace の Pod の一覧を取得します。$ oc get pods -n openshift-ptp -o wide出力例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-4xkbb 1/1 Running 0 43m 10.1.196.24 compute-0.example.com linuxptp-daemon-tdspf 1/1 Running 0 43m 10.1.196.25 compute-1.example.com ptp-operator-657bbb64c8-2f8sj 1/1 Running 0 43m 10.129.0.61 control-plane-1.example.comプロファイルが正しいことを確認します。
PtpConfigプロファイルで指定したノードに対応するlinuxptpデーモンのログを検査します。以下のコマンドを実行します。$ oc logs linuxptp-daemon-4xkbb -n openshift-ptp -c linuxptp-daemon-container出力例
I1115 09:41:17.117596 4143292 daemon.go:107] in applyNodePTPProfile I1115 09:41:17.117604 4143292 daemon.go:109] updating NodePTPProfile to: I1115 09:41:17.117607 4143292 daemon.go:110] ------------------------------------ I1115 09:41:17.117612 4143292 daemon.go:102] Profile Name: 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 が設定されている場合には、ptp4l と phc2sys は、PtpConfig CR の ptpSchedulingPriority フィールドで設定された優先順位で、chrt の下の親コンテナーで実行されます。
ptpSchedulingPolicy の設定は任意です。レイテンシーエラーが発生している場合にのみ必要です。
手順
PtpConfigCR プロファイルを編集します。$ oc edit PtpConfig -n openshift-ptpptpSchedulingPolicyとptpSchedulingPriorityフィールドを変更します。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 の整数値を設定します。
-
保存して終了すると、
PtpConfigCR に変更が適用されます。
検証
PtpConfigCR が適用されたlinuxptp-daemonPod と対応するノードの名前を取得します。$ 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.comptp4lプロセスが、更新されたchrtFIFO 優先度で実行されていることを確認します。$ 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 をインストールします。
手順
PtpConfigCR を編集します。$ oc edit PtpConfig -n openshift-ptpspec.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に戻すと、マスターオフセットメッセージを含めることができます。-
保存して終了すると、
PtpConfigCR に変更が適用されます。
検証
PtpConfigCR が適用されたlinuxptp-daemonPod と対応するノードの名前を取得します。$ 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次のコマンドを実行して、マスターオフセットメッセージがログから除外されていることを確認します。
$ oc -n openshift-ptp logs <linux_daemon_container> -c linuxptp-daemon-container | grep "master offset"<linux_daemon_container>はlinuxptp-daemonPod の名前です。たとえば、linuxptp-daemon-gmv2n です。logReduce仕様を設定する場合、このコマンドはlinuxptpデーモンのログにmaster offsetのインスタンスを報告しません。
8.2.12.2. 拡張 PTP ログ抑制の設定 リンクのコピーリンクがクリップボードにコピーされました!
基本的なログ抑制を使用することで、頻繁に発生するログを効果的に除外します。ただし、フィルタリングされたログのまとめが定期的に必要な場合は、拡張ログ抑制機能を使用してください。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - PTP Operator をインストールします。
手順
PtpConfigカスタムリソース (CR) を編集します。$ oc edit PtpConfig -n openshift-ptpspec.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"オプション: サマリーログの間隔と、マスターオフセットログのしきい値 (ナノ秒単位) を設定します。たとえば、間隔を 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 ナノ秒を超えると、その特定のログエントリーが記録されます。
-
デフォルトでは、値が指定されていない場合、
オプション: マスターオフセットしきい値なしで間隔を設定するには、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"-
保存して終了すると、
PtpConfigCR に変更が適用されます。
検証
次のコマンドを実行して、
linuxptp-daemonPod の名前と、PtpConfigCR の適用先の対応するノードを取得します。$ 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次のコマンドを実行して、マスターオフセットメッセージがログから除外されていることを確認します。
$ oc -n openshift-ptp logs <linux_daemon_container> -c linuxptp-daemon-container | grep "master offset"-
<linux_daemon_container>はlinuxptp-daemonPod の名前です。たとえば、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 をインストールします。
手順
以下のコマンドを実行して、PTPOperator のインストールを確認してください。
$ oc get pods -n openshift-ptp -o wide出力は、PTP Operator Pod と
linuxptp-daemonPod のリスト表示と類似しています。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-containerとkube-rbac-proxy) が実行されていることを示します。注記linuxptp-daemonPod の数は、DaemonSet のデプロイメントを制御するPtpOperatorConfigで定義されたノードラベルによって決定されます。ステップ 4 で示した PtpConfig プロファイルのマッチングは、実行中のデーモンに適用される特定の PTP 設定を決定するだけです。この例では、オペレーターの設定は 5 つのワーカーノードすべてを対象としています。シングルノードの OpenShift クラスターの場合、設定はワーカーとして機能するコントロールプレーンノードのみを対象としているため、linuxptp-daemonPod は 1 つしか表示されません。
-
以下のコマンドを実行して、どのネットワークインターフェイスがハードウェアタイムスタンプをサポートしているかを確認してください。
$ 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: ""この例では出力されています。
-
ens7f0とens7f1は PTP 対応インターフェイス (Intel E810 NIC ポート) です。 phcIndex はPTP ハードウェアクロック番号を示します (/dev/ptp0、/dev/ptp1などにマッピングされます)。注記出力には、PTP 対応インターフェイスを持つノードごとに 1 つの NodePtpDevice リソースが表示されます。この例では、5 つのワーカーノードに Intel E810 NIC が搭載されています。シングルノードの OpenShift クラスターの場合、NodePtpDevice リソースは 1 つしか表示されません。
-
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 と表示されます)。
-
この例では、
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>重要例として挙げたインターフェイス名 (
ens7f0、ens7f1) を、手順 2 で見つけた実際の E810 NIC インターフェイス名に置き換えてください。一般的な E810 インターフェイスの命名パターンには、ens7f0、ens8f0、eth0、enp2s0f0などがあります。正確な名称は、システムファームウェアの設定と 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 のハードウェアタイムスタンプを使用する
-
以下のコマンドを実行して、
PtpConfigCR を適用します。$ oc apply -f ptp-config-gnss-ntp-failover.yaml出力は以下の例のようになります。
ptpconfig.ptp.openshift.io/grandmaster created
検証
PTP デーモンは 30 秒ごとにプロファイルの更新を確認します。約 30 秒待ってから、以下のコマンドを実行して確認してください。
$ oc get ptpconfig -n openshift-ptp出力は以下の例のようになります。
NAME AGE grandmaster 2mNodePtpDevice でプロファイルが適用されているかどうかを確認するには、次のコマンドを実行します。
<node_name>をノードのホスト名に置き換えてください。$ oc describe nodeptpdevice <node_name> -n openshift-ptpたとえば、ワーカーノードを持つマルチノードクラスターの場合:
worker-0.cluster.localシングルノードの OpenShift クラスターの場合は、コントロールプレーンノード名を使用します。コントロールプレーンノード名は、以下のコマンドを実行することで確認できます。
$ oc get nodesデーモンのログを監視して、プロファイルがロードされているかどうかを確認してください。
$ 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 プロファイルが存在しません
-
以下のコマンドを実行して、
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)以下のコマンドを実行して、GNSS/gpsd を確認してください。
$ oc logs -n openshift-ptp <linuxptp-daemon-pod> -c linuxptp-daemon-container | grep gpsdGNSS が正常に機能している場合、出力には以下のように表示されます。
-
gpsdが正常に起動しました -
そのようなファイルまたはディレクトリーは存在しませんというエラーは存在しません。
-
以下のコマンドを実行して、
ts2phc(GNSS 同期) の状態を確認してください。$ oc logs -n openshift-ptp <linuxptp-daemon-pod> -c linuxptp-daemon-container | grep ts2phc以下のコマンドを実行して、
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
8.2.13.2. シングルノード OpenShift 上で GNSS フェイルオーバーを備えた PTP グランドマスター設定を作成する リンクのコピーリンクがクリップボードにコピーされました!
この手順では、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 をインストールします。
手順
以下のコマンドを実行して、PTPOperator のインストールを確認してください。
$ oc get pods -n openshift-ptp -o wide出力は以下のようになり、PTP Operator pod と単一の
linuxptp-daemonpod がリスト表示されます。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-containerとkube-rbac-proxy) が実行されていることを示しています。
-
以下のコマンドを実行して、どのネットワークインターフェイスがハードウェアタイムスタンプをサポートしているかを確認してください。
$ 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: ""この例では出力されています。
-
ens7f0とens7f1は PTP 対応インターフェイス (Intel E810 NIC ポート) です。 phcIndex はPTP ハードウェアクロック番号を示します (/dev/ptp0、/dev/ptp1などにマッピングされます)。注記シングルノードの OpenShift クラスターでは、単一のマスターノードに対して 1 つの NodePtpDevice リソースのみが表示されます。
-
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 プロファイルはマスターノードラベルを対象とする必要があります。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重要例として挙げたインターフェイス名 (
ens7f0、ens7f1) を、手順 2 で見つけた実際の E810 NIC インターフェイス名に置き換えてください。一般的な E810 インターフェイスの命名パターンには、ens7f0、ens8f0、eth0、enp2s0f0などがあります。正確な名称は、システム BIOS の設定と Linux ネットワークデバイスの命名規則によって異なります。また、/dev/ttyGNSS_1700_0を実際の GNSS シリアルポートデバイスのパスに置き換えてください。nodeLabelはnode-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 のハードウェアタイムスタンプを使用する
-
以下のコマンドを実行して、
PtpConfigCR を適用します。$ oc apply -f ptp-config-gnss-ntp-failover-sno.yaml出力は以下の例のようになります。
ptpconfig.ptp.openshift.io/grandmaster created
検証
PTP デーモンは 30 秒ごとにプロファイルの更新を確認します。約 30 秒待ってから、以下のコマンドを実行して確認してください。
$ oc get ptpconfig -n openshift-ptp出力は以下の例のようになります。
NAME AGE grandmaster 2mプロファイルが適用されているかどうか、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デーモンのログを監視して、プロファイルがロードされているかどうかを確認してください。まず、デーモン 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 プロファイルが存在しません
-
以下のコマンドを実行して、
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)以下のコマンドを実行して、GNSS/gpsd を確認してください。
$ oc logs -n openshift-ptp linuxptp-daemon-xz8km -c linuxptp-daemon-container | grep gpsdGNSS が正常に機能している場合、出力には以下のように表示されます。
-
gpsdが正常に起動しました -
そのようなファイルまたはディレクトリーは存在しませんというエラーは存在しません。
-
以下のコマンドを実行して、
ts2phc(GNSS 同期) の状態を確認してください。$ oc logs -n openshift-ptp linuxptp-daemon-xz8km -c linuxptp-daemon-container | grep ts2phc以下のコマンドを実行して、
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 をベアメタルクラスターにインストールします。
手順
設定されたノードのクラスターに 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-daemonPod の数は3/3になります。PTP 高速イベントバスが有効になっていない場合、2/2が表示されます。サポートされているハードウェアがクラスターにあることを確認します。
$ oc -n openshift-ptp get nodeptpdevices.ptp.openshift.io出力例
NAME AGE control-plane-0.example.com 10d control-plane-1.example.com 10d compute-0.example.com 10d compute-1.example.com 10d compute-2.example.com 10dノードで利用可能な PTP ネットワークインターフェイスを確認します。
$ oc -n openshift-ptp get nodeptpdevices.ptp.openshift.io <node_name> -o yamlここでは、以下のようになります。
- <node_name>
問い合わせるノードを指定します (例:
compute-0.example.com)。出力例
apiVersion: ptp.openshift.io/v1 kind: NodePtpDevice metadata: creationTimestamp: "2021-09-14T16:52:33Z" generation: 1 name: compute-0.example.com namespace: openshift-ptp resourceVersion: "177400" uid: 30413db0-4d8d-46da-9bef-737bacd548fd spec: {} status: devices: - name: eno1 - name: eno2 - name: eno3 - name: eno4 - name: enp5s0f0 - name: enp5s0f1
対応するノードの
linuxptp-daemonPod にアクセスし、PTP インターフェイスがプライマリークロックに正常に同期されていることを確認します。以下のコマンドを実行して、
linuxptp-daemonPod の名前と、トラブルシューティングに使用するノードを取得します。$ 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リモートシェルが必要な
linuxptp-daemonコンテナーへのリモートシェルです。$ oc rsh -n openshift-ptp -c linuxptp-daemon-container <linux_daemon_container>ここでは、以下のようになります。
- <linux_daemon_container>
-
診断するコンテナーです (例:
linuxptp-daemon-lmvgn)。
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
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.0GNSS をソースとするグランドマスタークロックの場合は、
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 をインストールしている。
手順
次のコマンドを実行してデバッグ Pod を起動します。
$ oc debug node/<node_name>ここでは、以下のようになります。
- <node_name>
- Intel 800 シリーズ NIC をインストールしたノードです。
devlinkツールと、NIC がインストールされているバスおよびデバイス名を使用して、NIC の CGU ファームウェアバージョンを確認します。たとえば、以下のコマンドを実行します。sh-4.4# devlink dev info <bus_name>/<device_name> | grep cguここでは、以下のようになります。
- <bus_name>
-
NIC がインストールされているバスです (例:
pci)。 - <device_name>
-
NIC デバイス名です (例:
0000:51:00.0)。
出力例
cgu.id 36 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 進数値 00011
0000 00113
0000 00000
0000 00011
8.2.16. PTP Operator データの収集 リンクのコピーリンクがクリップボードにコピーされました!
oc adm must-gather コマンドを使用すると、PTP Operator に関連する機能やオブジェクトなど、クラスターに関する情報を収集できます。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。 - PTP Operator がインストールされている。
手順
must-gatherを使用して PTP Operator データを収集するには、PTP Operatormust-gatherイメージを指定する必要があります。$ oc adm must-gather --image=registry.redhat.io/openshift4/ptp-must-gather-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 Operator が管理する Pod の
linuxptp-daemonプロセスは、KubernetesDaemonSetとして実行され、さまざまなlinuxptpプロセス (ptp4l、phc2sys、およびオプションでグランドマスタークロック用のts2phc) を管理します。linuxptp-daemonは、イベントを UNIX ドメインソケットに渡します。 -
イベントはクラウドイベントプロキシーサイドカーに渡されます -
PTP プラグインは、UNIX ドメインソケットからイベントを読み取り、PTP Operator が管理する Pod 内の
cloud-event-proxyサイドカーに渡します。cloud-event-proxyは、イベントを Kubernetes インフラストラクチャーから Cloud-Native Network Functions (CNF) に低レイテンシーで配信します。 -
イベントが公開されました -
PTP Operator 管理 Pod 内の
cloud-event-proxyサイドカーはイベントを処理し、PTP イベント REST API v2 を使用してイベントを公開します。 -
コンシューマーアプリケーションが購読を要求し、購読したイベントを受信する -
コンシューマーアプリケーションは、プロデューサー
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 がインストールされている。
手順
デフォルトの PTP Operator 設定を変更して、PTP 高速イベントを有効にします。
次の 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: true1 - 1
enableEventPublisherをtrueに設定して、PTP 高速イベント通知を有効にします。
PtpOperatorConfigCR を更新します。$ oc apply -f ptp-operatorconfig.yaml
PTP 対応インターフェイスの
PtpConfigカスタムリソースを作成し、ptpClockThresholdおよびptp4lOptsに必要な値を設定します。次の YAML は、PtpConfigCR で設定する必要のある値 (必須) を示しています。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-daemonDaemonSetはログを解析し、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 イベントコンシューマーアプリケーションには次の機能が必要です。
-
POSTハンドラーで実行され、クラウドネイティブ PTP イベントの JSON ペイロードを受信する Web サービス -
PTP イベントプロデューサーをサブスクライブするための
createSubscription関数 -
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"
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",
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はその例です。
8.3.5. PTP イベント REST API v2 を使用したイベントコンシューマーのデプロイメントとサービス CR の参照 リンクのコピーリンクがクリップボードにコピーされました!
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/subscriptions に POST 要求を送信することにより、コンシューマーアプリケーションを PTP イベントにサブスクライブします。
9043 は、PTP イベントプロデューサー Pod にデプロイされた cloud-event-proxy コンテナーのデフォルトポートです。必要に応じて、アプリケーションに異なるポートを設定できます。
8.3.7. PTP イベント REST API v2 コンシューマーアプリケーションがイベントを受信していることを確認 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーション Pod 内の cloud-event-consumer コンテナーが Precision Time Protocol (PTP) イベントを受信していることを確認します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - PTP Operator をインストールして設定している。
- クラウドイベントアプリケーション Pod と PTP イベントコンシューマーアプリケーションをデプロイしている。
手順
デプロイされたイベントコンシューマーアプリケーションのログを確認します。たとえば、以下のコマンドを実行します。
$ 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\"}]}}"オプション:
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 をインストールし、設定します。
手順
次のコマンドを実行して、ノードのデバッグ Pod を起動します。
$ oc debug node/<node_name>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オプション:
cloud-event-proxyコンテナーのログでも PTP イベントを見つけることができます。たとえば、以下のコマンドを実行します。$ oc logs -f linuxptp-daemon-cvgr6 -n openshift-ptp -c cloud-event-proxy-
OpenShift Container Platform Web コンソールで PTP イベントを表示するには、クエリーする PTP メトリクスの名前 (例:
openshift_ptp_offset_ns) をコピーします。 - OpenShift Container Platform Web コンソールで、Observe → Metrics をクリックします。
- PTP メトリクスを Expression フィールドに貼り付け、Run queries をクリックします。
8.3.9. PTP 高速イベントメトリクスのリファレンス リンクのコピーリンクがクリップボードにコピーされました!
次の表は、linuxptp-daemon サービスが実行されているクラスターノードから利用できる PTP 高速イベントメトリクスを説明します。
| メトリクス | 説明 | 例 |
|---|---|---|
|
|
インターフェイスの PTP クロッククラスを返します。PTP クロッククラスの可能な値は、6 ( |
|
|
|
インターフェイスの現在の PTP クロック状態を返します。PTP クロック状態の可能な値は、 |
|
|
| タイミングパケットを送信するプライマリークロックとタイミングパケットを受信するセカンダリークロックの間の遅延をナノ秒単位で返します。 |
|
|
|
異なる NIC に複数のタイムソースがある場合に、高可用性システムクロックの現在のステータスを返します。可能な値は 0 ( |
|
|
|
2 つの PTP クロック間の周波数調整をナノ秒単位で返します。たとえば、アップストリームクロックと NIC の間、システムクロックと NIC の間、または PTP ハードウェアクロック ( |
|
|
|
インターフェイスに設定された PTP クロックの役割を返します。可能な値は、0 ( |
|
|
|
2 つのクロックまたはインターフェイス間の最大オフセットをナノ秒単位で返します。たとえば、アップストリーム GNSS クロックと NIC ( |
|
|
| DPLL クロックまたは GNSS クロックソースと NIC ハードウェアクロック間のオフセットをナノ秒単位で返します。 |
|
|
|
|
|
|
| PTP プロセスが実行中かどうかを示すステータスコードを返します。 |
|
|
|
|
|
8.3.9.1. T-GM が有効な場合のみ PTP 高速イベントメトリクス リンクのコピーリンクがクリップボードにコピーされました!
次の表は、PTP グランドマスタークロック (T-GM) が有効な場合にのみ使用できる PTP 高速イベントメトリクスを示しています。
| メトリクス | 説明 | 例 |
|---|---|---|
|
|
NIC の Digital Phase-Locked Loop (DPLL) 周波数の現在のステータスを返します。可能な値は、-1 ( |
|
|
|
NMEA 接続の現在のステータスを返します。NMEA は、1PPS NIC 接続に使用されるプロトコルです。可能な値は 0 ( |
|
|
|
NIC の DPLL 位相のステータスを返します。可能な値は、-1 ( |
|
|
|
NIC 1PPS 接続の現在のステータスを返します。1PPS 接続は、接続された NIC 間のタイミングを同期するために使用します。可能な値は 0 ( |
|
|
|
Global Navigation Satellite System (GNSS) 接続の現在のステータスを返します。GNSS は、衛星ベースの測位、ナビゲーション、およびタイミングサービスを世界中に提供します。可能な値は、0 ( |
|
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 イベントにサブスクライブします。
api/ocloudNotifications/v2/subscriptions-
POST: 新しいサブスクリプションを作成します。 -
GET: サブスクリプションの一覧を取得します。 -
DELETE: すべてのサブスクリプションを削除します
-
api/ocloudNotifications/v2/subscriptions/{subscription_id}-
GET: 指定されたサブスクリプション ID の詳細を返します。 -
DELETE: 指定されたサブスクリプション ID に関連付けられたサブスクリプションを削除します
-
api/ocloudNotifications/v2/health-
GET:ocloudNotificationsAPI の正常性ステータスを返します
-
api/ocloudNotifications/v2/publishers-
GET: クラスターノードの PTP イベントパブリッシャーのリストを返します。
-
api/ocloudnotifications/v2/{resource_address}/CurrentState-
GET:{resouce_address}で指定されたイベントタイプの現在の状態を返します。
-
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イベント
| パラメーター | 型 |
|---|---|
| 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"
}
次のサブスクリプションステータスイベントが発生する可能性があります。
| ステータスコード | 説明 |
|---|---|
|
| サブスクリプションが作成されたことを示します。 |
|
| リクエストが不正または無効であったため、サーバーが要求を処理できなかったことを示します。 |
|
| サブスクリプションリソースが利用できないことを示します。 |
|
| サブスクリプションがすでに存在することを示します。 |
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 のサブスクリプションの詳細を返します。
| パラメーター | 型 |
|---|---|
|
| 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 のサブスクリプションを削除します。
| パラメーター | 型 |
|---|---|
|
| string |
| HTTP レスポンス | 説明 |
|---|---|
| 204 No Content | Success |
8.4.1.3. api/ocloudNotifications/v2/health リンクのコピーリンクがクリップボードにコピーされました!
HTTP メソッド
GET api/ocloudNotifications/v2/health/
説明
ocloudNotifications REST API の正常性ステータスを返します。
| 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"
}
]
| 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-state、clock-class、lock-state、gnss-sync-status、または sync-state イベントの現在の状態を返します。
-
os-clock-sync-state通知は、ホストオペレーティングシステムのクロック同期状態を示します。LOCKEDまたはFREERUN状態になります。 -
clock-class通知は、PTP クロッククラスの現在の状態を説明します。 -
lock-state通知は、PTP 機器のロック状態の現在のステータスを示します。LOCKED、HOLDOVER、またはFREERUN状態になります。 -
sync-state通知は、PTP クロックのlock-state状態とos-clock-sync-state状態のうち、最も同期されていない状態の現在のステータスを示します。 -
gnss-sync-status通知は、GNSS クロックの同期状態を説明します。
| パラメーター | 型 |
|---|---|
|
| 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"
}
]
}
}