使用 GKE 適用的 Cloud DNS


本頁說明如何將 Cloud DNS 設為 Google Kubernetes Engine (GKE) 的 Kubernetes DNS 供應商。

使用 Cloud DNS 做為 DNS 供應商,無法讓叢集外部的用戶端直接解析及連線至 Kubernetes 服務。您仍需使用負載平衡器從外部公開服務,並在 DNS 基礎架構上註冊叢集外部 IP 位址。

如要進一步瞭解如何使用 kube-dns 做為 DNS 供應商,請參閱「服務探索和 DNS」。

如要瞭解如何使用自訂版本的 kube-dns 或自訂 DNS 供應商,請參閱「設定自訂 kube-dns 部署作業」。

Cloud DNS for GKE 的運作方式

Cloud DNS 可做為 GKE 的 DNS 供應商,提供 Pod 和服務 DNS 解析功能,且不需要叢集代管的 DNS 供應商。系統會在 Cloud DNS 中,自動為叢集 IP 位址、無頭和外部名稱服務佈建 Pod 和服務的 DNS 記錄。

Cloud DNS 支援完整的 Kubernetes DNS 規格,並為 GKE 叢集中的服務提供 A、AAAA、SRV 和 PTR 記錄的解析功能。PTR 記錄是使用回應政策規則實作。

與叢集代管 DNS 相比,使用 Cloud DNS 做為 GKE 的 DNS 供應商有許多優點:

  • 免除管理叢集代管 DNS 伺服器的負擔。Cloud DNS 是全代管服務,託管於可高度擴充的 Google 基礎架構,因此不需要擴充、監控或管理 DNS 執行個體。
  • 在每個 GKE 節點上,本機解析 DNS 查詢。與 NodeLocal DNSCache 類似,Cloud DNS 會在本地快取 DNS 回應,提供低延遲和高擴充性的 DNS 解析。
  • Google Cloud Observability 整合,可監控 DNS 並記錄相關資訊。詳情請參閱啟用及停用私人受管理區域的記錄功能

架構

如果 Cloud DNS 是 GKE 的 DNS 供應商,控制器會以 GKE 管理的 Pod 形式執行。這個 Pod 會在叢集的控制層節點上執行,並將叢集 DNS 記錄同步到代管的私有 DNS 區域。

下圖顯示 Cloud DNS 控制平面和資料平面如何解析叢集名稱:

Pod 會使用 Cloud DNS 要求服務的 IP 位址。
圖表: 解決叢集名稱

在圖表中,服務 backend 會選取正在執行的 Pod backendclouddns-controller 會為服務 backend 建立 DNS 記錄。

Pod frontend 會傳送 DNS 要求,將名為 backend 的服務 IP 位址解析至 169.254.169.254Compute Engine 本機中繼資料伺服器。中繼資料伺服器會在節點上在本機執行,並將快取未命中傳送至 Cloud DNS。

Cloud DNS 資料平面會在每個 GKE 節點或 Compute Engine 虛擬機器 (VM) 執行個體中在本機執行。視 Kubernetes 服務類型而定,Cloud DNS 會將服務名稱解析為虛擬 IP 位址 (適用於叢集 IP 服務),或是端點 IP 位址清單 (適用於無標頭服務)。

Pod frontend 解析 IP 位址後,即可將流量傳送至 Service backend 和 Service 後方的任何 Pod。

DNS 範圍

Cloud DNS 具有下列 DNS 範圍。叢集無法同時以多種模式運作。

  • GKE 叢集範圍:DNS 記錄只能在叢集內解析,與 kube-dns 的行為相同。只有在 GKE 叢集中執行的節點可以解析服務名稱。根據預設,叢集的 DNS 名稱結尾為 *.cluster.local。這些 DNS 名稱只會在叢集內顯示,不會與相同專案中其他 GKE 叢集的 *.cluster.local DNS 名稱重疊或衝突。這是預設模式

    • Cloud DNS 附加型虛擬私有雲範圍

      Cloud DNS 附加虛擬私有雲範圍是選用功能,可擴充 GKE 叢集範圍,讓虛擬私有雲中的其他資源 (例如 Compute Engine VM 或使用 Cloud VPN/Cloud Interconnect 連線的內部部署用戶端) 解析無標題服務。附加型虛擬私有雲範圍是與叢集範圍一併啟用的額外模式,您可以在叢集中啟用停用此模式,不會影響 DNS 正常運作時間或功能 (叢集範圍)。

  • 虛擬私有雲範圍:DNS 記錄可在整個虛擬私有雲中解析。Compute Engine VM 和地端部署用戶端可以使用 Cloud Interconnect 或 Cloud VPN 連線,並直接解析 GKE 服務名稱。您必須為每個叢集設定專屬的自訂網域,也就是說,所有服務和 Pod DNS 記錄在 VPC 內都不得重複。這個模式可減少 GKE 與非 GKE 資源之間的通訊摩擦。

下表列出 DNS 範圍的差異:

功能 GKE 叢集範圍 Cloud DNS 附加型虛擬私有雲範圍 虛擬私有雲範圍
DNS 可見度範圍 僅限 GKE 叢集內 延伸至整個虛擬私有雲網路 整個虛擬私有雲網路
無頭服務解析度 可在叢集內解析 可使用 `cluster.local` 在叢集內解析,並使用叢集字尾在虛擬私有雲中解析 可使用叢集字尾在叢集內和虛擬私有雲中解析
網域必須是專屬網域 否。使用預設 `*.cluster.local` 是,您必須設定專屬的自訂網域 是,您必須設定專屬的自訂網域
設定 預設,無需額外步驟 叢集建立時可選用
隨時可啟用/停用
必須在建立叢集時設定

Cloud DNS 資源

將 Cloud DNS 做為 GKE 叢集的 DNS 供應商時,Cloud DNS 控制器會在專案的 Cloud DNS 中建立資源。GKE 建立的資源取決於 Cloud DNS 範圍。

範圍 正向查詢區 反向查詢區
叢集範圍 每個叢集在每個 Compute Engine 區域 (位於該地區) 中,最多可有 1 個私人區域 每個叢集在每個 Compute Engine 區域 (位於該地區) 中,最多可有 1 個回應政策可用區
Cloud DNS 附加型虛擬私有雲範圍 每個叢集在每個 Compute Engine 區域 (位於該區域中) 都有 1 個私人區域 每個叢集 (全球區域) 都有 1 個VPC 範圍的私人區域
每個叢集在每個 Compute Engine 區域 (位於該地區) 中,每個叢集 (全球區域) 回應政策區域 1 個
每個叢集 (全球區域) VPC 範圍回應政策區域 1 個
虛擬私有雲範圍 每個叢集 1 個私人區域 (全域區域) 每個叢集 1 個回應政策可用區 (全域可用區)

這些 Cloud DNS 資源的命名慣例如下:

範圍 正向查詢區 反向查詢區
叢集範圍 gke-CLUSTER_NAME-CLUSTER_HASH-dns gke-CLUSTER_NAME-CLUSTER_HASH-rp
Cloud DNS 附加型虛擬私有雲範圍 gke-CLUSTER_NAME-CLUSTER_HASH-dns 叢集範圍的可用區
gke-CLUSTER_NAME-CLUSTER_HASH-dns-vpc 虛擬私有雲範圍的可用區
gke-CLUSTER_NAME-CLUSTER_HASH-rp 代表叢集範圍的區域
gke-NETWORK_NAME_HASH-rp 代表虛擬私有雲範圍的區域
虛擬私有雲範圍 gke-CLUSTER_NAME-CLUSTER_HASH-dns gke-NETWORK_NAME_HASH-rp

除了上表提及的區域,Cloud DNS 控制器還會在專案中建立下列區域 (視設定而定):

自訂 DNS 設定 可用區類型 區域命名慣例
Stub 網域 轉送 (全球區域) gke-CLUSTER_NAME-CLUSTER_HASH-DOMAIN_NAME_HASH
自訂上游網域名稱伺服器 轉送 (全球區域) gke-CLUSTER_NAME-CLUSTER_HASH-upstream

如要進一步瞭解如何建立自訂存根網域或自訂上游名稱伺服器,請參閱「為存根網域新增自訂解析器」。

代管可用區和轉送區域

為提供內部 DNS 流量服務,Cloud DNS 控制器會在叢集所屬區域的每個 Compute Engine 區域中,建立代管 DNS 區域

舉例來說,如果您在 us-central1-c 可用區部署叢集,Cloud DNS 控制器會在 us-central1-aus-central1-bus-central1-cus-central1-f 中建立代管可用區。

Cloud DNS 控制器會為每個 DNS stubDomain 建立一個轉送區域。

Cloud DNS 會使用一個具有 . DNS 名稱的代管區域,處理每個 DNS 上游。

定價

如果 Cloud DNS 是 GKE Standard 叢集的 DNS 供應商,系統會根據 Cloud DNS 定價,針對 GKE 叢集內 Pod 發出的 DNS 查詢計費。

查詢 GKE 管理的虛擬私有雲範圍 DNS 區域時,系統會根據標準 Cloud DNS 定價計費。

需求條件

您必須在專案中啟用 Cloud DNS API。

GKE 適用的 Cloud DNS 必須符合下列叢集範圍規定

  • 如果是 Standard,則為 GKE 1.24.7-gke.800、1.25.3-gke.700 以上版本。
  • 如果是 Autopilot,則為 GKE 1.25.9-gke.400、1.26.4-gke.500 以上版本。
  • Google Cloud CLI 411.0.0 以上版本。

GKE 適用的 Cloud DNS 附加型虛擬私有雲範圍必須符合下列條件:

  • GKE 1.28.3-gke.1430000 以上版本。
  • Google Cloud CLI 503.0.0 以上版本。
  • GKE 叢集必須使用 Cloud DNS 叢集範圍做為預設 DNS 供應商。

GKE 適用的 Cloud DNS 必須符合下列虛擬私有雲範圍條件:

  • 如果是 Standard,則為 GKE 1.19 以上版本。
  • Google Cloud CLI 364.0.0 以上版本。
  • 您必須在專案中啟用 Cloud DNS API。

規定與限制

