k8s学习笔记之CoreDNS
一、CoreDNS configMap配置参数及说明
主要讲解CoreDNS configMap及其他关键配置
部署文件(需要替换其中一些变量):https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/coredns/coredns.yaml.base
1.configMap配置
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
labels:
addonmanager.kubernetes.io/mode: EnsureExists
data:
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes __DNS__DOMAIN__ in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
2.配置参数说明
参数 |
描述 |
errors |
错误信息到标准输出。 |
health |
CoreDNS自身健康状态报告,默认监听端口8080,一般用来做健康检查。可以通过 |
ready |
CoreDNS插件状态报告,默认监听端口8181,一般用来做可读性检查。可以通过 |
kubernetes |
CoreDNS Kubernetes插件,提供集群内服务解析能力,基于kubernetes service name 进行DNS查询并返回记录给客户端 |
prometheus |
CoreDNS自身metrics数据接口。可以通过 |
forward(或proxy) |
将域名查询请求转到预定义的DNS服务器。默认配置中,当域名不在Kubernetes域时,将请求转发到预定义的解析器(/etc/resolv.conf)中。默认使用宿主机的/etc/resolv.conf配置。 |
cache |
DNS缓存,单位秒。 |
loop |
环路检测,如果检测到环路(cordns转发到其他DNS,其他DNS再转发到coredns),则停止CoreDNS。 |
reload |
允许自动重新加载已更改的Corefile。编辑ConfigMap配置后,默认等待两分钟后更改生效。 |
loadbalance |
轮询DNS解析记录,如果一个域名存在多个解析记录,可以抽取记录值随机响应,对A、AAAA、MX记录生效。 |
3.其他重要参数
service中:__DNS__SERVER__ :自定义 coredns svc的地址即DNS服务器地址
configMap中kubernetes cluster.local 自定义DNS解析与,如果修改则集群DNS完全解析域名如下:${SVC_NAME}.${NAMESPACE_NAME}.svc.${DNS_DOMAIN}
二、CoreDNS的扩展配置
以下为常见场景下CoreDNS配置
1.设置打印CoreDNS的解析日志,启用log插件,配置如下
Corefile: |
.:53 {
errors
log #在errors插件下添加log,2分钟后生效
health {
lameduck 15s
}
2.为指定域名配置转发
如example.com类型后缀的域名需要经过自建DNS服务器(IP为10.10.0.10)进行解析的话,可为域名配置一个单独的服务块。示例配置如下:
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
}
# 此处为新增内容(forward和proxy都可以)
example.com:53 {
errors
cache 30
forward . 10.10.0.10 {
prefer_udp
}
}
3.对集群外域名配置其他域名服务器
即将所有k8s集群外的域名解析转发到指定的服务器,如当前业务在阿里云,可以将k8s集群外的所有域名转发到阿里云公共DNS服务器,不使用宿主机上的/etc/resolv.conf配置,具体配置如下
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 { #10.10.0.10 10.10.0.20为自定义DNS服务器
prefer_udp
}
cache 30
loop
reload
loadbalance
}
4.自定义域名hosts
碰到过的实际场景:三方的域名突然失效,通过在CoreDNS中指定三方域名的IP实现业务正常运行,具体示例如下
Corefile: |
.:53 {
errors
health {
lameduck 15s
}
ready
#使用Hosts插件来配置,以下为新增
hosts {
127.0.0.1 www.example.com #为特定域名指定hosts,如为www.example.com指定IP为127.0.0.1
fallthrough #保留该指令,否则会导致其他域名解析失败
}
5.内网场景下,k8s集群外访问k8s集群内部域名
1.将svc暴露到集群外
2.使用阿里云PrivateZone添加A记录到保留的地址,如SLB
6.公网、内网下统一访问域名
1.将集群内服务foo.default.svc.cluster.local暴露到公网上,如SLB,并配置公网域名foo.example.com解析到该服务
2.集群内服务foo.default.svc.cluster.local暴露到内网上,如SLB,并配置Private Zone域名foo.example.com解析到该服务
3.在集群内部,通过Rewrite插件将foo.example.com CNAME到foo.default.svc.cluster.local。示例配置如下:
Corefile: |
.:53 {
errors
health {
lameduck 15s
}
ready
rewrite stop {
name exact foo.example.com foo.default.svc.cluster.local
answer name foo.default.svc.cluster.local foo.example.com
}
7.禁止对IPv6类型的AAAA记录查询返回
当业务容器不需要AAAA记录类型时,可以在CoreDNS中将AAAA记录类型拦截,返回空(NODATA),以减少不必要的网络通信。示例配置如下:
Corefile: |
.:53 {
errors
health {
lameduck 15s
}
#新增以下一行Template插件,其它数据请保持不变。
template IN AAAA .
}