NodeLocal DNSCache · 节点本地 DNS 缓存

NodeLocal DNSCache 是一个跑在每个节点上的本地 DNS 缓存代理(k8s-dns-node-cache,基于 CoreDNS),监听节点本地地址 169.254.20.10:53,上游指向集群 kube-dns Service 10.43.0.10,目的是把节点上 Pod 的 DNS 查询命中本地缓存,减少跨节点 DNS 查询延迟、避免 DNS 成为性能瓶颈。

部署形态

  • Name
    命名空间
    Description
    kube-system
  • Name
    工作负载类型
    Description
    DaemonSet(node-local-dns),每个节点一个 Pod;tolerations: operator: Exists 容忍所有污点,确保 master 和 worker 都覆盖
  • Name
    镜像
    Description
    registry.k8s.io/dns/k8s-dns-node-cache:1.26.8(initContainer 与主容器同镜像)
  • Name
    网络
    Description
    hostNetwork: truednsPolicy: ClusterFirstWithHostNet;主容器以 -localip=169.254.20.10 绑定节点本地链路地址
  • Name
    优先级
    Description
    priorityClassName: system-node-critical
  • Name
    权限
    Description
    securityContext.capabilities.add: NET_ADMIN
  • Name
    端口
    Description
    53/UDP(dns)、53/TCP(dns-tcp)、9153/TCP(metrics)
  • Name
    资源
    Description
    requests cpu 25m / memory 16Mi,limits memory 256Mi
  • Name
    存储
    Description
    无持久化;配置经 emptyDir/etc/coredns 提供

主容器启动命令为 /node-cache -localip=169.254.20.10 -conf=/etc/coredns/Corefile。健康探针在 manifest 中被注释禁用,原因写明为「该配置没有 /health 端点」(livenessProbe/readinessProbe 对应的 8181 端口 /health 路径被注掉)。

配置与依赖

配置来自 ConfigMap node-local-dns,包含 CorefileCorefile.base 两段。Pod 启动时 initContainer init-corefile 把 ConfigMap 里的内容从 /etc/coredns-from-cm 拷贝到 emptyDir/etc/corednsCorefileCorefileCorefile.baseCorefile.base),主容器再从该目录读取。

Corefile 的关键约定:

  • 所有 server 块都 bind 169.254.20.10,只在节点本地链路地址上服务。
  • cluster.local 10.43.0.0/16 的 kubernetes 插件块直接解析集群域,其余 .10.43.0.10:53in-addr.arpaip6.arpa 块统一 forward . 10.43.0.10 转发到集群 kube-dns。
  • 每个块都开启 cache 30reloadprometheus :9153logerrors

RBAC(rbac.yaml):ServiceAccount node-local-dns(kube-system)+ ClusterRole system:node-local-dns,仅授予对 nodes 资源的 get/list/watch,由同名 ClusterRoleBinding 绑定到该 ServiceAccount。

依赖:上游是集群 kube-dns Service 10.43.0.10,本组件本身不依赖外部 DB 或中间件,也没有 ExternalSecret。

访问与监控

本组件不暴露 Service,也没有 Ingress——它通过 hostNetwork 直接在每个节点的 169.254.20.10:53 上被节点内 Pod 访问。

manifest 目录中没有 servicemonitor.yamlprometheusrule.yamlhpa.yamlvpa.yamlpdb。各 Corefile 块虽配置了 prometheus :9153 暴露指标端口(containerPort metrics 9153/TCP),但仓库内未提供对应的 ServiceMonitor 去采集它。DaemonSet 的副本数由节点数决定,无需 HPA;也没有配置 PDB。

注意事项

目录内 README.md 标注了一项重要的已知限制:仅部署该 DaemonSet 并不会让 DNS 流量自动改走 169.254.20.10,当前节点上 Pod 的 DNS 仍走 10.43.0.10。要真正启用 NodeLocal DNSCache,需要在每个 K3s 节点上配置 kubelet 使用 169.254.20.10 作为 DNS 服务器(例如给 K3s 加 --kubelet-arg=dns-addr=169.254.20.10/24,然后 systemctl daemon-reload && systemctl restart k3s),或改写 K3s 配置文件。

这一步是节点级、带外(out-of-band)的改动,不在本仓库的 ArgoCD 同步范围内,且会影响该节点上所有 Pod 的 DNS 解析。README 建议在维护窗口、逐节点进行。

验证手段(来自 README):

# DaemonSet 状态
kubectl get daemonset node-local-dns -n kube-system

# 确认每个节点都有 Pod
kubectl get pods -n kube-system -l app=node-local-dns

返回 Infrastructure 总览

评论