k8s 集群内的 DNS 服务:
https://github.com/kubernetes/dns
coredns 并不是默认的 DNS 服务,但是它作为 K8S 的 DNS 插件的功能已经 GA 。
CoreDNS 在 K8S 1.13 版本中才正式成为 默认的 DNS 服务
coredns 官方网址:
https://coredns.io/
coredns 内置插件:
https://coredns.io/plugins/
core 第三方插件:
https://coredns.io/explugins/
自己写插件:
https://coredns.io/2016/12/19/writing-plugins-for-coredns/
使用 kubeadm 创建集群时候 kubeadm init 可以传递 --feature-gates 参数,用于启用一些额外的特性
在之前版本中,我们可以通过 kubeadm init --feature-gates CoreDNS=true 在创建集群时候启用 CoreDNS。
而在 1.11 版本中,使用 kubeadm 创建集群时 CoreDNS 已经被默认启用,这也从侧面证明了 CoreDNS 在 K8S 中达到了生产可用的状态
查看 CoreDNS 的扩展
1 | // 主要是为了兼容 K8S 原有的 kube-dns 所以标签和 Service 的名字都还使用了 kube-dns,但实际在运行的则是 CoreDNS |
使用 AlpineLinux 的镜像创建一个 Pod 并进入其中
1 | kubectl run alpine -it --rm --restart='Never' --image='alpine' sh |
注意:
1 | 域名解析是可跨 Namespace 的, 是全局的, 但不代表网络互通 |
配置和监控
CoreDNS 使用 ConfigMap 的方式进行配置,但是如果更改了配置,Pod 重启后才会生效
查看配置:
1 | kubectl -n kube-system get configmap coredns -o yaml |
Corefile 便是它的配置文件,可以看到它启动了类似 kubernetes, prometheus 等插件。
注意 kubernetes 插件的配置,使用的域是 cluster.local ,这也是上面我们提到域名格式时候后半部分未解释的部分。
至于 prometheus 插件,则是监听在 9153 端口上提供了符合 Prometheus 标准的 metrics 接口,可用于监控等。
使用 CoreDNS 代替 kube-dns 主要是为了解决一些 kube-dns 时期的问题,比如说原先 kube-dns 的时候,一个 Pod 中还需要包含 kube-dns, sidecar 和 dnsmasq 的容器,而每当 dnsmasq 出现漏洞时,就不得不让 K8S 发个安全补丁才能进行更新。
CoreDNS 有丰富的插件,可以满足更多样的应用需求,同时 kubernetes 插件还包含了一些独特的功能,比如 Pod 验证之类的,可增加安全性。