8.2.13. 時刻同期の継続性を確保するために、GNSS フェイルオーバーを NTP に設定する


全地球航法衛星システム (GNSS) から Network Time Protocol (NTP) への自動フェイルオーバーにより、プライマリー信号が失われた場合でも時刻同期の継続性が維持され、通信事業者の運用におけるシステム安定性が確保されます。

通信事業者は、時刻同期の継続性とシステムの安定性を確保するために、時刻源の冗長性を必要とする。

OpenShift Container Platform は、同期を維持するための自動フェイルオーバー機能を提供します。このシステムは、主要な時刻ソースとして GNSS(phc2sys 社提供) を利用しています。妨害電波やアンテナの故障など、主要な信号の損失から保護するために、システムは自動的に二次的な時刻ソースである chronyd によって提供される NTP に切り替わります。信号が回復すると、システムは自動的に phc2sys に切り替わり、同期を再開します。

ts2phc.holdover パラメーターを秒単位で設定することで、時刻同期の安定性を制御できます。この値は、GNSS レシーバーなどの主要な時刻 (ToD) ソースが失われた後、内部制御アルゴリズムが PHC の同期を継続できる最大時間を決定します。アルゴリズムは、安定状態 (SERVO_LOCKED_STABLE) を維持している場合にのみ実行を継続できます。プロセスが設定された保持期間を過ぎると、回復不能な一次信号損失が発生したことを示します。システムはその後、NTP などの二次的な情報源へのフェイルオーバーを可能にする。

8.2.13.1. GNSS フェイルオーバー機能を備えた PTP グランドマスター設定の作成

衛星信号が利用できない場合に、全地球航法衛星システム (GNSS) から Network Time Protocol (NTP) への自動フェイルオーバー機能を備えた、Precision Time Protocol (PTP) 通信グランドマスタークロックを設定します。

この手順では、Intel E810 Westport Channel NIC を PTP グランドマスタークロックとして使用し、GNSS から NTP へのフェイルオーバー機能を備えた T-GM(Telecom Grandmaster) クロックを設定します。

前提条件

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

