# 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继承不同的配置
# 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 ...
# 定义: https://coredns.io/plugins/hosts/
echo 'fdfc:a744:27b5:3b0e::1 example.com example' > ./example.hosts
# 引入
. {
hosts example.hosts
reload 300ms
ttl 3600
}
# 最后两行定义 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
# 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