更新时间:2024-12-04 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. 在安装插件页面,设置“规格配置”

    表1 CoreDNS插件规格配置

    参数

    参数说明

    实例数

    插件实例的副本数量。

    实例数为1时插件不具备高可用能力,当插件实例所在节点异常时可能导致插件功能无法正常使用,请谨慎选择。

    容器

    CoreDNS所能提供的域名解析QPS与CPU消耗成正相关,集群中的节点/容器数量增加时,CoreDNS实例承受的压力也会同步增加。请根据集群的规模,合理调整插件实例数和容器CPU/内存配额,配置建议请参见表2

    表2 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. 设置插件支持的“参数配置”

    表3 CoreDNS插件参数配置

    参数

    参数说明

    存根域设置

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

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

    高级配置

    • parameterSyncStrategy:插件升级时是否配置一致性检查。
      • ensureConsistent:表示启用配置一致性检查,如果集群中记录的配置和实际生效配置不一致,插件将无法升级。
      • force:表示升级时忽略配置一致性检查。请您自行确保当前生效配置和原配置一致。插件升级完毕后,需恢复parameterSyncStrategy值为ensureConsistent,重新启用配置一致性检查。
      • inherit:表示升级时自动继承差异配置。插件升级完毕后,需恢复parameterSyncStrategy值为ensureConsistent,重新启用配置一致性检查。
    • stub_domains:存根域,您可对自定义的域名配置域名服务器,格式为一个键值对,键为DNS后缀域名,值为一个或一组DNS IP地址。
    • upstream_nameservers:上游域名服务器地址。
    • servers: CoreDNS 1.23.1插件版本开始开放servers配置,用户可对servers做定制化配置,详情请参见dns-custom-nameservers
      其中plugins为CoreDNS中各组件配置。一般场景建议保持默认配置,以免出现配置错误而导致CoreDNS整体不可用。每个plugin组件可包含"name"、"parameters"(可选)、"configBlock"(可选)配置,对应生成的Corefile配置文件中格式如下:
      $name  $parameters {
      $configBlock
      }

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

      示例:

      {
           "servers": [
      		   {
      			"plugins": [
      				{
      					"name": "bind",
      					"parameters": "{$POD_IP}"
      				},
      				{
      					"name": "cache",
      					"parameters": 30
      				},
      				{
      					"name": "errors"
      				},
      				{
      					"name": "health",
      					"parameters": "{$POD_IP}:8080"
      				},
                                      {
      					"name": "ready",
      					"{$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": "."
      				}
      			]
      		}
      	],
      	"stub_domains": {
      		"acme.local": [
      			"1.2.3.4",
      			"6.7.8.9"
      		]
      	},
      	"upstream_nameservers": ["8.8.8.8", "8.8.4.4"]
      }
    表4 CoreDNS主zone默认plugin配置说明

    plugin名称

    描述

    bind

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

    cache

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

    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数据接口,默认zone侦听{$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类型的插件实例不会生效。
    • 设置多可用区部署或节点亲和策略时,需保证集群中存在满足调度策略的节点且拥有足够的资源,否则插件实例将无法运行。
    表5 插件调度配置

    参数

    参数说明

    多可用区部署

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

    节点亲和

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

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

    容忍策略

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

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

    详情请参见容忍策略

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

组件说明

表6 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 路由请求流程