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 成为性能瓶颈。
kube-system 命名空间(不是常见的 infrastructure 命名空间),manifest 位于 applications/infrastructure/nodelocaldns/,目录下只有 daemonset.yaml、configmap.yaml、rbac.yaml,没有 kustomization.yaml。部署形态
- 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: true,dnsPolicy: 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,包含 Corefile 与 Corefile.base 两段。Pod 启动时 initContainer init-corefile 把 ConfigMap 里的内容从 /etc/coredns-from-cm 拷贝到 emptyDir 卷 /etc/coredns(Corefile → Corefile,Corefile.base → Corefile.base),主容器再从该目录读取。
Corefile 的关键约定:
- 所有 server 块都
bind 169.254.20.10,只在节点本地链路地址上服务。 cluster.local 10.43.0.0/16的 kubernetes 插件块直接解析集群域,其余.、10.43.0.10:53、in-addr.arpa、ip6.arpa块统一forward . 10.43.0.10转发到集群 kube-dns。- 每个块都开启
cache 30、reload、prometheus :9153与log、errors。
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.yaml、prometheusrule.yaml、hpa.yaml、vpa.yaml 或 pdb。各 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 总览