文档首页> 云容器引擎 CCE> 用户指南(吉隆坡区域)> 网络> DNS> 使用NodeLocal DNSCache提升DNS性能
更新时间:2024-01-24 GMT+08:00

使用NodeLocal DNSCache提升DNS性能

应用现状

当集群中的DNS请求量增加时,CoreDNS将会承受更大的压力,可能会导致如下影响:

  • 延迟增加:CoreDNS需要处理更多的请求,可能会导致DNS查询变慢,从而影响业务性能。
  • 资源占用率增加:为保证DNS性能,CoreDNS往往需要更高规格的配置。

解决方案

为了避免DNS延迟的影响,可以在集群中部署NodeLocal DNSCache来提升服务发现的稳定性和性能。NodeLocal DNSCache会在集群节点上运行DNS缓存代理,所有注入DNS配置的Pod都会使用节点上运行的DNS缓存代理进行域名解析,而不是使用CoreDNS服务,以此来减少CoreDNS服务的压力,提高集群DNS性能。

启用NodeLocal DNSCache之后,DNS查询所遵循的路径如下图所示。

图1 NodeLocal DNSCache查询路径

约束与限制

node-local-dns-injection标签为NodeLocal DNSCache使用的系统标签,除避免DNSConfig自动注入的场景外,应避免使用该标签。

插件安装

CCE提供了node-local-dns插件,可以方便的安装NodeLocal DNSCache。

  • node-local-dns插件仅支持1.19及以上版本集群。
  • NodeLocal DNSCache不提供Hosts、Rewrite等插件能力,仅作为CoreDNS的透明缓存代理。如有需要,可在CoreDNS配置中修改。
  • kube-system等系统命名空间下的Pod不支持自动注入。
  1. (可选)修改CoreDNS配置,让CoreDNS优先采用UDP协议与上游DNS服务器通信。

    NodeLocal DNSCache采用TCP协议与CoreDNS进行通信,CoreDNS会根据请求来源使用的协议与上游DNS服务器进行通信。当使用了NodeLocal DNSCache时,访问上游DNS服务器时会使用TCP协议,而云上DNS服务器对TCP协议支持有限,如果您使用了NodeLocal DNSCache,您需要修改CoreDNS配置,让其总是优先采用UDP协议与上游DNS服务器进行通信,避免解析异常。

    执行如下步骤,在forward插件中指定请求上游的协议为perfer_udp,修改之后CoreDNS会优先使用UDP协议与上游通信。

    1. 登录CCE控制台,单击集群名称进入集群。
    2. 在左侧导航栏中选择“插件管理”,在“已安装插件”下,在CoreDNS下单击“编辑”,进入插件详情页。
    3. “参数配置”下编辑高级配置,在plugins字段修改以下内容。
      {
          "configBlock": "prefer_udp",
          "name": "forward",
          "parameters": ". /etc/resolv.conf"
      }

  2. 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“插件管理”,在右侧找到node-local-dns,单击“安装”
  3. 在安装插件页面,选择插件规格,并配置相关参数。

    • DNSConfig自动注入:启用后,会创建DNSConfig动态注入控制器,该控制器基于Admission Webhook机制拦截目标命名空间(即命名空间包含标签node-localdns-injection=enabled)下Pod的创建请求,自动配置使用DNS缓存的Pod dnsConfig字段。未开启DNSConfig自动注入或Pod属于非目标命名空间,则需要手动给Pod配置DNSConfig。

  4. 完成以上配置后,单击“安装”

使用NodeLocal DNSCache

默认情况下,应用的请求会通过CoreDNS代理,如果需要使用node-local-dns进行DNS缓存代理,您有以下几种方式可以选择:

  • 自动注入:创建Pod时自动配置Pod的dnsConfig字段。(kube-system等系统命名空间下的Pod不支持自动注入)。
  • 手动配置:手动配置Pod的dnsConfig字段,从而使用NodeLocal DNSCache。

自动注入

自动注入需要满足如下条件:

  • 在安装插件时,开启DNSConfig自动注入
  • 命名空间添加node-local-dns-injection=enabled标签。例如,为default命名空间添加该标签的命令如下:

    kubectl label namespace default node-local-dns-injection=enabled

  • 新建Pod不位于kube-system和kube-public等系统命名空间。
  • 新建Pod没有被打上禁用DNS注入的标签node-local-dns-injection=disabled。
  • 新建Pod的网络为hostNetwork且DNSPolicy为ClusterFirstWithHostNet,或Pod为非hostNetwork且DNSPolicy为ClusterFirst。

开启自动注入后,创建的Pod会自动添加如下dnsConfig字段,nameservers中除了NodeLocal DNSCache的地址(169.254.20.10)外,还添加了CoreDNS的地址(10.247.3.10),保障了业务DNS请求高可用。

...
  dnsConfig:
    nameservers:
      - 169.254.20.10
      - 10.247.3.10
    searches:
      - default.svc.cluster.local
      - svc.cluster.local
      - cluster.local
    options:
      - name: timeout
        value: ''
      - name: ndots
        value: '5'
      - name: single-request-reopen
...

手动配置

手动配置即自行给Pod加上dnsConfig配置。

创建一个Pod,并在dnsConfig中的nameservers配置中添加NodeLocal DNSCache的地址(169.254.20.10)。

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx:alpine
    name: container-0
  dnsConfig:
    nameservers:
    - 169.254.20.10
    - 10.247.3.10
    searches:
    - default.svc.cluster.local
    - svc.cluster.local
    - cluster.local
    options:
    - name: ndots
      value: '2'
  imagePullSecrets:
  - name: default-secret

避免DNSConfig自动注入

如果某个工作负载需要避免DNSConfig自动注入,可在Pod模板的labels字段中添加node-local-dns-injection: disabled的标签。示例如下:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      labels:
        app: test
        node-local-dns-injection: disabled   # 避免DNSConfig自动注入
    spec:
      containers:
        - name: container-1
          image: nginx:latest
          imagePullPolicy: IfNotPresent
      imagePullSecrets:
        - name: default-secret