kubernetes 的 CoreDNS 配置及插件说明


# plugins for CoreDNS : https://coredns.io/plugins/
# CoreDNS 是模块化且可插拔的,每个插件都为其添加了新功能,可通过Corefile,即CoreDNS的配置文件来定制其行为
# 集群管理员通过修改 Corefile 所属的 ConfigMap 来实现更改 CoreDNS 的工作方式 ...
# 最基本的功能包括: 正反向查找、端口发现 (SRV)、IP发现 (PTR) 等 ...
# 在它的配置文件中注释以开 # 头,并且支持引用环境变量: {$ENV_VAR} 

# ---------------------------------------------------------- Corefile
 
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:                               # zone 的 {} 内每个对象都是一个Plugin ...
  Corefile: |                       # Plugins Doc: https://coredns.io/plugins
    .:53 {                          # https://coredns.io/manual/toc/#server-blocks
        errors                      # 错误记录到标准输出
        health                      # 在 http://localhost:8080/health 处提供健康报告 (若实例健康则返回OK)
        ready                       # 在 8181 端口上提供的HTTP,当所有能表达自身就绪的插件都已就绪时会返回 200
        log                         # 记录日志 

        # https://coredns.io/plugins/kubernetes
        # 根据kubernetes集群中的服务、POD_IP响应DNS查询
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure            # 用于向后兼容 kube-dns
           namespaces xxx xxx       # 仅公开列出的命名空间,若省略此选项则会公开所有的名称空间   
           fallthrough in-addr.arpa ip6.arpa
           ttl 5s                   # 默认5s,可选范围: 0~3600s,当为0时可禁止对DNS记录进行缓存
        }
        prometheus :9153            # 基于普罗米修斯的度量接口: http://localhost:9153/metrics
        forward . 8.8.8.8:53 /etc/resolv.conf    # 将任何不在 Kubernetes 域内的查询转发到预定义的解析器 ...
        cache 30                    # 启用外部请求的缓存,允许缓存2个响应结果: 肯定和否定结果,具有单独的高速缓存和TTL
        loop                        # 检测简单的转发循环,若发现循环则停止CoreDNS进程 ...
        reload                      # 允许自动重载已更改的Corefile,修改ConfigMap后请等待2分钟
        loadbalance                 # 轮转式DNS负载均衡器,可在应答中随机分配 A、AAAA、MX 记录顺序随机化 ...
    }

  # stubDomains: |
  #   {"acme.local": ["1.2.3.4"]}     # 有".acme.local"后缀的DNS请求将被转发到位于1.2.3.4的DNS
  # upstreamNameservers: |
  #   ["8.8.8.8", "8.8.4.4"]          # 如果指定则这些值将会替换默认情况下从宿主节点 /etc/resolv.conf 中获取的域名服务

# ---------------------------------------------------------- Example

# 如果集群运营商的Consul域服务器为10.150.0.1,并且域内名称都有后缀 .consul.local
# 即:有些服务不在kubernetes内部但又要在集群内部环境通过CoreDNS去解析时 ...
consul.local:53 {
    errors
    cache 30
    forward . 10.150.0.1
}

# ---------------------------------------------------------- forward

# https://coredns.io/plugins/forward
# 将所有命中 CoreDNS 的查询都转发到 8.8.8.8、9.9.9.9
. { 
    forward . 8.8.8.8 9.9.9.9
    log     # 记录日志
            # 默认格式为: `{remote}:{port} - {>id} "{type} {class} \
            # {name} {proto} {size} {>do} {>bufsize}" {rcode} {>rflags} {rsize} {duration}`
}

# ---------------------------------------------------------- import

# 引入文件到主配置中,另一个用途是引用预定义的代码片段,两者都可以帮助避免重复
cat > config/common.conf <'EOF'
prometheus
errors
log
EOF

# 导入共享配置
. {
   import config/common.conf
}

