探索 GKE NodeLocal DNSCache

1. 概览

DNS 缓存通过首先将 pod DNS 请求发送到同一节点上的本地缓存,来缩短 DNS 查找的延迟时间。这使得 DNS 查找时间更加一致,并可减少对 kube-dns 或 Cloud DNS 的 DNS 查询次数。

在此实验中,您将测试 **NodeLocal DNSCache** 如何处理 GKE 集群中的 DNS 流量。您将验证运行 1.34.1-gke.3720000 版及更高版本的 GKE Standard 集群,以确认它默认处于启用状态。然后将其停用,以了解关闭该功能后配置会发生怎样的变化。

目标

在此实验中,您将学习如何执行以下任务:

  • 创建自定义 VPC、子网和防火墙规则
  • 部署具有快速发布渠道的标准 GKE Standard 集群
  • 执行测试以验证 LocalNode DNS 缓存是否已启用
  • 停用缓存并验证没有缓存时的状态

2. 实验设置

自定进度的环境设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须 创建一个

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • 项目名称 是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时对其进行更新。
  • 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用 PROJECT_ID 标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。
  • 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档
  1. 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除项目。Google Cloud 新用户符合参与 300 美元免费试用计划的条件。

启动 Cloud Shell

虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

Google Cloud 控制台 中,点击右上角工具栏中的 Cloud Shell 图标:

激活 Cloud Shell

预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:

Google Cloud Shell 终端的屏幕截图,显示环境已连接

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。您在此 Codelab 中的所有工作都可以在浏览器中完成。您无需安装任何程序。

3. 设置环境

我们将创建具有防火墙规则的自定义 VPC。如果您已有 VPC 和项目,则可以跳过此部分。

打开位于控制台右上角的 Cloud Shell。并按如下方式进行配置:b51b80043d3bac90.png

  1. 启用我们将在本实验中使用的一些 API
gcloud services enable dns.googleapis.com
gcloud services enable servicedirectory.googleapis.com
gcloud services enable container.googleapis.com
  1. 设置一些变量。这些变量是项目 ID 和 VPC 名称 o(您将在第 3 步中创建 VPC)。
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
  1. 现在,创建一个名为 gke-cache-vpc 的自定义 VPC
gcloud compute networks create $vpc_name --subnet-mode=custom --project=$projectid \
--subnet-mode=custom \
--mtu=1460 \
--bgp-routing-mode=global
  1. 在新 VPC 中创建子网
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
  1. 向 VPC 添加防火墙规则
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 中使用以下命令

  1. 创建 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 集群并进行验证

  1. 在 Google Cloud Shell 中,创建一个名为 cache-gke-cluster 的集群。在运行 1.34.1-gke.3720000 版及更高版本的 GKE Standard 集群中,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
  1. 创建集群后,请连接:
gcloud container clusters get-credentials $cluster_name --zone $zone
  1. 现在,我们来验证 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
  1. 接下来,运行以下命令(这会在主机网络上创建一个特权 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 流量绕过了连接跟踪表。

7135447929b7c48f.png

6. 停用 NodeLocal DNSCache 并进行验证

我们现在移除优化,以了解没有优化时的工作方式。

  1. 转到 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,因为它们已被移除。

  1. 重新运行 测试
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 地址的内容。这意味着您不再获享本地缓存的优势

4693ee556701e145.png

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 实验: