kubernetes中的DNS
大约 4 分钟
CoreDns
官网地址:https://coredns.io/
Kubernetes DNS 服务: https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/dns-custom-nameservers/
kubectl get pods -l k8s-app=kube-dns -n kube-system
## 查看多个Pod中的日志信息
for p in $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name); do kubectl logs --namespace=kube-system $p; done
配置示例
.:53 {
errors
health {
lameduck 5s
}
ready
## 自定义 hosts 解析特定域名
192.168.10.151 www.test.com
## 内部域名替换外部域名
rewrite stop {
name regex (.*)\.mgmt\.pix\.yun\.com {1}.default.svc.cluster.local
answer name (.*)\.default\.svc\.cluster\.local {1}.mgmt.pix.yun.com
}
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
## 特定 DNS 服务器解析所有域名
forward . 192.168.10.8
# forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
## 特定 DNS 服务器解析特定域名
example.com:53 {
errors
cache 30
forward . /etc/resolv.conf
}
- CoreDNS配置详解
参数 | 说明 |
---|---|
errors | 打印/存储错误日志 |
health | CoreDNS自身健康状态报告,默认监听端口8080,一般用来做健康检查。您可以通过http://localhost:8080/health获取健康状态(coredns Pod配置的存活探针使用此接口获取CoreDNS自身健康)。 |
ready | CoreDNS插件状态报告,默认监听端口8181,一般用来做可读性检查。可以通过http://localhost:8181/ready获取可读状态。当所有插件都运行后,ready状态为200(coredns Pod配置的就绪探针使用此接口获取CoreDNS插件的就绪状况)。 |
kubernetes | kubernetes: CoreDNS Kubernetes插件,提供集群内服务解析能力。该插件实现了基于Kubernetes DNS的服务发现。其中cluster.local in-addr.arpa ip6.arpa表示kubernetes插件会处理域名后缀为cluster.local的所有域名以及处理所有的in-addr.arpa中的反向dns查找和ip6.arpa形式域名,其中kubernetes集群域名后缀是在kubelet参数中配置的,默认值为cluster.local。pods参数用于设置基于pods ip的A记录,例如default namespace下存在一个pod,ip为10.233.64.2,此Pod的A记录为10-233-64-2.default.pod.cluster.local ->10.233.64.2,pods参数有三个值,其中disabled表示关闭pod ip的A记录;insecure总是从请求中返回一个带有IP的A记录(不检查k8s)(例如:1-2-3-4.ns.pod.cluster.local. in A 1.2.3.4);verified表示如果在同一命名空间中,则存在匹配IP的pod。fallthrough:指定特定区域查询失败,如果in-addr.arpa和ip6.arpa形式的域名在kubernetes插件没有匹配成功的话则进入下一个 plugin 继续。ttl参数为响应客户端请求设置的自定义 TTL。 更多参数配置见:https://coredns.io/plugins/kubernetes/ |
hosts | 加载 /etc/hosts 文件里面的解析信息。如果一个域名在 hosts 文件中存在,则优先使用这个信息返回,在本例中一定要注意hosts插件的位置,如果放在了forward插件之后,那么hosts插件即没有匹配的机会; |
prometeus | CoreDNS自身metrics数据接口。可以通过http://localhost:9153/metrics获取prometheus格式的监控数据。 |
forward | 将域名查询请求转到预定义的DNS服务器。默认配置中,当域名不在Kubernetes域时,将请求转发到预定义的解析器(/etc/resolv.conf)中。默认使用宿主机的/etc/resolv.conf配置。forward . /etc/resolv.conf中的"."表示匹配所有域名。 |
cache | 溯源得到的结果,缓存指定时间。类似 TTL 的概念;TTL以秒为单位。如果未指定,将使用最大 TTL,对于 NOERROR 响应为 3600,对于拒绝存在响应为 1800。将 TTL 设置为 30表示缓存记录长达 30 秒。 |
loop | 环路检测,如果检测到环路,则停止CoreDNS。例如,forward . /etc/resolv.conf中配置的dns server地址和coredns地址一致,客户端请求解析in-addr.arpa类型域名,在kubernetes插件中解析in-addr.arpa类型域名失败,由于配置了fallthrough in-addr.arpa ip6.arpa,那么就会进入到forward插件继续解析,由于forward . /etc/resolv.conf中配置的dns server地址和coredns地址一致,那么又会传到dns server进行解析,这么就陷入了一个死循环,通过loop插件可以避免环路问题。 |
reload | 允许自动重新加载已更改的Corefile。编辑ConfigMap配置后,请等待两分钟以使更改生效,无需重启coredns对应的Pod。 |
loadbalance | 循环DNS负载均衡器,可以在答案中随机A、AAAA、MX记录的顺序。 |
DNS 调试
## ContOS
yum -y install bind-utils
nslookup www.example.com 192.168.10.8
pod测试DNS
# kubectl run busybox --restart=Never --image-pull-policy=Never --image=docker.devops.tr/backup/busybox:latest -- sleep 3600
kubectl run busybox --restart=Never --image=busybox -- sleep 3600
kubectl get pod
kubectl exec busybox -- nslookup docker.devops.kk
kubectl delete pod busybox
external-dns(没搞定)
external-dns
目的是,将Kubernetes的Service/Ingress暴露的服务(的DNS记录)同步给外部的DNS Provider。
- bitnami chart: https://artifacthub.io/packages/helm/bitnami/external-dns
- https://github.com/kubernetes-sigs/external-dns
- https://github.com/JasonvanBrackel/kubernetes-external-dns-in-rancher
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm search repo bitnami/external-dns
helm pull bitnami/external-dns
## 部署
helm install dns-external bitnami/external-dns --version 6.13.2 \
--set clusterDomain=cluster.local \
--set provider=coredns \
--set coredns.etcdEndpoints=http://192.168.10.91:2379 \
--set coredns.etcdTLS.enabled=true \
--set coredns.etcdTLS.autoGenerated=true \
--set sources="{service,ingress}" \
--set policy=sync \
--namespace=kube-devops --create-namespace
## 检查资源
kubectl get pod,deployment,service,secret,configmap -n kube-devops
## 查看并删除
helm list -n kube-devops
helm uninstall dns-external -n kube-devops
## 测试
kubectl run busybox --restart=Never --image=busybox -- sleep 3600
kubectl get pod
kubectl exec busybox -- nslookup docker.devops.kk
kubectl delete pod busybox
## 其他
dig +short docker.devops.kk.