# 下例将导入在zones目录中找到的文件 ...
import ../zones/*

# ---------------------------------------------------------- stubDomains and upstreamNameservers

# 该例使用forward插件实现一个stubDomain来转发example.local到nameserver: 10.100.0.10:53
# 上游名称服务器 8.8.8.8:53 用于解析不属于cluster.local、example.local的名称

cluster.local:53 {
    kubernetes cluster.local
}
example.local {
    forward . 10.100.0.10:53
}

. {
    forward . 8.8.8.8:53
}

# ----------------------------------------------------------

# 带有默认插件的完整 Corefile ...
.:53 {
    errors
    health
    kubernetes cluster.local in-addr.arpa ip6.arpa {
       pods insecure
       fallthrough in-addr.arpa ip6.arpa
    }
    federation cluster.local {
       foo foo.feddomain.com
    }
    prometheus :9153
    forward .  8.8.8.8 8.8.4.4
    cache 30
}
abc.com:53 {
    errors
    cache 30
    forward . 1.2.3.4
}
my.cluster.local:53 {
    errors
    cache 30
    forward . 2.3.4.5
}

# ---------------------------------------------------------- Kubelet 
# 部署CoreDNS之后需修改Kubelet的启动参数以告知DNS相关配置 ...

kubelet --cluster-dns=10.3.0.10 --cluster-domain=cluster.local. --resolv-conf=/etc/resolv.conf
# 1.指明CoreDNS的Cluster_IP
# 2.指明其默认所属的域(本地域)
# 3.当要为Pod使用其他DNS配置时将值设为 "" 可避免Pod继承DNS
#   将其设为有别于 /etc/resolv.conf 的有效文件路径可设定DNS继承不同的配置

dnsConfig & dnsPolicy - template.spec.{dnsConfig,dnsPolicy}.*

# https://kubernetes.io/docs/concepts/services-networking/dns-pod-service
apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: dns-example
spec:
  containers:
    - name: test
      image: nginx
  dnsPolicy: "None"                     # 默认为 ClusterFirst
           # "default"                  则从POD所在节点的配置中继承名称解析配置(与宿主机相同)
           # "ClusterFirst"             表示集群DNS优先
           # "ClusterFirstWithHostNet"  表示集群DNS优先,并伴随着使用宿主机网络(如当: HostNetwork:true 时需设置)
           # "None"                     表示无任何策略
           # 注: 当设置 hostNetwork = true 时 ClusterFirst 会被强制转化为 Default
  dnsConfig:                            # 当POD模板 dnsPolicy:None 时需用dnsConfig手动配置DNS (/etc/resolv.conf)
	  nameservers:                        # 作用于POD的DNS服务器的IP列表,最多可指定3个IP 
      - 1.2.3.4                         # DNS地址
    searches:                           # 用于在POD中查找主机名的DNS搜索域的列表,最多允许6个搜索域
      - ns1.svc.cluster-domain.example  # 
      - my.dns.search.suffix            # 
    options:                            # 在 /etc/resolv.conf 中可设置的DNS参数 
      - name: ndots
        value: "2"
      - name: edns0

# -------------------------- result: /etc/resolv.conf

# nameserver 1.2.3.4
# search ns1.svc.cluster-domain.example my.dns.search.suffix
# options ndots:2 edns0

# 默认情况下Pod内的DNS搜索列表将包含其自身所处的 Namespace 和集群的默认域 ...
# 假设在集群的命名空间 bar 中定义了服务 foo,运行在该空间中的Pod可以简单的通过DNS查询 foo 找到该 Service
# 运行在集群的命名空间 qux 中的Pod也可以通过DNS查询 foo.bar 的方式找到该 Service ...

引入 /etc/hosts文件到CoreDNS

# 定义: https://coredns.io/plugins/hosts/
echo 'fdfc:a744:27b5:3b0e::1  example.com example' > ./example.hosts

# 引入
. {
    hosts example.hosts
    reload 300ms
    ttl 3600
}

引入区域文件到 CoreDNS 中进行权威服务

# 最后两行定义 www.example.org. 具有两个地址: 127.0.0.1、:: 1
cat > db.example.org <<'EOF'
$ORIGIN example.org.
@	3600 IN	SOA sns.dns.icann.org. noc.dns.icann.org. (
				2017042745 ; serial
				7200       ; refresh (2 hours)
				3600       ; retry (1 hour)
				1209600    ; expire (2 weeks)
				3600       ; minimum (1 hour)
				)

	3600 IN NS a.iana-servers.net.
	3600 IN NS b.iana-servers.net.

www     IN A     127.0.0.1
        IN AAAA  ::1
EOF

# Corefile 中新增如下配置段 ...
example.org {
    file db.example.org
    log
}

# 启动 CoreDNS 并使用 dig 验证
$ dig www.example.org AAAA
# www.example.org.    3600    IN  AAAA    ::1

CoreDNS …

# POD                   
Auto-generated-name.<service_name>.<namespace>.svc.cluster.local. ( 默认禁用 )

# Service            
<service_name>.<namespace>.svc.cluster.local

# headless Service (返回IP列表)          
<service_name>.<namespace>.svc.cluster.local

# 对于常规服务将解析为端口号和CNAME  
<service_name>.<namespace>.svc.cluster.local

# 针对正常或无头服务的端口创建的SRV记录 (命名端口需要创建SRV记录)
_my-port-name._my-port-protocol.<service_name>.<namespace>.svc.cluster.local

# Pod created by a deployment exposed as a service
pod-ip-address.deployment-name.<namespace>.svc.cluster.local

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值