更新时间:2024-09-29 GMT+08:00

CoreDNS域名解析

插件简介

CoreDNS域名解析插件是一款通过链式插件的方式为Kubernetes提供域名解析服务的DNS服务器。

CoreDNS是由CNCF孵化的开源软件,用于Cloud-Native环境下的DNS服务器和服务发现解决方案。CoreDNS实现了插件链式架构,能够按需组合插件,运行效率高、配置灵活。在Kubernetes集群中使用CoreDNS能够自动发现集群内的服务,并为这些服务提供域名解析。同时,通过级联云上DNS服务器,还能够为集群内的工作负载提供外部域名的解析服务。

该插件为系统资源插件,在创建集群时默认安装。

目前CoreDNS已经成为社区Kubernetes集群推荐的DNS服务器解决方案。

CoreDNS官网:https://coredns.io/

开源社区地址:https://github.com/coredns/coredns

DNS详细使用方法请参见DNS

约束与限制

CoreDNS域名解析插件正常运行或升级时,请确保集群中的可用节点数大于等于插件的实例数,且所有实例都处于运行状态,否则将导致插件异常或升级失败。

安装插件

本插件为系统默认安装,若因特殊情况卸载后,可参照如下步骤重新安装。

  1. 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“插件中心”,在右侧找到CoreDNS域名解析插件,单击“安装”
  2. 在安装插件页面,根据需求选择“规格配置”

    • 选择“系统预置规格”时,您可根据并发域名解析能力选择“小规格”、“中规格”或“大规格”,系统会根据不同的预置规格配置插件的实例数及资源配额,具体配置值请以控制台显示为准。

      “小规格”的外部域名解析能力为2500QPS,内部域名解析能力为10000QPS;“中规格”的外部域名解析能力为5000QPS,内部域名解析能力为20000QPS;“大规格”的外部域名解析能力为10000QPS,内部域名解析能力为40000QPS。

    • 选择“自定义规格”时,您可根据需求调整插件实例数和资源配额。CoreDNS所能提供的域名解析QPS与CPU消耗成正相关,集群中的节点/容器数量增加时,CoreDNS实例承受的压力也会同步增加。请根据集群的规模,合理调整插件实例数和容器CPU/内存配额,配置建议请参见表1
      表1 CoreDNS插件配额建议

      节点数量

      推荐配置

      实例数

      CPU申请值

      CPU限制值

      内存申请值

      内存限制值

      50

      2500QPS

      2

      500m

      500m

      512Mi

      512Mi

      200

      5000QPS

      2

      1000m

      1000m

      1024Mi

      1024Mi

      1000

      10000QPS

      2

      2000m

      2000m

      2048Mi

      2048Mi

      2000

      20000QPS

      4

      2000m

      2000m

      2048Mi

      2048Mi

  3. 通过界面设置插件支持的“参数配置”

    表2 CoreDNS插件参数配置

    参数

    参数说明

    存根域设置

    对自定义的域名配置域名服务器,格式为一个键值对,键为DNS后缀域名,值为一个或一组DNS IP地址,如 'acme.local -- 1.2.3.4,6.7.8.9'。

    详情请参见为CoreDNS配置存根域

    扩展参数配置

    • parameterSyncStrategy:插件升级时是否配置一致性检查。
      • ensureConsistent:表示启用配置一致性检查,如果升级插件时下发的配置和当前生效配置不一致,插件将无法升级。
      • force:表示升级时忽略配置一致性检查。将以升级插件时下发的配置为准,请您自行确保升级插件时下发的配置和当前生效配置一致。插件升级完毕后,需将parameterSyncStrategy参数值恢复为ensureConsistent,重新启用配置一致性检查。
      • inherit:如果升级插件时下发的配置和当前生效配置不一致,将忽略升级插件时下发的配置,以当前生效配置为准。插件升级完毕后,parameterSyncStrategy的参数值将自动恢复为ensureConsistent,重新启用配置一致性检查。
    • servers: CoreDNS 1.23.1插件版本开始开放servers配置,用户可对servers做定制化配置,详情请参见dns-custom-nameservers
      其中plugins为CoreDNS中各组件配置。一般场景建议保持默认配置,以免出现配置错误而导致CoreDNS整体不可用。每个plugin组件可包含"name"、"parameters"(可选)、"configBlock"(可选)配置,对应生成的Corefile配置文件中格式如下:
      $name  $parameters {
      $configBlock
      }

      常用plugin的说明请参见表3。更多配置详情请参见Plugins

    • upstream_nameservers:上游域名服务器地址。

    高级配置示例:

    {
         "annotations": {},
         "parameterSyncStrategy": "ensureConsistent",
         "servers": [
    		   {
    			"plugins": [
    				{
    					"name": "bind",
    					"parameters": "{$POD_IP}"
    				},
    				{
    					"name": "cache",
    					"configBlock": "servfail 5s",
    					"parameters": 30
    				},
    				{
    					"name": "errors"
    				},
    				{
    					"name": "health",
    					"parameters": "{$POD_IP}:8080"
    				},
                                    {
    					"name": "ready",
    					"parameters": "{$POD_IP}:8081"
    				},
    				{
    					"configBlock": "pods insecure\nfallthrough in-addr.arpa ip6.arpa",
    					"name": "kubernetes",
    					"parameters": "cluster.local in-addr.arpa ip6.arpa"
    				},
    				{
    					"name": "loadbalance",
    					"parameters": "round_robin"
    				},
    				{
    					"name": "prometheus",
    					"parameters": "{$POD_IP}:9153"
    				},
    				{
    					"configBlock": "policy random",
    					"name": "forward",
    					"parameters": ". /etc/resolv.conf"
    				},
    				{
    					"name": "reload"
    				}
    			],
    			"port": 5353,
    			"zones": [
    				{
    					"zone": "."
    				}
    			]
    		}
    	],
    	"upstream_nameservers": ["8.8.8.8", "8.8.4.4"]
    }
    表3 CoreDNS默认配置说明

    plugin名称

    类型

    描述

    bind

    默认配置

    CoreDNS侦听的hostIP配置,建议保持当前默认值{$POD_IP}。详情请参见bind

    cache

    默认配置

    启用DNS缓存。详情请参见cache

    插件版本>=1.25.10时,支持关闭servfail缓存。如需关闭servfail缓存,请将configBlock设置为"servfail 0";否则servfail缓存的单位为s,不可省略。

    errors

    默认配置

    错误信息到标准输出。详情请参见errors

    health

    默认配置

    CoreDNS健康检查配置,当前侦听{$POD_IP}:8080,请保持此默认值,否则导致coredns健康检查失败而不断重启。详情请参见health

    ready

    默认配置

    检查后端服务是否准备好接收流量,当前侦听{$POD_IP}:8081。如果后端服务没有准备好,CoreDNS将会暂停 DNS 解析服务,直到后端服务准备好为止。详情请参见ready

    kubernetes

    默认配置

    CoreDNS Kubernetes插件,提供集群内服务解析能力。详情请参见kubernetes

    loadbalance

    默认配置

    轮转式 DNS 负载均衡器,在应答中随机分配A、AAAA和MX记录的顺序。详情请参见loadbalance

    prometheus

    默认配置

    CoreDNS自身metrics数据接口,默认侦听{$POD_IP}:9153,请保持此默认值,否则普罗无法采集coredns metrics数据。详情请参见prometheus

    forward

    默认配置

    不在 Kubernetes 集群域内的任何查询都将转发到默认的解析器 (/etc/resolv.conf)。详情请参见forward

    reload

    默认配置

    允许自动重新加载已更改的Corefile。编辑ConfigMap配置后,请等待两分钟,以使更改生效。详情请参见reload

    log

    扩展配置

    开启CoreDNS域名解析的日志。详情请参见log

    示例如下:

    {
       "name": "log"
    }

    template

    扩展配置

    设置快速应答模板,AAAA表示IPv6解析请求,rcode控制应答返回NXDOMAIN,即表示没有IPv6解析结果。详情请参见template

    示例如下:

    {
       "configBlock": "rcode NXDOMAIN",
       "name": "template",
       "parameters": "ANY AAAA" 
    }

  4. 设置插件实例的部署策略。

    • 调度策略对于DaemonSet类型的插件实例不会生效。
    • 设置多可用区部署或节点亲和策略时,需保证集群中存在满足调度策略的节点且拥有足够的资源,否则插件实例将无法运行。
    表4 插件调度配置

    参数

    参数说明

    多可用区部署

    • 优先模式:优先将插件的Deployment实例调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将调度到单可用区下的不同节点。
    • 均分模式:插件Deployment实例均匀调度到当前集群下各可用区,增加新的可用区后建议扩容插件实例以实现跨可用区高可用部署;均分模式限制不同可用区间插件实例数相差不超过1,单个可用区资源不足会导致后续其他实例无法调度。
    • 强制模式:插件Deployment实例强制调度到不同可用区的节点上,每个可用区下最多运行一个实例。如集群下节点不满足多可用区,插件实例将无法全部运行。节点故障后,插件实例存在无法迁移风险。

    节点亲和

    • 不配置:插件实例不指定节点亲和调度。
    • 指定节点调度:指定插件实例部署的节点。若不指定,将根据集群默认调度策略进行随机调度。
    • 指定节点池调度:指定插件实例部署的节点池。若不指定,将根据集群默认调度策略进行随机调度。
    • 自定义亲和策略:填写期望插件部署的节点标签实现更灵活的调度策略,若不填写将根据集群默认调度策略进行随机调度。

      同时设置多条自定义亲和策略时,需要保证集群中存在同时满足所有亲和策略的节点,否则插件实例将无法运行。

    容忍策略

    容忍策略与节点的污点能力配合使用,允许(不强制)插件的 Deployment 实例调度到带有与之匹配的污点的节点上,也可用于控制插件的 Deployment 实例所在的节点被标记污点后插件的 Deployment 实例的驱逐策略。

    插件会对实例添加针对node.kubernetes.io/not-readynode.kubernetes.io/unreachable污点的默认容忍策略,容忍时间窗为60s。

    详情请参见设置容忍策略

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

使用Corefile配置CoreDNS插件

安装CoreDNS插件时,不支持使用Corefile视图配置,仅编辑/升级场景支持使用Corefile视图配置。

  1. 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“插件中心”,在右侧找到CoreDNS域名解析插件,单击“编辑”
  2. 在“参数配置”中,选择是否切换Corefile视图(1.30.3及以上版本的插件支持)。

    切换后将通过Corefile格式直接配置kube-system命名空间下的CoreDNS的ConfigMap,且已有的存根域配置和高级配置内 parameterSyncStrategy/servers/upstream_nameservers等参数均不再生效,您需要自行保证Corefile配置的正确性。

    关于Corefile格式的说明请参考如何配置Corefile

    • 关闭Corefile视图后,依旧会以存根域配置和高级配置内 parameterSyncStrategy/servers/upstream_nameservers 等参数配置CoreDNS的配置项,切换时需要保证配置的合理性。
    • 开启Corefile视图后更新/升级插件,再次关闭Corefile视图更新/升级插件,插件更新会拦截当前的配置,需要将 parameterSyncStrategy设置为force或者inherit策略后才能完成升级。
    • 修改Corefile配置项后,需要等待CoreDNS内部的Reload机制自动完成配置刷新(约在十秒内配置生效)。

  3. 完成Corefile编辑后,单击“确定”