限制如下:

  • Autopilot 叢集不支援 VPC 範圍,僅支援叢集範圍。如要解析在 GKE Autopilot 叢集中執行的無標題服務名稱,必須使用附加虛擬私有雲範圍。

  • 您只能在建立叢集時,為 GKE Autopilot 叢集啟用加法 VPC 範圍。現有 GKE Autopilot 叢集不支援啟用或停用附加型虛擬私有雲範圍。

  • 如果受監管環境的法規遵循制度為 IL4,則無法使用 GKE 適用的 Cloud DNS,系統會強制使用 kube-dns。

  • 系統不支援手動變更代管不公開 DNS 區域,且 Cloud DNS 控制器會覆寫這類變更。當控制器重新啟動時,這些區域的 DNS 記錄修改內容不會保留。

  • 在叢集中啟用 Cloud DNS for GKE 後,kube-dns 會繼續在叢集中執行。您可以將 kube-dns Deployment 和自動調度器調度至零,藉此停用 kube-dns。

  • 使用 --cluster-dns-scope 旗標設定範圍後,您就無法變更叢集中的 DNS 範圍。如要變更 DNS 範圍,請使用不同的 DNS 範圍重新建立叢集。

  • 適用 Cloud DNS 資源的限制。具體來說,一個虛擬私有雲網路一次最多只能繫結一個回應政策區域。如果已有名稱不符合命名慣例的回應政策區域繫結至叢集的虛擬私有雲網路,則建立虛擬私有雲和加法虛擬私有雲範圍的叢集會失敗。

  • 自訂存根網域和上游 DNS 伺服器設定適用於 Pod 和節點的 DNS 設定。使用主機網路的 Pod 或直接在主機上執行的程序,也會使用存根網域和上游名稱伺服器設定。這項功能僅適用於標準版。

  • 透過 kube-dns Configmap 設定的自訂存根網域和上游名稱伺服器,會自動套用至叢集範圍 DNS 的 Cloud DNS。虛擬私有雲範圍 DNS 會忽略 kube-dns ConfigMap,您必須直接在 Cloud DNS 上套用這些設定。這項功能僅適用於標準版。

  • 從 kube-dns 遷移至虛擬私有雲範圍沒有路徑,這項作業會造成中斷。從 kube-dns 切換至虛擬私有雲範圍,或反向切換時,請重新建立叢集。

  • 如果是 VPC 範圍,Service 的次要 IP 位址範圍不得與該子網路中的任何其他叢集共用。

  • 如果是虛擬私有雲範圍,與 PTR 記錄相關聯的回應政策會附加至虛擬私有雲網路。如果叢集網路繫結了任何其他回應政策,Kubernetes 服務 IP 位址的 PTR 記錄解析就會失敗。

  • 如果您嘗試建立無標題服務,但 Pod 數量超過允許配額,Cloud DNS 就不會為該服務建立記錄集或記錄。

配額

Cloud DNS 會使用配額,限制 GKE 可為 DNS 項目建立的資源數量。Cloud DNS 的配額和限制可能與專案的 kube-dns 限制不同。

使用 GKE 適用的 Cloud DNS 時,專案中的每個代管區域都會套用下列預設配額:

Kubernetes DNS 資源 對應的 Cloud DNS 資源 配額
DNS 記錄數 每個代管區域的位元組數上限 2,000,000 (受管理區域的上限為 50 MB)
每個無頭服務的 Pod 數量 (IPv4/IPv6) 每個資源記錄集的記錄數 GKE 1.24 至 1.25:1,000 (IPv4/IPv6)
GKE 1.26 以上版本:3,500/2,000 (IPv4/IPv6)
專案中的 GKE 叢集數量 每項專案的回應政策數 100
每個叢集的 PTR 記錄數量 每個回應政策的規則數量 100,000

資源限制

您為每個叢集建立的 Kubernetes 資源會計入 Cloud DNS 資源限制,如下表所示:

限制 對上限的影響
每個代管區域的資源記錄集 每個叢集的服務數量,加上具有有效主機名稱的無 Headless 服務端點數量。
每個資源記錄集的記錄數 每個無頭服務的端點數量。不會影響其他服務類型。
每個回應政策的規則數量 就叢集範圍而言,每個叢集的服務數量加上具有有效主機名稱的無標頭服務端點數量。 如果是虛擬私有雲範圍,則為服務數量加上虛擬私有雲中所有叢集的主機名稱無伺服器端點數量。

如要進一步瞭解如何為 Kubernetes 建立 DNS 記錄,請參閱以 Kubernetes DNS 為基礎的服務探索

事前準備

開始之前,請確認你已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。

啟用叢集範圍 DNS

在叢集範圍 DNS 中,只有在 GKE 叢集中執行的節點可以解析服務名稱,且服務名稱不會在叢集之間發生衝突。這項行為與 GKE 叢集中的 kube-dns 相同,因此您可以將叢集從 kube-dns 遷移至 Cloud DNS 叢集範圍,且應用程式不會停機或變更。

下圖顯示 Cloud DNS 如何為 GKE 叢集建立私人 DNS 區域。只有在叢集節點上執行的程序和 Pod 才能解析叢集的 DNS 記錄,因為只有節點位於 DNS 範圍內。

