# 场景说明
使用 dnsPolicy: ClusterFirst
策略。示例配置如下:
apiVersion: v1 | |
kind: Pod | |
metadata: | |
name: alpine | |
namespace: default | |
spec: | |
containers: | |
- image: alpine | |
command: | |
- sleep | |
- "10000" | |
imagePullPolicy: Always | |
name: alpine | |
dnsPolicy: ClusterFirst |
关于 dnsPolicy 配置和场景说明,请参见 DNS 原理和配置说明。
# CoreDNS 的默认配置
在命名空间 kube-system 下,ACK 集群有一个 CoreDNS 配置项(有关如何查看配置项的具体步骤,请参见管理配置项)。CoreDNS 会基于该配置项启用和配置插件。不同 CoreDNS 版本的配置项有略微差异,修改配置前请仔细阅读 CoreDNS 官方文档。以下是一个 1.6.2 版本 CoreDNS 默认采用的配置文件:
Corefile: | | |
.:53 { | |
errors | |
log | |
health { | |
lameduck 15s | |
} | |
ready | |
kubernetes <!--swig0--> in-addr.arpa ip6.arpa { | |
pods verified | |
fallthrough in-addr.arpa ip6.arpa | |
} | |
prometheus :9153 | |
forward . /etc/resolv.conf { | |
prefer_udp | |
} | |
cache 30 | |
loop | |
reload | |
loadbalance | |
} |
说明 配置文件中 ClusterDomain
代指集群创建过程中填写的集群本地域名,默认值为 cluster.local
。
参数 | 描述 |
---|---|
errors | 错误信息到标准输出。 |
health | CoreDNS 自身健康状态报告,默认监听端口 8080,一般用来做健康检查。您可以通过 http://localhost:8080/health 获取健康状态。 |
ready | CoreDNS 插件状态报告,默认监听端口 8181,一般用来做可读性检查。可以通过 http://localhost:8181/ready 获取可读状态。当所有插件都运行后,ready 状态为 200。 |
kubernetes | CoreDNS Kubernetes 插件,提供集群内服务解析能力。 |
prometheus | CoreDNS 自身 metrics 数据接口。可以通过 http://localhost:9153/metrics 获取 prometheus 格式的监控数据。 |
forward(或 proxy) | 将域名查询请求转到预定义的 DNS 服务器。默认配置中,当域名不在 Kubernetes 域时,将请求转发到预定义的解析器(/etc/resolv.conf)中。默认使用宿主机的 /etc/resolv.conf 配置。 |
cache | DNS 缓存。 |
loop | 环路检测,如果检测到环路,则停止 CoreDNS。 |
reload | 允许自动重新加载已更改的 Corefile。编辑 ConfigMap 配置后,请等待两分钟以使更改生效。 |
loadbalance | 循环 DNS 负载均衡器,可以在答案中随机 A、AAAA、MX 记录的顺序。 |
# CoreDNS 的扩展配置
针对以下不同场景,您可以扩展 CoreDNS 的配置:
场景一:开启日志服务
如果需将 CoreDNS 每次域名解析的日志打印出来,您可以开启 Log 插件,在 Corefile 里加上 log。示例配置如下:
Corefile: |
.:53 {
errors
log
health {
lameduck 15s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
prefer_udp
}
cache 30
loop
reload
loadbalance
}
场景二:特定域名使用自定义 DNS 服务器
如果 example.com 类型后缀的域名需要经过自建 DNS 服务器(IP 为 10.10.0.10)进行解析的话,您可为域名配置一个单独的服务块。示例配置如下:
example.com:53 {
errors
cache 30
forward . 10.10.0.10
prefer_udp
}
完整配置如下:
Corefile: |
.:53 {
errors
health {
lameduck 15s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
prefer_udp
}
cache 30
loop
reload
loadbalance
}
example.com:53 {
errors
cache 30
forward . 10.10.0.10
prefer_udp
}
场景三:外部域名完全使用自建 DNS 服务器
如果您需要使用的自建 DNS 服务的域名没有统一的域名后缀,您可以选择所有集群外部域名都使用自建 DNS 服务器(此时需要您将自建的 DNS 服务不能解析的域名转发到阿里云 DNS,禁止直接更改集群 ECS 上的 /etc/resolv.conf 文件)。例如,您自建的 DNS 服务器 IP 为 10.10.0.10 和 10.10.0.20,可以更改 forward 参数进行配置。示例配置如下:
Corefile: |
.:53 {
errors
health {
lameduck 15s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . 10.10.0.10 10.10.0.20{
prefer_udp
}
cache 30
loop
reload
loadbalance
}
场景四:自定义 Hosts
如果您需要为特定域名指定 hosts,如为 www.example.com 指定 IP 为 127.0.0.1,可以使用 Hosts 插件来配置。示例配置如下:
Corefile: |
.:53 {
errors
health {
lameduck 15s
}
ready
hosts {
127.0.0.1 www.example.com
fallthrough
}
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
prefer_udp
}
cache 30
loop
reload
loadbalance
}
重要 请配置 fallthrough,否则会造成非定制 Hosts 域名解析失败。
场景五:集群外部访问集群内服务
如果您希望运行在集群 ECS 上的进程能够访问到集群内的服务,虽然可以通过将 ECS 的 /etc/resolv.conf 文件内
nameserver
配置为集群 kube-dns 的 ClusterIP 地址来达到目的,但不推荐您直接更改 ECS 的 /etc/resolv.conf 文件的方式来达到任何目的。内网场景下,您可以将集群内的服务通过内网 SLB 进行暴露,然后在云解析 PrivateZone 控制台通过添加 A 记录到该 SLB 的内网 IP 进行解析。具体操作,请参见添加解析记录。
场景六:统一域名访问服务或是在集群内对域名的做 CNAME 解析
您可以实现在公网、内网和集群内部通过统一域名 foo.example.com 访问您的服务,原理如下:
集群内的服务
foo.default.svc.cluster.local
通过公网 SLB 进行了暴露,且有域名foo.example.com
解析到该公网 SLB 的 IP。集群内服务
foo.default.svc.cluster.local
通过内网 SLB 进行了暴露,且通过云解析 PrivateZone 在 VPC 内网中将foo.example.com
解析到该内网 SLB 的 IP。具体步骤,请参见上述场景四:自定义 Hosts。在集群内部,您可以通过 Rewrite 插件将
foo.example.com
CNAME 到
foo.default.svc.cluster.local
。示例配置如下:
Corefile: |
.:53 {
errors
health {
lameduck 15s
}
ready
rewrite stop {
name regex foo.example.com foo.default.svc.cluster.local
answer name foo.default.svc.cluster.local foo.example.com
}
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
prefer_udp
}
cache 30
loop
reload
loadbalance
}
场景七:禁止 CoreDNS 对 IPv6 类型的 AAAA 记录查询返回
当业务容器不需要 AAAA 记录类型时,可以在 CoreDNS 中将 AAAA 记录类型拦截,返回空(NODATA),以减少不必要的网络通信。示例配置如下:
Corefile: |
.:53 {
errors
health {
lameduck 15s
}
#新增以下一行Template插件,其它数据请保持不变。
template IN AAAA .
}