组件说明

表5 coredns组件

容器组件

说明

资源类型

coredns

该容器为提供集群域名解析服务的DNS服务器。

Deployment

Kubernetes中的域名解析逻辑

DNS策略可以在每个pod基础上进行设置,目前,Kubernetes支持DefaultClusterFirstClusterFirstWithHostNetNone四种DNS策略,具体请参见Service与Pod的DNS。这些策略在pod-specific的dnsPolicy字段中指定。

  • “Default”:如果dnsPolicy被设置为“Default”,则名称解析配置将从pod运行的节点继承。 自定义上游域名服务器和存根域不能够与这个策略一起使用。
  • “ClusterFirst”:如果dnsPolicy被设置为“ClusterFirst”,任何与配置的集群域后缀不匹配的DNS查询(例如,www.kubernetes.io)将转发到从该节点继承的上游名称服务器。集群管理员可能配置了额外的存根域和上游DNS服务器。
  • “ClusterFirstWithHostNet”:对于使用hostNetwork运行的Pod,您应该明确设置其DNS策略“ClusterFirstWithHostNet”。
  • “None”:它允许Pod忽略Kubernetes环境中的DNS设置。应使用dnsConfigPod规范中的字段提供所有DNS设置 。
  • Kubernetes 1.10及以上版本,支持Default、ClusterFirst、ClusterFirstWithHostNet和None四种策略;低于Kubernetes 1.10版本,仅支持default、ClusterFirst和ClusterFirstWithHostNet三种。
  • “Default”不是默认的DNS策略。如果dnsPolicy的Flag没有特别指明,则默认使用“ClusterFirst”。

