容器服务 NodeLocalDNSCache 说明

NodeLocal DNSCache 通过在集群节点上作为 DaemonSet 运行 DNS 缓存代理来提高集群 DNS 性能。在当今的体系结构中,处于 ClusterFirst DNS 模式的 Pod 可以连接到 kube-dns serviceIP 进行 DNS 查询。通过 kube-proxy 添加的 iptables 规则将其转换为 kube-dns/CoreDNS 端点。借助此新架构,Pods 将可以访问在。

相关产品
容器服务 产品页,含版本规格、价格与购买入口。

一、部署在集群内的 Kubernetes 对象

Kubernetes 对象名称 类型 请求资源 所属 Namespace
node-local-dns DaemonSet 每节点50mCPU,5MiB内存 kube-system
kube-dns-upstream Service – kube-system
node-local-dns ServiceAccount – kube-system
node-local-dns ConfigMaps – kube-system

二、基本要求

·仅支持 1.14 版本以上的 Kubernetes 版本。

·仅支持 VPC-CNI 网络模式,不支持 GR(GlobalRouter)网络模式。

·VPC-CNI 模式下同时支持 kube-proxy 的 iptables 和 ipvs 模式。

·集群创建后没有调整过 DNS 服务对应工作负载的相关 name 和 label,检查集群 kube-system 命名空间中存在以下 DNS 服务的相关工作负载:

·service/kube-dns

·deployment/kube-dns 或者 deployment/coredns,且存在 k8s-app: kube-dns 的 label

三、IPVS 模式额外要求

·IPVS 的独立集群,需要确保 add-pod-eni-ip-limit-webhook ClusterRole 具备以下权限:

– apiGroups: – "" resources: – configmaps – secrets – namespaces – services verbs: – list – watch – get – create – update – delete – patch

·IPVS 的独立集群和托管集群,都需要确保 tke-eni-ip-webhook Namespace 下的 add-pod-eni-ip-limit-webhook Deployment 镜像版本大于等于 v0.0.6。

四、不支持的场景

以下场景不支持使用 NodeLocal DNS Cache:

限制场景 原因说明
部署在超级节点上的 Pod 超级节点(EKS)上没有真实的宿主机运行 NodeLocal DNS Cache 服务。新版本 EKS 会自动忽略 169.254.20.10 这个地址,低版本则可能存在 DNS 解析问题
独占网卡模式(tke-direct-eni)的 Pod 独占网卡模式下,Pod 的网络流量不经过宿主机网络栈,无法访问运行在宿主机上的 Local DNS 缓存服务(169.254.20.10)
Cilium Overlay 网络模式 Cilium 网络插件有独立的 DNS 处理机制,与 NodeLocal DNS Cache 不兼容
GR(GlobalRouter)网络模式 GR 网络模式的集群默认未安装 tke-eni-ip-webhook 组件(该组件是 VPC-CNI 网络模式专用),不支持使用 NodeLocal DNS Cache

五、DNSConfig 自动注入

在 IPVS 模式下,TKE 通过 tke-eni-ip-webhook 组件自动为 Pod 注入 DNSConfig,使其能够使用本地 DNS 缓存。

六、三级配置优先级

注入决策采用三级配置优先级体系(从高到低):

优先级 配置层级 配置方式 说明
最高 Pod 级 Pod label localdns-injector=enabled|disabled 单个 Pod 的精细控制
中等 Namespace 级 Namespace label localdns-injector=enabled|disabled 命名空间级别批量控制
最低 集群级 在 TKE 控制台组件管理中配置 tke-eni-ip-webhook 组件的 localdns 参数。 集群默认行为(默认值为 false)

注意:说明:

注意:DNSConfig 自动注入功能由 tke-eni-ip-webhook 组件实现,而非 NodeLocal DNS Cache 组件本身。NodeLocal DNS Cache 组件负责在每个节点上运行 DNS 缓存服务,tke-eni-ip-webhook 则负责在 Pod 创建时自动注入 DNSConfig,使 Pod 能够使用本地 DNS 缓存。因此,集群级的注入开关需要在 tke-eni-ip-webhook 组件中配置。

七、配置示例

# 场景1: 集群默认禁用(localdns=false),为特定 namespace 启用kubectl label namespace production localdns-injector=enabled# 场景2: 集群默认启用(在组件管理中配置 localdns=true),为特定 namespace 禁用kubectl label namespace sensitive-app localdns-injector=disabled# 场景3: Namespace 启用,为特定 Pod 禁用kubectl run special-pod –image=nginx \\ –labels="localdns-injector=disabled"# 场景4: 集群和 Namespace 都禁用,为特定 Pod 启用kubectl run test-pod –image=nginx \\ –labels="localdns-injector=enabled"

八、推荐配置

当安装 NodeLocal DNSCache 后,推荐为 CoreDNS 增加如下配置:

template ANY HINFO . { rcode NXDOMAIN}forward . /etc/resolv.conf { prefer_udp}

九、操作步骤

1. 登录 容器服务控制台,在左侧导航栏中选择集群。

2. 在集群列表中,单击目标集群 ID,进入集群详情页。

3. 选择左侧菜单栏中的组件管理,在组件管理页面单击新建。

4. 在新建组件管理页面中勾选 NodeLocalDNSCache。NodeLocalDNSCache 详细配置可参见 产品文档。

5. 单击完成即可创建组件。

赞 (0)
上一篇 4天前
下一篇 4天前