設定外部 NTP 轉發

本頁說明如何為 Google Distributed Cloud (GDC) 無網路連線裝置設定外部 NTP 重新播放。

只有在裝置中斷連線後,您想將裝置與外部時間同步時,才需要執行這些步驟。

事前準備

如要將設備與外部 NTP 同步,請完成下列步驟:

  1. 開始之前,請確認只有一個 NTP 中繼。如要驗證,請在啟動程序電腦上執行下列指令:

    kubectl get ntprelay -A
    

    輸出內容如下列範例所示:

    NAMESPACE    NAME           AGE
    gpc-system   bi-ntp-relay   4d21h
    

設定 NTP 轉發

  1. 將啟動程式連線至設備裝置,並判斷連線介面的 IP 位址:

    ifconfig
    mgmt: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 198.18.0.30   netmask 255.255.255.224  broadcast 198.18.0.31
        inet6 fe80::20c:29ff:fea8:fc35  prefixlen 64  scopeid 0x20&lt;link&gt;
    ...
    
  2. 編輯 ntprelay CR,將啟動程式管理 IP 納入為上游 IP。

    kubectl edit ntprelay bi-ntp-relay -n gpc-system
    ntprelay.system.private.gdc.goog/bi-ntp-relay edited
    kubectl get ntprelay bi-ntp-relay -n gpc-system -oyaml
    

    輸出看起來會像下列範例。在本範例中,upstreamServers 的 IP 位址已變更:

    apiVersion: system.private.gdc.goog/v1alpha1
    kind: NTPRelay
    metadata:
      creationTimestamp: "2025-05-16T08:44:21Z"
      generation: 2
      name: bi-ntp-relay
      namespace: gpc-system
      resourceVersion: "10871409"
      uid: 6cde8e65-791c-4bc6-9a8b-d5c9bf103f8b
    spec:
      upstreamServers:
      - 192.0.2.030
    
  3. 確認 NTP 同步:

    kubectl get pods -l app.kubernetes.io/name=ntp -n ntp-system -o name | xargs -I {} kubectl exec {} -n ntp-system -- chronyc sources -v; echo
    

    輸出內容如下:

      .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
    / .- Source state '*' = current best, '+' = combined, '-' = not combined,
    | /             'x' = may be in error, '~' = too variable, '?' = unusable.
    ||                                                 .- xxxx [ yyyy ] +/- zzzz
    ||      Reachability register (octal) -.           |  xxxx = adjusted offset,
    ||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
    ||                                \     |          |  zzzz = estimated error.
    ||                                 |    |           \
    MS Name/IP address         Stratum Poll Reach LastRx Last sample
    ===============================================================================
    ^* 192.0.2.026                   1   6    17    43   +286ns[  +36us] +/- 1160us
    =? 192.0.2.029                 0   6     0     -     +0ns[   +0ns] +/-    0ns
    =? 192.0.2.051                 0   6     0     -     +0ns[   +0ns] +/-    0ns
    =? 192.0.2.059            0   6     0     -     +0ns[   +0ns] +/-    0ns
    
      .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
    / .- Source state '*' = current best, '+' = combined, '-' = not combined,
    | /             'x' = may be in error, '~' = too variable, '?' = unusable.
    ||                                                 .- xxxx [ yyyy ] +/- zzzz
    ||      Reachability register (octal) -.           |  xxxx = adjusted offset,
    ||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
    ||                                \     |          |  zzzz = estimated error.
    ||                                 |    |           \
    MS Name/IP address         Stratum Poll Reach LastRx Last sample
    ===============================================================================
    ^* 192.0.2.026                 1   6    37     2     +2ns[  +90us] +/-   84us
    =? 192.0.2.029                 2   6     1     8   +368us[ +449us] +/- 3761us
    =? 192.0.2.051                 0   6     1     -     +0ns[   +0ns] +/-    0ns
    =? 192.0.2.059                 2   6     1     8   +663us[ +744us] +/-   11ms
    
      .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
    / .- Source state '*' = current best, '+' = combined, '-' = not combined,
    | /             'x' = may be in error, '~' = too variable, '?' = unusable.
    ||                                                 .- xxxx [ yyyy ] +/- zzzz
    ||      Reachability register (octal) -.           |  xxxx = adjusted offset,
    ||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
    ||                                \     |          |  zzzz = estimated error.
    ||                                 |    |           \
    MS Name/IP address         Stratum Poll Reach LastRx Last sample
    ===============================================================================
    ^* 192.0.2.026                   1   6    37    29     -6ns[ -759us] +/-   92us
    =? 192.0.2.029                   2   6     1    36   +334us[ -346us] +/- 3775us
    =? 192.0.2.051                   2   6     1    35   -125us[ -813us] +/- 5839us
    =? 192.0.2.059                   0   6     1     -     +0ns[   +0ns] +/-    0ns
    
  4. 確認 NTP Pod 中的 chronyc 是否參照新加入的 IP。

    kubectl exec -it -n ntp-system ntp2-84ddf7cd99-96vqn -- sh
    

    輸出內容如下列範例所示:

    Defaulted container "ntp-image" out of: ntp-image, ntp-node-exporter
    # chronyc tracking
    Reference ID    : C612001E (198.18.0.30)
    Stratum         : 2
    Ref time (UTC)  : Wed May 21 07:28:38 2025
    System time     : 0.000000005 seconds slow of NTP time
    Last offset     : +0.000025645 seconds
    RMS offset      : 0.000082131 seconds
    Frequency       : 15.671 ppm slow
    Residual freq   : +0.024 ppm
    Skew            : 0.628 ppm
    Root delay      : 0.000164273 seconds
    Root dispersion : 0.000180630 seconds
    Update interval : 64.8 seconds
    Leap status     : Normal
    # exit