coredns

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
2
// 主要是为了兼容 K8S 原有的 kube-dns 所以标签和 Service 的名字都还使用了 kube-dns,但实际在运行的则是 CoreDNS
kubectl -n kube-system get all -l k8s-app=kube-dns -o wide

使用 AlpineLinux 的镜像创建一个 Pod 并进入其中

1
2
3
4
kubectl run alpine -it --rm --restart='Never' --image='alpine' sh
apk add --no-cache bind-tools
# 安装完 dig 命令所在包之后,使用 dig 命令进行验证
/ # dig @10.32.0.2 saythx-redis.work.svc.cluster.local +noall +answer

注意:

1
2
3
4
域名解析是可跨 Namespace 的, 是全局的, 但不代表网络互通
域名有特定格式
可以看到刚才我们使用的完整域名是 saythx-redis.work.svc.cluster.local , 注意开头的便是 Service 名.Namespace 名 当然,我们也可以直接通过 host 命令查询:
host -t srv saythx-redis.work

配置和监控

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 验证之类的,可增加安全性。