更新專案以使用可用區 DNS


本文說明如何將現有專案從全域 DNS 遷移至區域 DNS。可用區 DNS 會在可用區內隔離中斷情形,藉此提高可靠性,並防止實例建立和自動修復等重要服務中斷。

事前準備

  • 如果尚未設定,請先設定驗證機制。驗證是指驗證身分,以便存取 Google Cloud 服務和 API 的程序。如要在本機開發環境中執行程式碼或範例,您可以選取下列任一選項,向 Compute Engine 進行驗證:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    2. Set a default region and zone.

    REST

    To use the REST API samples on this page in a local development environment, you use the credentials you provide to the gcloud CLI.

      After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    For more information, see Authenticate for using REST in the Google Cloud authentication documentation.

必要的角色

如要取得遷移專案至使用可用區 DNS 所需的權限,請要求管理員授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這些預先定義的角色包含遷移專案以使用可用區 DNS 所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:

所需權限

如要將專案遷移至使用區域 DNS,您必須具備下列權限:

  • 檢查全域 DNS 名稱和 VM 中繼資料: compute.projects.get
  • 設定 VM 的中繼資料: compute.instances.setMetadata
  • 設定全專案中繼資料: compute.projects.setCommonInstanceMetadata
  • 如果您的 VM 使用服務帳戶: iam.serviceAccounts.actAs

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

將專案遷移至可用區 DNS

如要將專案遷移至使用可用區 DNS,請完成下列工作:

  1. 檢查專案是否預設使用全域 DNS
  2. 使用查詢分析功能,判斷專案是否已準備好進行遷移
  3. 遷移與區域性 DNS 相容的專案
  4. 修正不相容的查詢
  5. 監控全球 DNS 記錄,確認遷移完備性
  6. 將剩餘專案遷移至區域 DNS
  7. 檢查區域 DNS 異動是否影響專案

檢查專案是否預設使用全域 DNS

檢查專案,瞭解是否需要從使用全域 DNS 遷移至區域 DNS。您只需要遷移已設定為使用全域 DNS 做為專案內建立的任何內部 DNS 名稱的預設值的專案。

控制台

  1. 在 Google Cloud 控制台中,前往 Compute Engine 的「Metadata」頁面。

    前往「中繼資料」

  2. 在「中繼資料」分頁中,查看 vmdnssetting 設定 (如有)。指派的值會指出專案是否預設使用全域 DNS。

    • GlobalDefault:專案已啟用全球 DNS。
    • ZonalOnly:專案已啟用區域 DNS。這項專案不需要遷移。

    如果沒有列出 vmdnssetting 中繼資料設定,請確認貴機構是否預設使用全球 DNS

gcloud

執行下列 gcloud CLI 指令,即可查看 vmDnsSetting 的值。

gcloud compute project-info describe --project=PROJECT_ID --flatten="vmDnsSetting"

PROJECT_ID 替換為專案名稱。

傳回的值會指出專案是否預設使用全域 DNS。

  • GLOBAL_DEFAULT:專案已啟用全球 DNS。
  • ZONAL_ONLY:專案已啟用區域 DNS。這項專案不需要遷移。

REST

使用 projects.get 方法檢查 vmDnsSetting 的值。本例使用 fields 查詢參數,只納入您要查看的欄位。

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID?fields=id,name,vmDnsSetting

PROJECT_ID 替換為專案 ID。

vmDnsSetting 的值表示專案是否預設使用全域 DNS。

  • GLOBAL_DEFAULT:專案已啟用全球 DNS。
  • ZONAL_ONLY:專案已啟用區域 DNS。這個專案不需要遷移。

使用查詢分析來判斷專案的遷移完備性

如要評估專案是否可在不變更程式碼或改變全域 DNS 使用方式的情況下遷移至可用區 DNS, Google Cloud 會分析您的 DNS 查詢記錄。這項分析提供下列指標,指出專案與區域 DNS 的相容性:

  • zonal_dns_ready (相容查詢):這項指標代表 100 天期間內,可使用區域性 DNS 成功解析的查詢總數。

  • zonal_dns_risky (不相容的查詢):這個指標代表無法使用區域性 DNS 解析的查詢總數。這些查詢通常涉及跨區域通訊,或其他區域解析失敗的情況。重要的是,如果這個指標的值不為零,表示您的專案尚未準備好進行遷移。您必須先解決這些不相容的查詢,才能改用區域性 DNS。

如要查看這些指標,請使用 Google Cloud 控制台的 Metrics Explorer

  1. 前往 Google Cloud 控制台的「Metrics Explorer」(Metrics Explorer) 頁面

    前往 Metrics Explorer

    如果您是使用搜尋列尋找這個頁面,請選取子標題為「Monitoring」的結果

  2. 在包含「選取指標」欄位的工具列右側,按一下「程式碼編輯器」、「MQL」或「PromQL」

  3. 如果查詢輸入欄位的標題不是「MQL Query」,請在查詢輸入欄位的右下角,選取「Language」的「MQL」

  4. 在查詢輸入欄位中,輸入下列文字:

    fetch compute.googleapis.com/Location
    | metric 'compute.googleapis.com/global_dns/request_count'
    | every 1d
    | within 7d
    
  5. 按一下 [Run query] (執行查詢) 按鈕。

    Google Cloud 控制台會顯示兩個指標 (zonal_dns_readyzonal_dns_risky) 的圖表,以及每個指標在指定時間範圍內的查詢數量。

    全域 DNS 用量指標圖表的螢幕截圖。

  6. 檢查 zonal_dns_risky 指標的值。

    • 如果值為 0,表示專案已準備好遷移至區域 DNS。您可以遷移專案,如遷移已準備好遷移至區域性 DNS 的專案所述。
    • 如果值為非零數字,例如上一個螢幕截圖中的 0.02k,則在遷移至區域 DNS 後,部分查詢可能無法運作。專案尚未準備好遷移。 請繼續按照「修正不相容的查詢」一節中的步驟操作。

遷移與區域 DNS 相容的專案

請使用下列任一選項,遷移已準備好改用區域性 DNS 的專案:

  • 在 Google Cloud 控制台中按一下「Use Zonal DNS」按鈕。

    1. 查看專案的「VM 執行個體」頁面時,如果專案已準備好遷移 (與區域性 DNS 查詢相容),橫幅會提供「使用區域性 DNS」的建議。這項最佳化建議是根據專案中的內部 DNS 用量計算得出,但僅限於過去 30 天。

      主控台中「準備好遷移至區域 DNS」橫幅的螢幕截圖。

      如果您點選「Use Zonal DNS」按鈕,專案中繼資料就會更新為使用區域性 DNS。

    2. 選用步驟:查看及查詢 VM 中繼資料,確認中繼資料變更。

  • 手動變更專案中繼資料,使用可用區 DNS。

    1. 為專案設定 vmDnsSetting 中繼資料項目,即可為執行個體啟用區域 DNS。設定此中繼資料項目後,使用搜尋路徑時,只有區域 DNS 名稱 (VM_NAME.ZONE.c.PROJECT_ID.internal) 才能存取運算執行個體。執行個體仍保留區域和全域搜尋路徑,但其全域 DNS 名稱 (不包含內部 DNS 名稱中的 ZONE) 則停止運作。啟用這項設定後,只有位於相同區域和專案的執行個體才能使用全域名稱互相存取。

      主控台

      1. 如要在專案層級更新設定,請在 Google Cloud 控制台中前往 Compute Engine 的「Metadata」頁面。

        前往「自訂中繼資料」頁面

      2. 按一下「Edit」(編輯)

      3. 如果有值為 VmDnsSetting 的鍵,請將其值變更為 ZonalOnly

      4. 如果沒有值為 VmDnsSetting 的鍵,請按一下 「Add item」

        • 在「Key」欄位中輸入 VmDnsSetting
        • 在「Value」欄位中輸入 ZonalOnly
      5. 如要完成自訂中繼資料項目的修改,請按一下「儲存」

      gcloud

      1. 如要更新目前專案的中繼資料設定,請使用 project-info add-metadata 指令

        gcloud compute project-info add-metadata \
            --metadata vmDnsSetting=ZonalOnly
        
      2. 選用:如要驗證專案的中繼資料設定,請使用下列指令:

        gcloud compute project-info describe --project=PROJECT_ID --flatten="vmDnsSetting"
        

        PROJECT_ID 替換為要查詢的專案名稱。

      REST

      如要更新專案層級的中繼資料設定,請使用 projects.setCommonInstanceMetadata 方法建構 POST 要求。

      1. 選用:如要執行樂觀式鎖定,您可以選擇提供指紋

        指紋是由 Compute Engine 產生的隨機字元字串。指紋會在每次要求後變更;如果您提供的指紋不符,系統便會拒絕您的要求。

        如果您未提供指紋,系統就不會執行一致性檢查,且 projects.setCommonInstanceMetadata 要求會成功。如果您使用 instances.setMetadata 方法,則一律需要指紋驗證。

        如要取得專案的目前指紋,請呼叫 project.get 方法

        GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID
        

        輸出結果會與下列內容相似:

        {
         "name": "myproject",
         "commonInstanceMetadata": {
           "kind": "compute#metadata",
           "fingerprint": "FikclA7UBC0=",
           ...
         }
        }
        
      2. 建構 POST 要求,以便向 projects.setCommonInstanceMetadata 方法設定中繼資料鍵/值組合:

        POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/setCommonInstanceMetadata
        
        {
        "fingerprint": "FikclA7UBC0=",
        "items": [
          {
          "key": "vmDnsSetting",
          "value": "ZonalOnly"
          }
        ]
        }
        

        請將 PROJECT_ID 替換為您的專案 ID。

    2. 為專案設定 vmDnsSetting 中繼資料項目後,請更新該專案中每個執行個體的 DHCP 租約。您可以透過重新啟動執行個體、等待租約到期或執行下列其中一個指令來更新租約:

      Linux 執行個體

      sudo dhclient -v -r
      

      Windows 執行個體

      ipconfig /renew
      
    3. 確認專案使用可用區 DNS

修正不相容的查詢

表示在特定時間內 (例如過去 30 天),至少有一次不相容的 DNS 查詢。不相容的查詢可能具有下列屬性:

  • 呼叫其他專案中的運算執行個體
  • 呼叫位於其他區域的運算執行個體

如果專案含有不相容的查詢,Google Cloud 控制台的「VM instances」頁面會顯示下列橫幅:

橫幅指出專案尚無法遷移至區域性 DNS。

如要修正所有不相容的查詢,建議您在查詢中使用來源執行個體的可用區完整網域名稱 (FQDN)。這種做法可確保在將專案遷移至區域性 DNS 後,查詢解析作業不會中斷。