不同節點上的 Pod 會解析 GKE 叢集內的服務。
圖表: 叢集範圍 DNS

在新叢集中啟用叢集範圍 DNS

GKE Autopilot 叢集

使用 1.25.9-gke.400、1.26.4-gke.500 以上版本的新 Autopilot 叢集,預設會採用 Cloud DNS 叢集範圍。

GKE Standard 叢集

您可以使用 gcloud CLI 或 Google Cloud 控制台,建立已啟用 Cloud DNS 叢集範圍的 GKE Standard 叢集:

gcloud

使用 --cluster-dns 旗標建立叢集:

gcloud container clusters create CLUSTER_NAME \
    --cluster-dns=clouddns \
    --cluster-dns-scope=cluster \
    --location=COMPUTE_LOCATION

更改下列內容:

指令中的 --cluster-dns-scope=cluster 旗標為選用,因為 cluster 是預設值。

主控台

  1. 在 Google Cloud 控制台中,前往「建立 Kubernetes 叢集」頁面。

    前往「建立 Kubernetes 叢集」

  2. 在導覽窗格的「叢集」底下,按一下 [網路]

  3. 在「DNS provider」(DNS 供應商) 部分,按一下「Cloud DNS」

  4. 選取「叢集範圍」

  5. 視需要設定叢集。

  6. 點選「建立」

在現有叢集內啟用叢集範圍 DNS

GKE Autopilot 叢集

您無法將現有的 GKE Autopilot 叢集從 kube-dns 遷移至 Cloud DNS 叢集範圍。如要啟用 Cloud DNS 叢集範圍,請在 1.25.9-gke.400、1.26.4-gke.500 以上版本中重新建立 Autopilot 叢集。

GKE Standard 叢集

您可以使用 gcloud CLI 或 GKE Standard 叢集中的Google Cloud 控制台,將現有的 GKE Standard 叢集從 kube-dns 遷移至 Cloud DNS 叢集範圍。

遷移現有叢集時,叢集中的節點不會使用 Cloud DNS 做為 DNS 供應商,直到您重新建立節點為止。

為叢集啟用 Cloud DNS 後,只有在您升級現有節點集區,或新增節點集區至叢集的情況下,設定才會套用。如果升級節點集區,系統就會重新建立節點。

您也可以在不中斷叢集通訊的情況下,遷移執行應用程式的叢集,方法是在每個節點集區中分別啟用 Cloud DNS 做為 DNS 供應商。由於部分節點集區使用 kube-dns,部分節點集區使用 Cloud DNS,因此節點子集會隨時運作。

在下列步驟中,您將為叢集啟用 Cloud DNS,然後升級節點集區。升級節點集區時,系統會重新建立節點。節點隨後會使用 Cloud DNS 進行 DNS 解析,而非 kube-dns。

gcloud

  1. 更新現有叢集:

    gcloud container clusters update CLUSTER_NAME \
        --cluster-dns=clouddns \
        --cluster-dns-scope=cluster \
        --location=COMPUTE_LOCATION
    

    更改下列內容:

    指令中的 --cluster-dns-scope=cluster 旗標為選用,因為 cluster 是預設值。

    回應類似以下內容:

    All the node-pools in the cluster need to be re-created by the user to start using Cloud DNS for DNS lookups. It is highly recommended to complete this step
    shortly after enabling Cloud DNS.
    Do you want to continue (Y/n)?
    

    確認後,Cloud DNS 控制器會在 GKE 控制層上執行,但 Pod 不會使用 Cloud DNS 進行 DNS 解析,除非您升級節點集區,或在叢集中新增節點集區。

  2. 升級叢集中的節點集區,改用 Cloud DNS:

    gcloud container clusters upgrade CLUSTER_NAME \
        --node-pool=POOL_NAME \
        --location=COMPUTE_LOCATION
    

    更改下列內容:

    • CLUSTER_NAME:叢集名稱。
    • POOL_NAME:要升級的節點集區名稱。

    如果節點集區和控制層執行相同版本,請先升級控制層,如「手動升級控制層」所述,然後執行節點集區升級。

    確認回應,並針對叢集中的每個節點集區重複執行這個指令。如果叢集只有一個節點集區,請省略 --node-pool 標記。

控制台

  1. 前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 按一下您要修改的叢集名稱。

  3. 在「Networking」(網路) 下方的「DNS provider」(DNS 供應商) 欄位中,按一下「Edit DNS provider」(編輯 DNS 供應商)

  4. 按一下「Cloud DNS」

  5. 按一下「叢集範圍」

  6. 按一下 [儲存變更]。

啟用 Cloud DNS 附加型虛擬私有雲範圍

本節說明如何啟用或停用 Cloud DNS 附加型虛擬私有雲範圍,做為 Cloud DNS 叢集範圍的附加元件。

在新叢集中啟用 Cloud DNS 附加型虛擬私有雲範圍

您可以使用 gcloud CLI 或 Google Cloud 控制台,在新 GKE 叢集中啟用虛擬私有雲範圍 DNS。

適用於 Autopilot

