一、coredns的域名解析流程
CoreDNS 是一个 Go 语言编写的灵活可扩展的 DNS 服务器,在 Kubernetes 中,作为一个服务发现的配置中心,在 Kubernetes 中创建的 Service 和 Pod 都会在其中自动生成相应的 DNS 记录。
Kubernetes 服务发现的特性,使 CoreDNS 很适合作为企业云原生环境的 DNS 服务器,保障企业容器化和非容器化业务服务的稳定运行。
解析流程:
- pod1访问网站或者其他服务;
- pod1根据 resolv.conf 向 kube-dns service 发起 dns 解析请求;
- kube-dns 将请求转发给 coredns 集群中的任意一个节点;
- coredns 向 k8s 发起调用 etcd 内的记录资源请求;
- k8s 从etcd 集群中调出相关解析记录,并回传给 coredns;
- coredns 将解析结果通过 kube-dns 回传给 pod1;
- pod1 根据解析结果访问相关网站或者服务。
二、Corefile配置
在 k8s 集群中用一下命令查看 coredns corefile 配置:
kubectl get configmap coredns -n kube-system -o yaml
.:53 {
errors
health {
lameduck 5s
}
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 {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
配置解释:
- errors:错误信息标准输出;
- health:开启 coredns 服务的健康报告,URL为 http://localhost:8080/health;
- ready:监听8181端口,当coredns所有插件准备就绪时,访问该接口会返回200 OK;
- kubernetes:指明 cluster.local 后缀的域名都是 kubernetes 内部域名,coredns 会监听 service 的变化来维护域名关系,所以 cluster.local 相关域名都在这里解析;
- prometheus:coredns 的度量指标数据以 prometheus 的 key-value 的格式在 http://localhost:9153/metrics URI上提供;
- forward:非 kubernetes 集群中的其他任何域名查询都将转发到,指定的目的 server,如/etc/resolv.conf 或者IP(如8.8.8.8);
- cache:启用 service 解析缓存,单位是秒;
- loop:检测域名解析是否有死循环,如 coredns 转发给内网DNS服务器,而内网服务器又转发给 coredns,如果发现存在死循环,则强制终止 coredns 进程(kubernetes会重建);
- reload:检测 corefile(coredns.yaml)是否更改,在修改 configmap 配置后,默认2分钟后会优雅的自动加载;
- loadbalance:轮询 DNS 域名解析,如果一个域名存在多个记录则轮询解析;