如要解決不相容的查詢,請執行下列操作:

  1. 使用 Logs Explorer 存取及查詢專案中運算執行個體的全域 DNS 用量。

    前往「Logs Explorer」

  2. 選取專案。

  3. 套用資源和記錄名稱篩選器:

    1. 按一下「Resource」(資源)
    2. 在「Select resource」對話方塊中,選取「VM Instance」,然後按一下「Apply」
    3. 按一下「記錄名稱」
    4. 在「Select log names」對話方塊中,選取「gdnsusage」,然後按一下「Apply」

    或者,您也可以在查詢欄位中輸入以下內容:

       resource.type="gce_instance"
       log_name="projects/PROJECT_ID/logs/compute.googleapis.com%2Fgdnsusage"
      
  4. 在「查詢結果」窗格中,每個查詢都有一個 jsonPayload 欄位。每個 jsonPayload 欄位都包含下列資訊:

    • 來源 VM 名稱、專案 ID 和區域名稱。
    • 目的地 VM 名稱、專案 ID 和區域名稱。
    • 偵錯訊息,提供如何更新無法使用區域 DNS 名稱解析的全域 DNS 查詢的資訊。這些查詢會視為阻礙遷移作業的查詢,因此您應對其進行除錯並修正。

      "To use Zonal DNS, update the Global DNS query sent from the source VM
      VM_NAME.c.PROJECT_ID.internal to the following zonal
      FQDN: VM_NAME.ZONE.c.PROJECT_ID.internal"
      
    • 查詢計數,顯示來源 VM 在當天傳送至目的地 VM 的遷移封鎖查詢數量。

    下圖顯示 Logs Explorer 控制台頁面中的 jsonPayload 欄位資訊。

    gdnsusage 記錄查詢結果中的 jsonPayload 螢幕截圖。

  5. 請使用先前步驟取得的 jsonPayload 中的資訊,判斷要使用哪個 FQDN 手動更新全域 DNS 查詢,以便使用可用區 DNS,並讓專案做好遷移的準備。以下是更新 FQDN 和解決相容性問題最常見的用途:

    • 來自中繼資料伺服器的內部 DNS 名稱:無需採取任何行動,因為在遷移至區域 DNS 後,系統會立即將傳回的 DNS 名稱變更為區域 FQDN。如果 DNS 名稱已快取,您只需再進行一次呼叫即可更新快取值。
    • 用於存取其他地區 VM 的內部 DNS 名稱:如果應用程式使用不同地區 VM 的內部 DNS 名稱,您可以修改 DHCP 政策或設定檔,納入其他地區的區域。
    • 硬式編碼全域 FQDN:如果應用程式使用硬式編碼的 VM 全域 FQDN 名稱,您可以更新應用程式中的呼叫,改為使用內部 DNS 名稱或區域 FQDN。您可以透過程式碼變更或 Terraform 中的設定變更來進行這項變更。
    • 使用共用虛擬私人雲端網路的服務專案中的 VM:如要解析使用共用虛擬私人雲端網路的服務專案中 VM 的 DNS 名稱,您必須使用 VM 的區域 FQDN。
  6. 更新全域 DNS 查詢以使用區域性 DNS 後,請執行下列操作:

    1. 使用 Logs Explorer 頁面再次查詢全域 DNS 用量。修正所有阻斷全域 DNS 查詢後,查詢結果中就不會顯示任何偵錯記錄。

    2. 重新檢查監控指標,看看是否已移除所有不相容的 DNS 查詢。

在 Logs Explorer 中查看全域 DNS 記錄

Logs Explorer 主要會針對查詢與區域性 DNS 不相容的專案,顯示全域 DNS 記錄。這些記錄可協助您在遷移前,找出並分析有問題的查詢。

您也可以使用 Logs Explorer 查看這些不相容的查詢,執行以下操作:

  • 建立資訊主頁:以視覺化方式呈現不相容的全域 DNS 查詢模式,深入瞭解應用程式的通訊行為。
  • 匯總記錄:分析整個機構的 DNS 記錄,找出更廣泛的趨勢和潛在的改善項目。

檢查區域 DNS 異動是否影響專案

遷移至區域 DNS 後,請務必確認應用程式和服務仍能正常運作。由於區域 DNS 會變更內部 DNS 名稱的解析方式,因此如果某些應用程式依賴全域 DNS 名稱,可能會發生問題。