gcloud container clusters create-auto CLUSTER_NAME \
    --additive-vpc-scope-dns-domain=UNIQUE_CLUSTER_DOMAIN

更改下列內容:

  • CLUSTER_NAME:叢集名稱。
  • UNIQUE_CLUSTER_DOMAIN:網域名稱。您必須確保這個名稱在 VPC 中不得重複,因為 GKE 不會確認這個值。設定後即無法變更這個值。 請勿使用結尾為「.local」的網域,否則可能會發生 DNS 解析失敗的問題。

適用於 Standard

gcloud container clusters create CLUSTER_NAME \
    --cluster-dns=clouddns \
    --cluster-dns-scope=cluster \
    --additive-vpc-scope-dns-domain=UNIQUE_CLUSTER_DOMAIN

--cluster-dns-scope=cluster 是選用旗標,因為 cluster 是預設值。

更改下列內容:

  • CLUSTER_NAME:叢集名稱。
  • UNIQUE_CLUSTER_DOMAIN:網域名稱。您必須確保這個名稱在 VPC 中不得重複,因為 GKE 不會確認這個值。設定後即無法變更這個值。 請勿使用結尾為「.local」的網域,否則可能會發生 DNS 解析失敗的問題。

在現有叢集中啟用 Cloud DNS 附加型虛擬私有雲範圍

如要在現有叢集中啟用 Cloud DNS 附加型虛擬私有雲範圍,請先為叢集啟用 Cloud DNS,然後升級節點集區。升級節點集區時,系統會重新建立節點。節點接著會使用 Cloud DNS 進行 DNS 解析,而非 kube-dns。

如要在現有叢集中啟用 Cloud DNS 附加型虛擬私有雲範圍,請按照下列步驟操作:

gcloud container clusters update CLUSTER_NAME \
    --additive-vpc-scope-dns-domain=UNIQUE_CLUSTER_DOMAIN \
    --location=COMPUTE_LOCATION

更改下列內容:

  • CLUSTER_NAME:叢集名稱。
  • UNIQUE_CLUSTER_DOMAIN:網域名稱。您必須確保這個名稱在 VPC 中不得重複,因為 GKE 不會確認這個值。設定後即無法變更。請勿使用結尾為「.local」的網域, 否則可能會發生 DNS 解析失敗的情況。
  • COMPUTE_LOCATION:叢集的 Compute Engine 位置

啟用虛擬私有雲範圍 DNS

在虛擬私有雲範圍 DNS 中,叢集的 DNS 名稱可在整個虛擬私有雲中解析。虛擬私有雲中的任何用戶端都可以解析叢集 DNS 記錄。

虛擬私有雲範圍 DNS 可實現下列用途:

  • 在相同 VPC 內,為非 GKE 用戶端探索無介面服務。
  • 從地端或第三方雲端用戶端解析 GKE 服務。詳情請參閱「連入伺服器政策」。
  • 服務解析:用戶端可使用自訂叢集 DNS 網域,決定要與哪個叢集通訊。

在下圖中,兩個 GKE 叢集在同一個虛擬私有雲中使用虛擬私有雲範圍 DNS。兩個叢集都有自訂 DNS 網域 (.cluster1.cluster2),而非預設的 .cluster.local 網域。VM 會透過解析 backend.default.svc.cluster1 與無頭後端服務通訊。Cloud DNS 會將無標頭服務解析為服務中的個別 Pod IP,而 VM 會直接與 Pod IP 位址通訊。

從 GKE 叢集外部解析無頭服務的用戶端。
圖表: 虛擬私有雲範圍 DNS

透過 Cloud Interconnect 或 Cloud VPN 連線至 VPC 時,您也可以從其他網路執行這類解析作業。DNS 伺服器政策可讓連線至虛擬私有雲的網路中的用戶端解析 Cloud DNS 中的名稱,包括叢集使用虛擬私有雲範圍 DNS 時的 GKE 服務。

在現有叢集啟用 VPC 範圍 DNS

遷移作業僅支援 GKE Standard,不支援 GKE Autopilot。

GKE Autopilot 叢集

您無法將 GKE Autopilot 叢集從 kube-dns 遷移至 Cloud DNS 虛擬私有雲範圍。

GKE Standard 叢集

您可以使用 gcloud CLI 或 Google Cloud 控制台,將現有 GKE 叢集從 kube-dns 遷移至 Cloud DNS 虛擬私有雲範圍。

為叢集啟用 Cloud DNS 後,只有在您升級現有節點集區,或新增節點集區至叢集的情況下,設定才會套用。如果升級節點集區,系統就會重新建立節點。

在下列步驟中,您將為叢集啟用 Cloud DNS,然後升級節點集區。升級節點集區時,系統會重新建立節點。節點隨後會使用 Cloud DNS 進行 DNS 解析,而非 kube-dns。

gcloud

  1. 更新現有叢集:

    gcloud container clusters update CLUSTER_NAME \
        --cluster-dns=clouddns \
        --cluster-dns-scope=vpc \
        --cluster-dns-domain=CUSTOM_DOMAIN \
        --location=COMPUTE_LOCATION
    

    更改下列內容:

    • CLUSTER_NAME:叢集名稱。
    • COMPUTE_LOCATION:叢集的 Compute Engine 位置
    • CUSTOM_DOMAIN:網域名稱。您必須確保這個名稱在 VPC 中不得重複,因為 GKE 不會確認這個值。設定後即無法變更。請勿使用結尾為「.local」的網域, 否則可能會發生 DNS 解析失敗的情況。

    回應類似以下內容:

    All the node-pools in the cluster need to be re-created by the user to start using Cloud DNS for DNS lookups. It is highly recommended to complete this step
    shortly after enabling Cloud DNS.
    Do you want to continue (Y/n)?
    

    確認後,Cloud DNS 控制器會在 GKE 控制層上執行。升級節點集區或在叢集中新增節點集區後,Pod 才會使用 Cloud DNS 進行 DNS 解析。

  2. 升級叢集中的節點集區,改用 Cloud DNS:

    gcloud container clusters upgrade CLUSTER_NAME \
        --node-pool=POOL_NAME
    

    更改下列內容:

    • CLUSTER_NAME:叢集名稱。
    • POOL_NAME:要升級的節點集區名稱。

    如果節點集區和控制層執行相同版本,請先升級控制層,如「手動升級控制層」所述,然後執行節點集區升級。

    確認回應,並針對叢集中的每個節點集區重複執行這個指令。如果叢集只有一個節點集區,請省略 --node-pool 標記。

控制台

  1. 前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 按一下您要修改的叢集名稱。

  3. 在「Networking」(網路) 下方的「DNS provider」(DNS 供應商) 欄位中,按一下「Edit DNS provider」(編輯 DNS 供應商)

  4. 按一下「Cloud DNS」

  5. 按一下「VPC 範圍」

  6. 按一下 [儲存變更]。

驗證 Cloud DNS

確認 GKE 適用的 Cloud DNS 是否正常運作:

  1. 連線至節點上的 Pod 並執行 cat /etc/resolv.conf 指令,確認節點是否使用 Cloud DNS:

    kubectl exec -it POD_NAME -- cat /etc/resolv.conf | grep nameserver
    

    POD_NAME 替換為 Pod 的名稱。

    輸出內容會與下列內容相似 (視叢集模式而定):

    GKE Autopilot 叢集

    nameserver 169.254.20.10
    

    由於 GKE Autopilot 預設會啟用 NodeLocal DNSCache,因此 Pod 會使用 NodeLocal DNSCache

    只有在本地快取沒有要查詢的名稱項目時,NodeLocal DNSCache 才會將要求轉送至 Cloud DNS。

    GKE Standard 叢集

    nameserver 169.254.169.254
    

    Pod 使用 169.254.169.254 做為 nameserver,這是中繼資料伺服器的 IP 位址,Cloud DNS 資料平面會監聽通訊埠 53 上的要求。節點不再使用 kube-dns 服務位址進行 DNS 解析,所有 DNS 解析作業都會在本地節點上進行。

    如果輸出內容是類似 10.x.y.10 的 IP 位址,則表示 Pod 使用 kube-dns。請參閱「疑難排解」一節,瞭解 Pod 仍使用 kube-dns 的原因。

    如果輸出內容為 169.254.20.10,表示您已在叢集中啟用 NodeLocal DNSCache,Pod 正在使用 NodeLocal DNSCache

  2. 將範例應用程式部署至叢集:

    kubectl run dns-test --image us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
    
  3. 使用 Service 公開範例應用程式:

    kubectl expose pod dns-test --name dns-test-svc --port 8080
    
  4. 確認服務已成功部署:

    kubectl get svc dns-test-svc
    

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

    NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    dns-test-svc   ClusterIP   10.47.255.11    <none>        8080/TCP   6m10s
    

    CLUSTER-IP 的值是叢集的虛擬 IP 位址。在本範例中,虛擬 IP 位址為 10.47.255.11

  5. 確認服務名稱已在叢集的不公開 DNS 區域中建立為記錄:

    gcloud dns record-sets list \
        --zone=PRIVATE_DNS_ZONE \
        --name=dns-test-svc.default.svc.cluster.local.
    

    PRIVATE_DNS_ZONE 替換為代管 DNS 區域的名稱。

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

    NAME: dns-test-svc.default.svc.cluster.local.
    TYPE: A
    TTL: 30
    DATA: 10.47.255.11
    

停用 Cloud DNS for GKE

GKE Autopilot 叢集

如果 GKE Autopilot 叢集是預設使用 Cloud DNS 建立,就無法停用 Cloud DNS。如要進一步瞭解預設使用 Cloud DNS 的 GKE Autopilot 叢集,請參閱相關規定

GKE Standard 叢集

您可以在 GKE Standard 叢集中,使用 gcloud CLI 或 Google Cloud 控制台停用 Cloud DNS 叢集範圍。

gcloud

更新叢集以使用 kube-dns:

gcloud container clusters update CLUSTER_NAME \
    --cluster-dns=default

控制台

  1. 前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 按一下您要修改的叢集名稱。

  3. 在「Networking」(網路) 下方的「DNS provider」(DNS 供應商) 欄位中,按一下「Edit DNS provider」(編輯 DNS 供應商)

  4. 按一下「Kube-dns」

  5. 按一下 [儲存變更]。

停用標準叢集的 Cloud DNS 後,請更新與叢集相關聯的節點集區。或者,您也可以建立新的節點集區,並在該處排定工作負載。如果您未更新節點集區,DNS 命名空間會繼續指向 Cloud DNS,而非 kube-dns。

停用 Cloud DNS 附加型虛擬私有雲範圍

為叢集停用 Cloud DNS 附加型虛擬私有雲範圍時,系統只會刪除附加至虛擬私有雲網路的不公開區域中的 DNS 記錄。在從叢集刪除無頭服務之前,GKE 叢集的私人 DNS 區域記錄會保留,並由 Cloud DNS for GKE 管理。

如要停用 Cloud DNS 附加型虛擬私有雲範圍,請執行下列指令:

gcloud container clusters update CLUSTER_NAME \
    --disable-additive-vpc-scope

CLUSTER_NAME 替換為叢集名稱。

這樣一來,叢集就會啟用 Cloud DNS 叢集範圍,從叢集內提供 DNS 解析。

清除所用資源

完成本頁的練習後,請按照下列步驟移除資源,以免您的帳戶產生不必要的費用:

  1. 刪除服務:

    kubectl delete service dns-test-svc
    
  2. 刪除 Pod:

    kubectl delete Pod dns-test
    
  3. 您也可以刪除叢集

搭配共用虛擬私有雲使用 Cloud DNS

GKE 適用的 Cloud DNS 支援虛擬私有雲和叢集範圍的共用虛擬私有雲。

GKE 控制器會在與 GKE 叢集相同的專案中,建立代管私人可用區。

由於代管區域和 GKE 叢集位於同一專案中,因此 GKE 叢集的 GKE 服務帳戶不需要專案外部 DNS 的 Identity and Access Management (IAM)。

每個服務專案有多個叢集

從 GKE 1.22.3-gke.700 和 1.21.6-gke.1500 版開始,您可以在多個服務專案中建立叢集,並參照相同主專案中的虛擬私有雲。

如果您已有使用共用虛擬私有雲和 Cloud DNS 虛擬私有雲範圍的叢集,請按照下列步驟手動遷移:

您可以使用 Google Cloud 控制台遷移回覆政策。

在服務專案中執行下列步驟:

  1. 前往「Cloud DNS 區域」頁面。

    前往 Cloud DNS 區域

  2. 按一下「回覆政策可用區」分頁標籤。

  3. 按一下虛擬私有雲網路的回應政策。您可以根據說明識別回應政策,說明類似於「Response policy for GKE clusters on network NETWORK_NAME.」。

  4. 按一下「In use by」(使用者) 分頁標籤。

  5. 按一下主專案名稱旁的 ,移除網路繫結。

  6. 按一下「回應政策規則」分頁標籤。

  7. 選取表格中的所有項目。

  8. 按一下「移除回應政策規則」

  9. 按一下 「刪除回應政策」

刪除回應政策後,DNS 控制器會自動在主專案中建立回應政策。其他服務專案中的叢集共用這項回應政策。

支援自訂存根網域和上游名稱伺服器

Cloud DNS for GKE 支援使用 kube-dns ConfigMap 設定的自訂存根網域和上游名稱伺服器。這項支援服務僅適用於 GKE Standard 叢集。

Cloud DNS 會將 stubDomainsupstreamNameservers 值轉換為 Cloud DNS 轉送區域。

規格擴充功能

為提升服務探索功能,並與各種用戶端和系統相容,我們在一般 Kubernetes DNS 規格的基礎上新增了許多功能。

已命名的通訊埠

本節說明具名連接埠如何影響 Cloud DNS 為 Kubernetes 叢集建立的 DNS 記錄。Kubernetes 會定義一組最低需求的 DNS 記錄,而 Cloud DNS 則可能會為自身運作建立額外記錄,並支援各種 Kubernetes 功能。 下表說明預期最少會有的記錄集數量,其中「E」代表端點數量,「P」代表連接埠數量。 Cloud DNS 可能會建立額外記錄。

IP 堆疊類型 服務類型 記錄集
單一堆疊 ClusterIP
$$2+P$$
無頭
$$2+P+2E$$
雙堆疊 ClusterIP
$$3+P$$
無頭
$$3+P+3E$$
如要進一步瞭解單一和雙堆疊服務,請參閱單一和雙堆疊服務

Cloud DNS 建立的其他 DNS 記錄

Cloud DNS 可能會建立超出最少記錄集數量的額外 DNS 記錄。這些記錄可用於各種用途,包括: SRV 記錄:為了探索服務,Cloud DNS 通常會建立 SRV 記錄。這些記錄會提供服務的通訊埠和通訊協定相關資訊。 AAAA 記錄 (適用於雙重堆疊):在雙重堆疊設定 (IPv4 和 IPv6) 中,Cloud DNS 會為每個端點建立 A 記錄 (適用於 IPv4) 和 AAAA 記錄 (適用於 IPv6)。內部記錄:Cloud DNS 可能會建立內部記錄,用於管理和最佳化。這些記錄通常與使用者沒有直接關聯。 LoadBalancer 服務:對於 LoadBalancer 類型的服務,Cloud DNS 會建立與外部負載平衡器 IP 位址相關聯的記錄。無頭服務:無頭服務有不同的 DNS 設定。每個 Pod 都會取得專屬的 DNS 記錄,讓用戶端直接連線至 Pod。因此在無頭服務記錄計算中,通訊埠號碼不會相乘。

