更新專案以使用可用區 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.
      3. REST

        如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 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.

        詳情請參閱 Google Cloud 驗證說明文件中的「Authenticate for using REST」。

必要的角色

如要取得將專案遷移至區域 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

    如果您是使用搜尋列尋找這個頁面,請選取子標題為「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」(使用區域 DNS) 按鈕。

    1. 查看專案的「VM instances」(VM 執行個體) 頁面時,如果專案已準備好遷移 (與可用區 DNS 查詢相容),橫幅就會顯示「使用可用區 DNS」建議。這項建議是根據專案中的內部 DNS 使用情況而定,但僅限過去 30 天。

      主控台中顯示的橫幅,指出區域 DNS 已可遷移。

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

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

  • 手動變更專案中繼資料,改用區域性 DNS。

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

      主控台

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

        前往「Custom metadata」(自訂中繼資料) 頁面

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

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

      4. 如果沒有值為 VmDnsSetting 的鍵,請按一下「新增項目」

        • 在「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. 建構對 projects.setCommonInstanceMetadata 方法POST 要求,設定中繼資料鍵值組合:

        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」(VM 執行個體) 頁面會顯示下列橫幅:

橫幅:指出專案尚未準備好遷移至區域性 DNS。

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

如要解決不相容的查詢,請按照下列步驟操作:

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

    前往記錄檔探索工具

  2. 選取專案。

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

    1. 按一下「Resource」(資源)
    2. 在「選取資源」對話方塊中,選取「VM 執行個體」,然後按一下「套用」
    3. 按一下「記錄名稱」
    4. 在「選取記錄檔名稱」對話方塊中,選取「gdnsusage」,然後按一下「套用」

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

       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. 使用「記錄檔探索工具」頁面再次查詢全域 DNS 用量。 修正所有會封鎖全域 DNS 查詢的問題後,查詢結果中就不會再顯示任何偵錯記錄。

    2. 重新檢查監控指標,確認所有不相容的 DNS 查詢都已移除。

在記錄檔探索工具中查看全域 DNS 記錄

如果專案的查詢不相容於區域性 DNS,記錄檔探索工具主要會顯示專案的全域 DNS 記錄。這些記錄有助於您在遷移前,找出並分析這些有問題的查詢。

您也可以使用記錄檔探索工具,針對這些不相容的查詢執行下列操作:

  • 建立資訊主頁:將不相容的全域 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 服務內的執行個體通訊

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

    可能發生的錯誤:「健康狀態檢查失敗」:這表示健康狀態檢查因 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

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

  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 的程序問題

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

後續步驟