Kubernetes(k8s)DNS(CoreDNS)介绍

打印 上一主题 下一主题

主题 831|帖子 831|积分 2493

目录

一、DNS服务概述

service发现是k8s中的一个重要机制,其基本功能为:在集群内通过服务名对服务进行访问,即需要完成从服务名到ClusterIP的解析。
k8s主要有两种service发现机制:环境变量和DNS。没有DNS服务的时候,k8s会采用环境变量的形式,但一旦有多个service,环境变量会变复杂,为解决该问题,我们使用DNS服务。
DNS服务在kubernetes中经历了三个阶段(SkyDNS-》KubeDNS-》CoreDNS):

  • 【第一阶段】在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配置解析

下面是coredns的配置模板
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: coredns
  5.   namespace: namespace-test
  6. data:
  7.   Corefile: |
  8.     .:53 {
  9.         errors
  10.         health
  11.         ready
  12.         kubernetes cluster.local  10.200.0.0/16 {
  13.           pods insecure
  14.           upstream 114.114.114.114
  15.           fallthrough in-addr.arpa ip6.arpa
  16.           namespaces namespace-test
  17.         }
  18.         prometheus :9153
  19.         forward . /etc/resolv.conf
  20.         cache 30
  21.         loop
  22.         reload
  23.         loadbalance
  24.     }
复制代码
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策略

1)Pod dns策略


  • Default: 继承Pod所在宿主机的DNS设置
  • ClusterFirst:优先使用kubernetes环境的dns服务,将无法解析的域名转发到从宿主机继承的dns服务器
  • ClusterFirstWithHostNet:和ClusterFirst相同,对于以hostNetwork模式运行的Pod应明确知道使用该策略
    None: 忽略kubernetes环境的dns配置,通过spec.dnsConfig自定义DNS配置
  • 自定义Dns配置可以通过spec.dnsConfig字段进行设置,可以设置如下信息

    • nameservers:一组dns服务器的列表,最多可设置3个
    • searchs:一组用于域名搜索的dns域名后缀,最多6个
    • options:配置其他可选参数,例如ndots、timeout等
      例如:

  1. spec:
  2.   dnsPolicy: "None"
  3.   dnsConfig:
  4.     nameservers:
  5.       - 1.2.3.4
  6.     searchs:
  7.       - xx.ns1.svc.cluster.local
  8.       - xx.daemon.com
  9.     options:
  10.       - name: ndots
  11.         values: "2"
复制代码
pod被创建后,容器内的/etc/resolv.conf会根据这个信息进行配置。
2)测试解析结果

之前安装k8s集群的时候就已经安装过CoreDNS,所以这里就不重复讲解安装了,不清楚的,看这里
创建nslookup服务
[code]$ cat >busybox.yaml

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

徐锦洪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表