範例: 假設 backend 命名空間中有名為 my-http-server 的服務。這項 Service 會為含有三個 Pod 的 Deployment 公開兩個通訊埠 (80 和 8080)。因此 E = 3,P = 2。

IP 堆疊類型 服務類型 記錄集
單一堆疊 ClusterIP
$$2+2$$
無頭
$$2+2+2*3$$
雙堆疊 ClusterIP
$$3+2$$
無頭
$$3+2+3*3$$

除了這些最低記錄外,Cloud DNS 也可能會建立 SRV 記錄,如果是雙堆疊,則會建立 AAAA 記錄。如果 my-http-server 是 LoadBalancer 類型的服務,系統會為負載平衡器 IP 建立額外記錄。注意:Cloud DNS 會視需要新增補充 DNS 記錄。建立的具體記錄取決於服務類型和設定等因素。

已知問題

Terraform 打算因 dns_config 變更而重新建立 Autopilot 叢集

如果您使用 terraform-provider-googleterraform-provider-google-beta,可能會遇到 Terraform 嘗試重新建立 Autopilot 叢集的問題。發生這項錯誤的原因是,新建立的 Autopilot 叢集 (執行 1.25.9-gke.400、1.26.4-gke.500、1.27.1-gke.400 以上版本) 使用 Cloud DNS 做為 DNS 供應商,而非 kube-dns。

這個問題已在 Google Cloud的 Terraform 供應程式 4.80.0 版中解決

如果無法更新 terraform-provider-googleterraform-provider-google-beta 的版本,可以將 lifecycle.ignore_changes 新增至資源,確保 google_container_cluster 忽略 dns_config 的變更:

  lifecycle {
    ignore_changes = [
      dns_config,
    ]
  }

從 kube-dns 遷移至 Cloud DNS 後,啟用 NodeLocal DNSCache 時 DNS 解析失敗

本節說明 Cloud DNS 中 GKE 叢集的已知問題,這些叢集在叢集範圍內使用 NodeLocal DNSCache。

從 kube-DNS 遷移至 Cloud DNS 後,如果叢集已啟用 NodeLocal DNSCache,叢集可能會發生間歇性解析錯誤。

在叢集上啟用 NodeLocal DNSCache 並使用 kube-dns 時,NodeLocal DNSCache 會設定為同時接聽這兩個位址 (NodeLocal DNSCache 位址和 kube-dns 位址)。

如要檢查 NodeLocal DNSCache 的狀態,請執行下列指令:

kubectl get cm -n kube-system node-local-dns -o json | jq .data.Corefile -r | grep bind

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

    bind 169.254.20.10 x.x.x.10
    bind 169.254.20.10 x.x.x.10

將叢集更新為 Cloud DNS 後,NodeLocal DNSCache 設定會隨之變更,請檢查 NodeLocal DNSCache:

kubectl get cm -n kube-system node-local-dns -o json | jq .data.Corefile -r | grep bind

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

    bind 169.254.20.10
    bind 169.254.20.10

以下工作流程說明遷移和節點重建期間,resolv.conf 檔案中的項目:

遷移之前

  • Pod 的 resolv.conf 已設為 kube-dns-IP (即 x.x.x.10)。
  • 節點本機快取 Pod 會監聽這兩個位址 (繫結 169.254.20.10 x.x.x.10),並截取 Pod 的 DNS 要求。
  • NodeLocal DNSCache 會做為快取,kube-dns Pod 的負擔較小。

遷移之後

  • 控制層更新為使用 Cloud DNS 後,Pod 的 resolv.conf 仍會設定為 kube-dns-IP (即 x.x.x.10)。這項設定會保留,因為 GKE 需要重新建立節點,才能使用 169.254.20.10。Cloud DNS 設定需要 169.254.20.10
  • 節點本機快取 Pod 只會監聽 NodeLocal DNSCache 位址 (繫結 169.254.20.10)。要求不會傳送至 Node-local-cache Pod。
  • Pod 的所有要求都會直接傳送至 kube-dns Pod。這項設定會在 Pod 上產生大量流量。

節點重建或節點集區升級後

  • Pod 已resolv.conf設定為 NodeLocal DNSCache IP 位址 (169.254.20.10)。
  • 節點本機快取 Pod 只會監聽 NodeLocal DNSCache 位址 (繫結 169.254.20.10),並接收來自這個 IP 位址的 Pod DNS 要求。

如果節點集區在重新建立前,使用 resolv.conf 下的 kube-dns IP,DNS 查詢流量增加也會導致 kube-dns Pod 的流量增加,進而造成 DNS 要求間歇性失敗。為盡量減少錯誤,您必須在停機期間規劃這項遷移作業。

疑難排解

如要瞭解如何排解 Cloud DNS 問題,請參閱下列頁面:

後續步驟