路由请求流程:

未配置存根域:没有匹配上配置的集群域名后缀的任何请求,例如 “www.kubernetes.io”,将会被转发到继承自节点的上游域名服务器。

已配置存根域:如果配置了存根域和上游DNS服务器,DNS查询将基于下面的流程对请求进行路由:

  1. 查询首先被发送到coredns中的DNS缓存层。
  2. 从缓存层,检查请求的后缀,并根据下面的情况转发到对应的DNS上:
    • 具有集群后缀的名字(例如“.cluster.local”):请求被发送到coredns。
    • 具有存根域后缀的名字(例如“.acme.local”):请求被发送到配置的自定义DNS解析器(例如:监听在 1.2.3.4)。
    • 未能匹配上后缀的名字(例如“widget.com”):请求被转发到上游DNS。
图1 路由请求流程

版本记录

表6 CoreDNS域名解析插件版本记录

插件版本

支持的集群版本

更新特性

社区版本

1.30.6

v1.21

v1.23

v1.25

v1.27

v1.28

v1.29

v1.30

  • 支持Corefile配置
  • 适配CCE v1.30集群

1.10.1

1.29.5

v1.21

v1.23

v1.25

v1.27

v1.28

v1.29

修复部分问题

1.10.1

1.29.4

v1.21

v1.23

v1.25

v1.27

v1.28

v1.29

适配CCE v1.29集群

1.10.1

1.28.7

v1.21

v1.23

v1.25

v1.27

v1.28

支持插件热更新配置,无需滚动升级

1.10.1

1.28.5

v1.21

v1.23

v1.25

v1.27

v1.28

修复部分问题

1.10.1

1.28.4

v1.21

v1.23

v1.25

v1.27

v1.28

适配CCE v1.28集群

1.10.1

1.27.4

v1.19

v1.21

v1.23

v1.25

v1.27

-

1.10.1

1.25.14

v1.19

v1.21

v1.23

v1.25

  • 支持插件规格与集群规格联动
  • 插件与节点时区一致

1.10.1

1.25.11

v1.19

v1.21

v1.23

v1.25

  • 支持插件实例AZ反亲和配置
  • 升级至社区版本 1.10.1

1.10.1

1.25.1

v1.19

v1.21

v1.23

v1.25

适配CCE v1.25集群

1.8.4

1.23.3

v1.15

v1.17

v1.19

v1.21

v1.23

插件依赖例行升级

1.8.4

1.23.2

v1.15

v1.17

v1.19

v1.21

v1.23

插件依赖例行升级

1.8.4

1.23.1

v1.15

v1.17

v1.19

v1.21

v1.23

适配CCE v1.23集群

1.8.4

1.17.15

v1.15

v1.17

v1.19

v1.21

适配CCE v1.21集群

1.8.4

1.17.9

v1.15

v1.17

v1.19

插件依赖例行升级

1.8.4

1.17.7

v1.15

v1.17

v1.19

同步至社区v1.8.4版本

1.8.4

1.17.4

v1.17

v1.19

适配CCE v1.19集群

1.6.5

1.17.3

v1.17

支持v1.17集群,修复存根域配置问题

1.6.5

1.17.1

v1.17

支持v1.17集群

1.6.5