手順

  1. 以下のコマンドを実行して、PTPOperator のインストールを確認してください。

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

    出力は、PTP Operator Pod と linuxptp-daemon Pod のリスト表示と類似しています。

    NAME                            READY   STATUS    RESTARTS   AGE   IP              NODE                       NOMINATED NODE   READINESS GATES
    linuxptp-daemon-4xk9m           2/2     Running   0          15m   192.168.1.101   worker-0.cluster.local     <none>           <none>
    linuxptp-daemon-7bv2n           2/2     Running   0          15m   192.168.1.102   worker-1.cluster.local     <none>           <none>
    linuxptp-daemon-9cp4r           2/2     Running   0          15m   192.168.1.103   worker-2.cluster.local     <none>           <none>
    linuxptp-daemon-kw8h5           2/2     Running   0          15m   192.168.1.104   worker-3.cluster.local     <none>           <none>
    linuxptp-daemon-m3j7t           2/2     Running   0          15m   192.168.1.105   worker-4.cluster.local     <none>           <none>
    ptp-operator-75c77dbf86-xm9kl   1/1     Running   0          20m   10.129.0.45     master-1.cluster.local     <none>           <none>
    • ptp-operator-*: PTPOperatorPod (クラスター内のインスタンスは 1 つ)
    • linuxptp-daemon-*: linuxptp デーモン Pod。PtpConfig プロファイルに一致する各ノード上で、デーモン Pod が実行されます。各デーモン Pod の READY 列に 2/2 と 表示され、両方のコンテナー (linuxptp-daemon-containerkube-rbac-proxy) が実行されていることを示します。

      注記

      linuxptp-daemon Pod の数は、DaemonSet のデプロイメントを制御する PtpOperatorConfig で定義されたノードラベルによって決定されます。ステップ 4 で示した PtpConfig プロファイルのマッチングは、実行中のデーモンに適用される特定の PTP 設定を決定するだけです。この例では、オペレーターの設定は 5 つのワーカーノードすべてを対象としています。シングルノードの OpenShift クラスターの場合、設定はワーカーとして機能するコントロールプレーンノードのみを対象としているため、linuxptp-daemon Pod は 1 つしか表示されません。

  2. 以下のコマンドを実行して、どのネットワークインターフェイスがハードウェアタイムスタンプをサポートしているかを確認してください。

    $ oc get NodePtpDevice -n openshift-ptp -o yaml

    出力は以下のようになり、PTP 対応ネットワークインターフェイスを持つノードの NodePtpDevice リソースを示します。

    apiVersion: v1
    items:
    - apiVersion: ptp.openshift.io/v1
      kind: NodePtpDevice
      metadata:
        name: worker-0.cluster.local
        namespace: openshift-ptp
      spec: {}
      status:
        devices:
        - name: ens7f0
          hwConfig:
            phcIndex: 0
        - name: ens7f1
          hwConfig:
            phcIndex: 1
    - apiVersion: ptp.openshift.io/v1
      kind: NodePtpDevice
      metadata:
        name: worker-1.cluster.local
        namespace: openshift-ptp
      spec: {}
      status:
        devices:
        - name: ens7f0
          hwConfig:
            phcIndex: 0
        - name: ens7f1
          hwConfig:
            phcIndex: 1
    kind: List
    metadata:
      resourceVersion: ""

    この例では出力されています。

    • ens7f0ens7f1 は PTP 対応インターフェイス (Intel E810 NIC ポート) です。
    • phcIndex は PTP ハードウェアクロック番号を示します (/dev/ptp0/dev/ptp1 などにマッピングされます)。

      注記

      出力には、PTP 対応インターフェイスを持つノードごとに 1 つの NodePtpDevice リソースが表示されます。この例では、5 つのワーカーノードに Intel E810 NIC が搭載されています。シングルノードの OpenShift クラスターの場合、NodePtpDevice リソースは 1 つしか表示されません。

  3. PTP プロファイルは、マッチングにノードラベルを使用します。マシン設定プール (MCP) を確認し、以下のコマンドを実行してノードラベルを見つけてください。

    $ oc get mcp

    出力は以下の例のようになります。

    NAME     CONFIG                   UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE
    master   rendered-master-a1b1**   True      False      False      3              3                   3                   0                    45d
    worker   rendered-worker-f6e5**   True      False      False      5              5                   5                   0                    45d
    注記

    CONFIG 列には、レンダリングされた MachineConfig の切り捨てられたハッシュ値が表示されます。実際の出力では、これは rendered-master-a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 のような 64 文字のハッシュになります。

    • この例では、<MCP-name> はワーカーノードの場合は worker、コントロールプレーンノードの場合は master となります。ほとんどの T-GM デプロイメントではワーカーノードを使用するため、<MCP-name> として worker を 使用します。
    • シングルノードの OpenShift クラスターの場合、<MCP-name>マスター です (ワーカー MCP には MACHINECOUNT が 0 と表示されます)。
  4. T-GM クロックを GNSS から NTP へのフェイルオーバーで設定する PtpConfig カスタムリソース (CR) を作成します。以下の YAML 設定を ptp-config-gnss-ntp-failover.yaml という名前のファイルに保存し、<MCP-name> を前の手順で取得したマシン設定プールの名前に置き換えてください。

    # The grandmaster profile is provided for testing only
    # It is not installed on production clusters
    apiVersion: ptp.openshift.io/v1
    kind: PtpConfig
    metadata:
      name: grandmaster
      namespace: openshift-ptp
      annotations:
        ran.openshift.io/ztp-deploy-wave: "10"
    spec:
      profile:
      - name: "grandmaster"
        ptp4lOpts: "-2 --summary_interval -4"
        phc2sysOpts: -r -u 0 -m -N 8 -R 16 -s ens7f0 -n 24
        ptpSchedulingPolicy: SCHED_FIFO
        ptpSchedulingPriority: 10
        ptpSettings:
          logReduce: "true"
    
        # --- FAILOVER CONFIGURATION ---
        # Holdover time: 14400 seconds (4 hours) before switching to NTP
        ts2phcOpts: "--ts2phc.holdover 14400"
    
        # Configure Chronyd (Secondary Time Source)
        chronydOpts: "-d"
        chronydConf: |
          server time.nist.gov iburst
          makestep 1.0 -1
          pidfile /var/run/chronyd.pid
    
        plugins:
          # E810 Hardware-Specific Configuration
          e810:
            enableDefaultConfig: false
            settings:
              LocalHoldoverTimeout: 14400
              LocalMaxHoldoverOffSet: 1500
              MaxInSpecOffset: 1500
            pins:
              # Syntax guide:
              # - The 1st number in each pair must be one of:
              #    0 - Disabled
              #    1 - RX
              #    2 - TX
              # - The 2nd number in each pair must match the channel number
              ens7f0:
                SMA1: 0 1
                SMA2: 0 2
                U.FL1: 0 1
                U.FL2: 0 2
            ublxCmds:
              - args: #ubxtool -P 29.20 -z CFG-HW-ANT_CFG_VOLTCTRL,1
                  - "-P"
                  - "29.20"
                  - "-z"
                  - "CFG-HW-ANT_CFG_VOLTCTRL,1"
                reportOutput: false
              - args: #ubxtool -P 29.20 -e GPS
                  - "-P"
                  - "29.20"
                  - "-e"
                  - "GPS"
                reportOutput: false
              - args: #ubxtool -P 29.20 -d Galileo
                  - "-P"
                  - "29.20"
                  - "-d"
                  - "Galileo"
                reportOutput: false
              - args: #ubxtool -P 29.20 -d GLONASS
                  - "-P"
                  - "29.20"
                  - "-d"
                  - "GLONASS"
                reportOutput: false
              - args: #ubxtool -P 29.20 -d BeiDou
                  - "-P"
                  - "29.20"
                  - "-d"
                  - "BeiDou"
                reportOutput: false
              - args: #ubxtool -P 29.20 -d SBAS
                  - "-P"
                  - "29.20"
                  - "-d"
                  - "SBAS"
                reportOutput: false
              - args: #ubxtool -P 29.20 -t -w 5 -v 1 -e SURVEYIN,600,50000
                  - "-P"
                  - "29.20"
                  - "-t"
                  - "-w"
                  - "5"
                  - "-v"
                  - "1"
                  - "-e"
                  - "SURVEYIN,600,50000"
                reportOutput: true
              - args: #ubxtool -P 29.20 -p MON-HW
                  - "-P"
                  - "29.20"
                  - "-p"
                  - "MON-HW"
                reportOutput: true
              - args: #ubxtool -P 29.20 -p CFG-MSG,1,38,248
                  - "-P"
                  - "29.20"
                  - "-p"
                  - "CFG-MSG,1,38,248"
                reportOutput: true
    
          # NTP Failover Plugin
          ntpfailover:
            gnssFailover: true
    
        # --- GNSS (ts2phc) CONFIGURATION (Primary Source) ---
        ts2phcConf: |
          [nmea]
          ts2phc.master 1
          [global]
          use_syslog  0
          verbose 1
          logging_level 7
          ts2phc.pulsewidth 100000000
          ts2phc.nmea_serialport /dev/ttyGNSS_1700_0
          leapfile  /usr/share/zoneinfo/leap-seconds.list
          [ens7f0]
          ts2phc.extts_polarity rising
          ts2phc.extts_correction 0
    
        # --- PTP4L CONFIGURATION (Grandmaster Role) ---
        ptp4lConf: |
          [ens7f0]
          masterOnly 1
          [ens7f1]
          masterOnly 1
          [global]
          #
          # Default Data Set
          #
          twoStepFlag 1
          priority1 128
          priority2 128
          domainNumber 24
          #utc_offset 37
          clockClass 6
          clockAccuracy 0x27
          offsetScaledLogVariance 0xFFFF
          free_running 0
          freq_est_interval 1
          dscp_event 0
          dscp_general 0
          dataset_comparison G.8275.x
          G.8275.defaultDS.localPriority 128
          #
          # Port Data Set
          #
          logAnnounceInterval -3
          logSyncInterval -4
          logMinDelayReqInterval -4
          logMinPdelayReqInterval 0
          announceReceiptTimeout 3
          syncReceiptTimeout 0
          delayAsymmetry 0
          fault_reset_interval -4
          neighborPropDelayThresh 20000000
          masterOnly 0
          G.8275.portDS.localPriority 128
          #
          # Run time options
          #
          assume_two_step 0
          logging_level 6
          path_trace_enabled 0
          follow_up_info 0
          hybrid_e2e 0
          inhibit_multicast_service 0
          net_sync_monitor 0
          tc_spanning_tree 0
          tx_timestamp_timeout 50
          unicast_listen 0
          unicast_master_table 0
          unicast_req_duration 3600
          use_syslog 1
          verbose 0
          summary_interval -4
          kernel_leap 1
          check_fup_sync 0
          clock_class_threshold 7
          #
          # Servo Options
          #
          pi_proportional_const 0.0
          pi_integral_const 0.0
          pi_proportional_scale 0.0
          pi_proportional_exponent -0.3
          pi_proportional_norm_max 0.7
          pi_integral_scale 0.0
          pi_integral_exponent 0.4
          pi_integral_norm_max 0.3
          step_threshold 2.0
          first_step_threshold 0.00002
          clock_servo pi
          sanity_freq_limit  200000000
          ntpshm_segment 0
          #
          # Transport options
          #
          transportSpecific 0x0
          ptp_dst_mac 01:1B:19:00:00:00
          p2p_dst_mac 01:80:C2:00:00:0E
          udp_ttl 1
          udp6_scope 0x0E
          uds_address /var/run/ptp4l
          #
          # Default interface options
          #
          clock_type BC
          network_transport L2
          delay_mechanism E2E
          time_stamping hardware
          tsproc_mode filter
          delay_filter moving_median
          delay_filter_length 10
          egressLatency 0
          ingressLatency 0
          boundary_clock_jbod 0
          #
          # Clock description
          #
          productDescription ;;
          revisionData ;;
          manufacturerIdentity 00:00:00
          userDescription ;
          timeSource 0x20
        ptpClockThreshold:
          holdOverTimeout: 5
          maxOffsetThreshold: 100
          minOffsetThreshold: -100
      recommend:
      - profile: "grandmaster"
        priority: 4
        match:
        - nodeLabel: node-role.kubernetes.io/<MCP-name>
    重要

    例として挙げたインターフェイス名 (ens7f0ens7f1) を、手順 2 で見つけた実際の E810 NIC インターフェイス名に置き換えてください。一般的な E810 インターフェイスの命名パターンには、ens7f0ens8f0eth0enp2s0f0 などがあります。正確な名称は、システムファームウェアの設定と Linux ネットワークデバイスの命名規則によって異なります。また、/dev/ttyGNSS_1700_0 を実際の GNSS シリアルポートデバイスのパスに置き換えてください。シングルノードの OpenShift クラスターの場合は、nodeLabel の一致条件で <MCP-name> をmaster に置き換えてください。ワーカーノードを T-GM として使用するマルチノードクラスターの場合は、worker を使用します。

    設定には以下のコンポーネントが含まれます。

    • PTP4L のオプション:

      • -2: PTP バージョン 2 を使用する
      • --summary_interval -4: 2^(-4) = 0.0625 秒ごとにログサマリーを出力します
    • PHC2SYS のオプション:

      • -r: PTP ハードウェアクロックからシステムクロックを同期する
      • -u 0: 更新レート乗数
      • -m: メッセージを標準出力に表示する
      • -N 8: ptp4l のドメイン番号
      • -R 16: 更新レート
      • -s ens7f0: ソースインターフェイス (E810 インターフェイス名に置き換えてください)
      • -n 24: ドメイン番号
    • フェイルオーバー設定:

      • ts2phcOpts --ts2phc.holdover 14400: NTP に切り替える前に 4 時間ホールドオーバーします
      • chronydConf: フェイルオーバー用の NTP サーバー設定 。time.nist.gov を希望する NTP サーバーに置き換えてください。
      • ntpfailover プラグイン: gnssFailover: true で GNSS から NTP への自動切り替えを有効にします
    • E810 プラグインの設定:

      • LocalHoldoverTimeout: 14400: E810 ハードウェアホールドオーバータイムアウト (4 時間)
      • ピン:E810 の物理ピン (U.FL2、SMA1、SMA2、U.FL1) における 1PPS 入力の設定
      • ublxCmds:u-blox GNSS レシーバーを設定するためのコマンド (GPS の有効化、他の衛星システムの無効化、測量モードの設定)
    • GNSS (ts2phc) 設定:

      • ts2phc.nmea_serialport/dev/ttyGNSS_1700_0: GNSS シリアルポートデバイスパス (実際の GNSS デバイスに置き換えてください)
      • ts2phc.extts_polarity rising: 立ち上がりエッジで 1PPS 信号
      • ts2phc.pulsewidth 100000000: 1PPS パルス幅 (ナノ秒)
    • PTP4L の設定:

      • masterOnly 1: インターフェイスは PTP マスターとしてのみ機能します
      • clockClass 6:GPS 同期品質レベル
      • ドメイン番号 24:PTP ドメイン
      • clock_type BC: 境界クロックモード
      • time_stamping hardware: E810 NIC のハードウェアタイムスタンプを使用する
  5. 以下のコマンドを実行して、PtpConfig CR を適用します。

    $ oc apply -f ptp-config-gnss-ntp-failover.yaml

    出力は以下の例のようになります。

    ptpconfig.ptp.openshift.io/grandmaster created

