1. 總覽
DNS 快取會先將 Pod DNS 要求傳送至相同節點上的本機快取,藉此縮短 DNS 查詢延遲時間。這可讓 DNS 查詢時間更一致,並減少對 kube-dns 或 Cloud DNS 的 DNS 查詢次數。
在本實驗室中,您將測試 NodeLocal DNSCache 如何處理 GKE 叢集中的 DNS 流量。您將驗證執行 1.34.1-gke.3720000 以上版本的 GKE Standard 叢集,確認這項功能是否預設啟用。然後停用,看看關閉這項功能後設定會如何變更。
目標
在本實驗室中,您將瞭解如何執行下列工作:
- 建立自訂虛擬私有雲、子網路和防火牆規則
- 部署發布管道為「快速」的標準 GKE Standard 叢集
- 執行測試,確認已啟用 LocalNode DNS 快取
- 停用快取,並驗證沒有快取的狀態
2. 實驗室設定
自修實驗室環境設定
- 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。



- 專案名稱是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串。你隨時可以更新。
- 專案 ID 在所有 Google Cloud 專案中都是不重複的,而且設定後即無法變更。Cloud 控制台會自動產生專屬字串,通常您不需要在意該字串為何。在大多數程式碼研究室中,您需要參照專案 ID (通常標示為
PROJECT_ID)。如果您不喜歡產生的 ID,可以產生另一個隨機 ID。你也可以嘗試使用自己的名稱,看看是否可用。完成這個步驟後就無法變更,且專案期間會維持不變。 - 請注意,有些 API 會使用第三個值,也就是「專案編號」。如要進一步瞭解這三種值,請參閱說明文件。
- 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成這個程式碼研究室的費用不高,甚至可能完全免費。如要關閉資源,避免在本教學課程結束後繼續產生費用,請刪除您建立的資源或專案。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。
啟動 Cloud Shell
雖然可以透過筆電遠端操作 Google Cloud,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是可在雲端執行的指令列環境。
在 Google Cloud 控制台中,點選右上工具列的 Cloud Shell 圖示:

佈建並連線至環境的作業需要一些時間才能完成。完成後,您應該會看到如下的內容:

這部虛擬機器搭載各種您需要的開發工具,並提供永久的 5GB 主目錄,而且可在 Google Cloud 運作,大幅提升網路效能並強化驗證功能。您可以在瀏覽器中完成本程式碼研究室的所有作業。您不需要安裝任何軟體。
3. 設定環境
我們將建立含有防火牆規則的自訂虛擬私有雲。如果您已有 VPC 和專案,可以略過這個部分。
開啟控制台右上方的 Cloud Shell。然後依照下列方式設定:
- 啟用本實驗室中會用到的一些 API
gcloud services enable dns.googleapis.com
gcloud services enable servicedirectory.googleapis.com
gcloud services enable container.googleapis.com
- 設定一些變數。這些變數是專案 ID 和虛擬私有雲名稱 (您會在步驟 3 建立虛擬私有雲)。
export projectid=$(gcloud config get-value project)
export vpc_name=gke-cache-vpc
export subnet_name=mainsubnet
export region=us-east1
export zone=us-east1-b
export cluster_name=cache-gke-cluster
export channel=rapid
export machine_type=e2-standard-4
echo $projectid
echo $vpc_name
- 現在建立名為
gke-cache-vpc的自訂 VPC
gcloud compute networks create $vpc_name --subnet-mode=custom --project=$projectid \
--subnet-mode=custom \
--mtu=1460 \
--bgp-routing-mode=global
- 在新虛擬私有雲中建立子網路
gcloud compute networks subnets create $subnet_name \
--network=$vpc_name \
--range=10.0.88.0/24 \
--region=$region \
--enable-private-ip-google-access \
--project=$projectid
- 在虛擬私有雲中新增防火牆規則
gcloud compute firewall-rules create $vpc_name-allow-internal \
--network=$vpc_name --allow=tcp,udp,icmp --source-ranges=10.0.88.0/24
gcloud compute firewall-rules create $vpc_name-allow-ssh \
--network=$vpc_name --allow=tcp:22 --source-ranges=35.235.240.0/20
4. 建立 NAT 閘道,用於網際網路通訊
我們需要授予連出網際網路的外部存取權,因此請建立並附加 Cloud NAT 閘道。
在 Cloud Shell 中使用下列指令
- 建立 Cloud NAT 和 NAT 閘道
gcloud compute routers create gke-nat-router --network=$vpc_name --region=$region
gcloud compute routers nats create gke-nat-gw \
--router=gke-nat-router --region=$region \
--auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges
5. 部署 GKE 叢集並驗證
- 在 Google Cloud Shell 中建立名為
cache-gke-cluster的叢集。如果 GKE Standard 叢集執行1.34.1-gke.3720000以上版本,預設會啟用 NodeLocal DNSCache。(佈建叢集需要 4 到 10 分鐘的時間)
gcloud container clusters create $cluster_name \
--zone=$zone --network=$vpc_name --subnetwork=$subnet_name \
--release-channel=$channel --machine-type=$machine_type \
--enable-ip-alias
- 叢集建立完成後,請連線:
gcloud container clusters get-credentials $cluster_name --zone $zone
- 現在讓我們確認 NodeLocal DNSCache 是否已啟用。
這些指令會確認版本為 1.34.1-gke.3720000 以上,並確認本機代理程式正在執行,且服務
kubectl version | grep "Server Version"
kubectl get pods -n kube-system -o wide | grep node-local-dns -w
kubectl get svc,endpoints -n kube-system -l k8s-app=kube-dns
- 接著執行下列指令 (這會在主機網路上建立具備特殊權限的 Pod,以驗證節點的 iptables 規則是否主動攔截 DNS 流量,並將其轉送至本機快取)
export KUBEDNS_IP=$(kubectl get svc kube-dns -n kube-system -o jsonpath='{.spec.clusterIP}')
kubectl run node-inspector --quiet --rm -it --image=alpine --privileged --restart=Never \
--overrides='{"spec": {"hostNetwork": true}}' -- \
sh -c "apk add --no-cache iptables && iptables-save | grep -E '169.254.20.10|$KUBEDNS_IP'"
應尋找的項目:尋找 -j NOTRACK.。這會確認 DNS 流量是否略過連線追蹤表。

