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