検証

  1. PTP デーモンは 30 秒ごとにプロファイルの更新を確認します。約 30 秒待ってから、以下のコマンドを実行して確認してください。

    $ oc get ptpconfig -n openshift-ptp

    出力は以下の例のようになります。

    NAME           AGE
    grandmaster    2m
  2. NodePtpDevice でプロファイルが適用されているかどうかを確認するには、次のコマンドを実行します。<node_name> をノードのホスト名に置き換えてください。

    $ oc describe nodeptpdevice <node_name> -n openshift-ptp

    たとえば、ワーカーノードを持つマルチノードクラスターの場合: worker-0.cluster.local

    シングルノードの OpenShift クラスターの場合は、コントロールプレーンノード名を使用します。コントロールプレーンノード名は、以下のコマンドを実行することで確認できます。

    $ oc get nodes
  3. デーモンのログを監視して、プロファイルがロードされているかどうかを確認してください。

    $ oc get pods -n openshift-ptp | grep linuxptp-daemon

    次に、ログを確認し、<linuxptp-daemon-pod> を 前のコマンドで取得した実際の Pod 名に置き換えてください。

    $ oc logs -n openshift-ptp <linuxptp-daemon-pod> -c linuxptp-daemon-container --tail=100

    ログにおける成功指標は以下のとおりです。

    • プロファイルの読み込み - プロファイルを読み込んでいます
    • applyNodePTPProfiles 内 - プロファイルが適用されています
    • ノードエラーに対して PTP プロファイルが存在しません
  4. 以下のコマンドを実行して、chronyd の 状態を確認し、NTP がセカンダリー時刻ソースとして実行されていることを確認してください。

    $ oc logs -n openshift-ptp <linuxptp-daemon-pod> -c linuxptp-daemon-container | grep chronyd

    出力は以下の例のようになります。

    chronyd version 4.5 starting
    Added source ID#0000000001 (time.nist.gov)
  5. 以下のコマンドを実行して、GNSS/gpsd を確認してください。

    $ oc logs -n openshift-ptp <linuxptp-daemon-pod> -c linuxptp-daemon-container | grep gpsd

    GNSS が正常に機能している場合、出力には以下のように表示されます。

    • gpsd が正常に起動しました
    • そのようなファイルまたはディレクトリーは存在しません というエラーは存在しません。
  6. 以下のコマンドを実行して、ts2phc (GNSS 同期) の状態を確認してください。

    $ oc logs -n openshift-ptp <linuxptp-daemon-pod> -c linuxptp-daemon-container | grep ts2phc
  7. 以下のコマンドを実行して、phc2sys (システムクロック同期) の状態を確認してください。

    $ oc logs -n openshift-ptp <linuxptp-daemon-pod> -c linuxptp-daemon-container | grep phc2sys

    出力には、phc2sys の同期ステータスメッセージが表示されます。

    phc2sys[xxx]: CLOCK_REALTIME phc offset -17 s2 freq -13865 delay 2305
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat
トップに戻る