kubernetes的dns

2021-12-17 22:49:38 浏览数 (1)

概述

作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,那么就需要一个集群范围内的DNS服务来完成从服务名到ClusterIP的解析。

DNS服务在kubernetes中经历了三个阶段。

第一阶段,在kubernetes

1.2版本时,dns服务使用的是由SkyDNS提供的,由4个容器组成:kube2sky、skydns、etcd和healthz。etcd存储dns记录;kube2sky监控service变化,生成dns记录;skydns读取服务,提供查询服务;healthz提供健康检查

第二阶段,在kubernetes

1.4版本开始使用kubedns,有3个容器组成:kubedns、dnsmasq和sidecar。kubedns监控service变化,并记录到内存(存到内存提高性能)中;dnsmasq获取dns记录,提供dns缓存,提供dns查询服务;sidecar提供健康检查。

第三阶段,从kubernetes 1.11版本开始,dns服务有coredns提供,coredns支持自定义dns记录及配置upstream dns

server,可以统一管理内部dns和物理dns。coredns只有一个coredns容器。下面是coredns的架构

coredns.png

coredns配置解析

下面是coredns的配置模板

代码语言:txt复制
.:53 {
代码语言:txt复制
        errors
代码语言:txt复制
        health {
代码语言:txt复制
           lameduck 5s
代码语言:txt复制
        }
代码语言:txt复制
        ready
代码语言:txt复制
        kubernetes cluster.local in-addr.arpa ip6.arpa {
代码语言:txt复制
           pods insecure
代码语言:txt复制
           fallthrough in-addr.arpa ip6.arpa
代码语言:txt复制
           ttl 30
代码语言:txt复制
        }
代码语言:txt复制
        hosts {
代码语言:txt复制
           172.23.1.3   hub.kellan.com
代码语言:txt复制
           fallthrough
代码语言:txt复制
        }
代码语言:txt复制
        prometheus :9153
代码语言:txt复制
        forward . /etc/resolv.conf {
代码语言:txt复制
           max_concurrent 1000
代码语言:txt复制
        }
代码语言:txt复制
        cache 30
代码语言:txt复制
        loop
代码语言:txt复制
        reload
代码语言:txt复制
        loadbalance
代码语言:txt复制
    }

coredns的主要功能是通过插件系统实现的。它实现了一种链式插件的结构,将dns的逻辑抽象成了一个个插件。常见的插件如下:

  • loadbalance:提供基于dns的负载均衡功能
  • loop:检测在dns解析过程中出现的简单循环问题
  • cache:提供前端缓存功能
  • health:对Endpoint进行健康检查
  • kubernetes:从kubernetes中读取zone数据
  • etcd:从etcd读取zone数据,可以用于自定义域名记录
  • file:从文件中读取zone数据
  • hosts:使用/etc/hosts文件或者其他文件读取zone数据,可以用于自定义域名记录
  • auto:从磁盘中自动加载区域文件
  • reload:定时自动重新加载Corefile配置文件的内容
  • forward:转发域名查询到上游dns服务器
  • proxy:转发特定的域名查询到多个其他dns服务器,同时提供到多个dns服务器的负载均衡功能
  • prometheus:为prometheus系统提供采集性能指标数据的URL
  • pprof:在URL路径/debug/pprof下提供运行是的西能数据
  • log:对dns查询进行日志记录
  • errors:对错误信息镜像日志记录
Pod的dns策略

上面已经描述了dns的服务端,那么pod有什么策略呢

目前的策略如下:

  • Default: 继承Pod所在宿主机的DNS设置
  • ClusterFirst:优先使用kubernetes环境的dns服务,将无法解析的域名转发到从宿主机继承的dns服务器
  • ClusterFirstWithHostNet:和ClusterFirst相同,对于以hostNetwork模式运行的Pod应明确知道使用该策略
  • None: 忽略kubernetes环境的dns配置,通过spec.dnsConfig自定义DNS配置undefined自定义Dns配置可以通过spec.dnsConfig字段进行设置,可以设置如下信息
代码语言:txt复制
* nameservers:一组dns服务器的列表,最多可设置3个
* searchs:一组用于域名搜索的dns域名后缀,最多6个
* options:配置其他可选参数,例如ndots、timeout等  例如:
代码语言:txt复制
spec:
代码语言:txt复制
  dnsPolicy: "None"
代码语言:txt复制
  dnsConfig:
代码语言:txt复制
    nameservers:
代码语言:txt复制
      - 1.2.3.4
    searchs:
      - xx.ns1.svc.cluster.local
      - xx.daemon.com
    options:
      - name: ndots
        values: "2"

pod被创建后,容器内的/etc/resolv.conf会根据这个信息进行配置

nodelocaldns

架构图如下

nodelocaldns

下面是nodelocaldns的configmap的示例

代码语言:txt复制
cluster.local:53 {
代码语言:txt复制
        errors
代码语言:txt复制
        cache {
代码语言:txt复制
            success 9984 30
代码语言:txt复制
            denial 9984 5
代码语言:txt复制
        }
代码语言:txt复制
        reload
代码语言:txt复制
        loop
代码语言:txt复制
        bind 169.254.25.10
代码语言:txt复制
        forward . 10.233.0.3 {
代码语言:txt复制
            force_tcp
代码语言:txt复制
        }
代码语言:txt复制
        prometheus :9253
代码语言:txt复制
        health 169.254.25.10:9254
代码语言:txt复制
    }
代码语言:txt复制
    in-addr.arpa:53 {
代码语言:txt复制
        errors
代码语言:txt复制
        cache 30
代码语言:txt复制
        reload
代码语言:txt复制
        loop
代码语言:txt复制
        bind 169.254.25.10
代码语言:txt复制
        forward . 10.233.0.3 {
代码语言:txt复制
            force_tcp
代码语言:txt复制
        }
代码语言:txt复制
        prometheus :9253
代码语言:txt复制
    }
代码语言:txt复制
    ip6.arpa:53 {
代码语言:txt复制
        errors
代码语言:txt复制
        cache 30
代码语言:txt复制
        reload
代码语言:txt复制
        loop
代码语言:txt复制
        bind 169.254.25.10
代码语言:txt复制
        forward . 10.233.0.3 {
代码语言:txt复制
            force_tcp
代码语言:txt复制
        }
代码语言:txt复制
        prometheus :9253
代码语言:txt复制
    }
代码语言:txt复制
    .:53 {
代码语言:txt复制
        errors
代码语言:txt复制
        cache 30
代码语言:txt复制
        reload
代码语言:txt复制
        loop
代码语言:txt复制
        bind 169.254.25.10
代码语言:txt复制
        forward . /etc/resolv.conf
代码语言:txt复制
        prometheus :9253
代码语言:txt复制
    }

可以看到配置和coredns是相仿的,就不再赘述。

但是这里要进一步说明下,通过配置可以看出除了cluster.local(即kubernetes集群的解析)外都使用节点的/etc/resolv.conf文件的nameserver。如果将自定义解析加到coredns上是没有效果的,所以需要修改nodelocaldns的配置,将其他域名的解析转到coredns上才行。

代码语言:txt复制
  #forward . /etc/resolv.conf
代码语言:txt复制
  forward . 10.233.0.3 {
代码语言:txt复制
            force_tcp
代码语言:txt复制
        }

0 人点赞