下節將說明如何檢查潛在影響,以及如何解決這些問題:

  1. 指令列執行個體通訊

    工作:請嘗試使用 gcloud CLI 對另一個執行個體的一個執行個體執行 ping 作業。

    gcloud compute ssh VM-A --command "ping VM-B"
    

    可能的錯誤:「Could not resolve host」:這表示 VM-A 找不到 VM-B 的 IP 位址。

    解決方法:將您用於 VM-B 的主機名稱更新為完整網域名稱 (FQDN),其中包含區域名稱:INSTANCE_NAME.ZONE.c.PROJECT_ID.internal

  2. Compute Engine 服務內的執行個體通訊

    工作:如果您為依賴內部 DNS 名稱的代管執行個體群組 (MIG) 使用健康狀態檢查,請檢查健康狀態檢查是否通過。

    可能的錯誤:「健康檢查失敗」:這表示因 DNS 解析問題,健康檢查無法達到目標。

    解決方法:請確認健康狀態檢查使用的是目標執行個體的 FQDN,包括區域名稱。

  3. 應用程式專屬用途

    許多應用程式會依賴內部 DNS 執行下列工作:

    • 連線至資料庫 (例如 Cloud SQL)
    • 與訊息佇列互動 (例如 Pub/Sub)

    • 潛在錯誤:這些錯誤可能因應用程式而異,但可能包括:

      • 「無法連線至 SERVICE_NAME
      • 「連線逾時」
      • 「No such host is known」
    • 解決方法:請檢查應用程式的設定,確認應用程式在參照服務時使用 FQDN (包括區域名稱)。

改回使用全域 DNS

您可以將預設內部 DNS 類型改回全域 DNS,藉此復原遷移至區域性 DNS 的作業。您可以在機構、專案、執行個體或容器層級執行這項操作。

將專案還原為使用全域 DNS

如要讓專案恢復使用全域 DNS,請完成下列步驟。

  1. 將以下內容加入專案的中繼資料:vmDnsSetting=GlobalDefault

    如要瞭解如何設定專案中繼資料值,請參閱「設定及移除自訂中繼資料」。

  2. 確認專案中沒有任何執行個體的 vmDnsSetting 中繼資料值設為 ZonalOnly

    gcloud compute instances describe INSTANCE_NAME --flatten="metadata[]"
    

    INSTANCE_NAME 替換為要檢查的執行個體名稱。

  3. 更新每個執行個體的 DHCP 租約。您可以透過重新啟動執行個體、等待租約到期,或在訪客作業系統中執行下列其中一個指令來更新租約:

    • Linux 執行個體:sudo dhclient -v -r
    • Windows Server 執行個體:ipconfig /renew

將執行個體還原為使用全域 DNS

如要將特定執行個體還原為使用全球 DNS,請完成下列步驟。

  1. 更新執行個體的中繼資料,加入 vmDnsSetting=GlobalDefault

    如要瞭解如何設定運算執行個體中繼資料值,請參閱「設定及移除自訂中繼資料」。

  2. 如要強制更改 DNS 設定,請使用下列任一指令重新啟動執行個體的網路:

    • 針對 Container-Optimized OS 或 Ubuntu:

      sudo systemctl restart systemd-networkd
      
    • 適用於 CentOS、RedHat EL、Fedora CoreOS 或 Rocky Linux:

      sudo systemctl restart network
      

      sudo systemctl restart NetworkManager.service
      
    • 適用於 Debian:

      sudo systemctl restart networking
      
    • 針對含有 nmcli 的 Linux 系統:

      sudo nmcli networking off
      sudo nmcli networking on
      
    • Windows 系統:

      ipconfig /renew
      

將容器改回使用全球 DNS

如果您在 Google Kubernetes Engine 或 App Engine 彈性環境的容器中執行應用程式或工作負載,則在重新啟動容器之前,系統不會自動更新容器設定中的 DNS 設定。如要在這些容器應用程式上停用區域 DNS,請完成下列步驟。

  1. 在擁有容器和 VM 的專案中,將專案中繼資料設定 vmDnsSetting 設為 GlobalDefault

  2. 重新啟動容器,讓 DNS 設定還原成原始狀態。

排解全域 DNS 到可用區 DNS 遷移程序的問題

如果遷移程序發生問題,請參閱疑難排解指南

後續步驟