kubernetes中的DNS

知识库容器技术kubernetes建设Kuberneteskubesphere大约 4 分钟

CoreDns

官网地址:https://coredns.io/open in new window

Kubernetes DNS 服务: https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/dns-custom-nameservers/open in new window

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打印/存储错误日志
healthCoreDNS自身健康状态报告,默认监听端口8080,一般用来做健康检查。您可以通过http://localhost:8080/health获取健康状态(corednsopen in new window Pod配置的存活探针使用此接口获取CoreDNS自身健康)。
readyCoreDNS插件状态报告,默认监听端口8181,一般用来做可读性检查。可以通过http://localhost:8181/ready获取可读状态。当所有插件都运行后,ready状态为200(corednsopen in new window Pod配置的就绪探针使用此接口获取CoreDNS插件的就绪状况)。
kuberneteskubernetes: 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/open in new window
hosts加载 /etc/hosts 文件里面的解析信息。如果一个域名在 hosts 文件中存在,则优先使用这个信息返回,在本例中一定要注意hosts插件的位置,如果放在了forward插件之后,那么hosts插件即没有匹配的机会;
prometeusCoreDNS自身metrics数据接口。可以通过http://localhost:9153/metrics获取prometheus格式的监控数据。open in new window
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。

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.