6. 停用 NodeLocal DNSCache 並驗證
我們現在移除最佳化功能,看看沒有這項功能會發生什麼事。
- 前往 Cloud Shell 並執行下列指令。注意:這會觸發節點重建作業,由於 GKE 會循環執行個體,因此每個節點集區通常需要 3 到 5 分鐘
gcloud container clusters update $cluster_name --zone=$zone --update-addons=NodeLocalDNS=DISABLED --quiet
kubectl get pods -n kube-system -o wide | grep node-local-dns -w
您應該不會在精靈集看到任何這些 Pod,因為它們已移除。
- 重新執行測試
kubectl run node-inspector --quiet --rm -it --image=alpine --privileged --restart=Never \
--overrides='{"spec": {"hostNetwork": true}}' -- \
sh -c "apk add --no-cache iptables && iptables-save | grep -E '169.254.20.10|$KUBEDNS_IP'"
停用外掛程式後,輸出內容就不會再包含 -j NOTRACK 規則,也不會提及 169.254.20.10 IP 位址。這表示您無法再享有本機快取的好處

7. 清理
# 1. Delete the GKE Cluster
# This will remove the node and all system pods (including kube-dns)
gcloud container clusters delete $cluster_name --zone=$zone --quiet
# 2. Delete the Cloud NAT and Router
# It is best practice to remove these before the VPC
gcloud compute routers nats delete gke-nat-gw --router=gke-nat-router --region=$region --quiet
gcloud compute routers delete gke-nat-router --region=$region --quiet
# 3. Delete the Firewall Rules
gcloud compute firewall-rules delete $vpc_name-allow-internal $vpc_name-allow-ssh --quiet
# 4. Delete the Subnet and VPC
gcloud compute networks subnets delete $subnet_name --region=$region --quiet
gcloud compute networks delete $vpc_name --quiet
8. 後續步驟 / 瞭解詳情
您可以參閱 GKE 網路說明文件和應用實例
Codelab:透過 Private Service Connect 端點,使用 Python SDK 存取 Gemini 3 Pro 對話
Codelab:使用 ADK 建構 AI 代理:基礎知識
挑戰下一個實驗室
繼續完成 Google Cloud 任務,或查看其他 Google Cloud Skills Boost 實驗室: