k8s的coreDNS解析组件调试

busybox工具安装

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
View Code

  kubectl create -f busybox.yaml

  kubectl exec busybox cat /etc/resolv.conf

  

 Core DNS解析异常排查

    异常现象检查

   

  k8s DNS 解析步骤

    普通Pod的dnsPolicy属性是默认值ClusterFirst,也就是会指向集群内部的DNS服务器,kube-dns负责解析集群内部的域名

    kube-dns Pod的dnsPolicy值是Default,意思是从所在Node继承DNS服务器,对于无法解析的外部域名,kube-dns会继续向集群外部的dns进行查询

    kube-dns只能解析集群内部地址,而集群外部地址应该发给外部DNS服务器进行解析

   

宿主机可以访问Pod的主机名

      在宿主机上/etc/resolv.conf里配置了nameserver {coredns的podIP} 

      nameserver表示解析域名时使用该地址指定的主机为域名服务器。其中域名服务器是按照文件中出现的顺序来查询的,且只有当第一个nameserver没有反应时才查询下面的nameserver,一般不要指定超过3个服务器

     

     Pod如何解析DNS记录    依赖于Pod容器中依赖容器内 resolv 文件的配置.这个文件中.配置的 DNS Server,一般就是 K8S 中kubedns 的Service 的ClusterIP.这个IP是虚拟IP.无法ping但可以访问

k8s的4种DNS策略

    None         

               表示空的DNS设置,这种方式一般用于想要自定义 DNS 配置的场景,往往需要和 dnsConfig 配合一起使用达到自定义 DNS 的目的

    Default     

               此种方式是让kubelet来决定使用何种DNS策略。而kubelet默认的方式,就是使用宿主机的/etc/resolv.conf文件。

               同时,kubelet也可以配置指定的DNS策略文件,使用kubelet参数即可,如:–resolv-conf=/etc/resolv.conf

    ClusterFirst

               此种方式是使用kubernets集群内部中的kubedns或coredns服务进行域名解析。若解析不成功,才会使用宿主机的DNS配置来进行解析

    ClusterFistWithHostNet

              在某些场景下,我们的 POD 是用 HOST 模式启动的(HOST模式,是共享宿主机网络的),一旦用 HOST 模式,表示这个 POD 中的所有容器,都要使用宿主机的 /etc/resolv.conf 配置进行DNS查询,但如果你想使用了 HOST 模式,还继续使用 Kubernetes 的DNS服务,那就将 dnsPolicy 设置为 ClusterFirstWithHostNet

   search域作用

         resolv.conf中search域分别是default.svc.cluster.local svc.cluster.local cluster.local,在kubernets中,域名的全称必须是 service-name.namespace.svc.cluster.local 

         假如集群中有一个svc(Service)名为a,在某个Pod中执行命令 curl a 时,在此Pod中会根据/etc/resolv.conf进行解析流程。选择nameserver 10.96.0.2进行解析,将字符串'a'带入到/etc/resolv.conf文件中不同的search域,依次进行查找,如下

          a.default.svc.cluster.local -> a.svc.cluster.local -> a.cluster.local

         先查找 a.default.svc.cluster.local ,若找不到,则再查找 a.svc.cluster.local ,依次往下进行,直到找到为止

        

          options ndots:5 解释

           a)请求域名中点数少于5个时,先走search域,最后将其视为绝对域名进行查询;

           b)请求域名中点数大于等于5个时,直接视为绝对域名进行查找,只有当查询不到的时候,才继续走 search 域。

k8s配置自定义DNS记录

      kubectl edit configmap coredns -n kube-system

      

      修改configmap后进行保存稍微等待几分钟即可生效

        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        hosts {
            192.168.30.136   app.example.choerodon.io
            192.168.30.136   chart.example.choerodon.io
            192.168.30.136   minio.example.choerodon.io
            192.168.30.136   registry.example.choerodon.io
            192.168.30.136   gitlab.example.choerodon.io
            192.168.30.136   notify.example.choerodon.io
            192.168.30.136   hzero.example.choerodon.io
            192.168.30.136   api.example.choerodon.io
            192.168.30.136   sonarqube.example.choerodon.io
            192.168.30.136   devops.example.choerodon.io

            fallthrough
        }
        prometheus :9153
配置数据

     

    域名解析配置成功

解析异常排查

      k8s默认在pod中的resolv.conf中配置的nameserver的ip是kube-dns的svc的ip 使用这个svc ip进行解析域名的时候会提示解析失败 手动把pod中的resolv.conf中的nameserver的ip配置成core-dns pod的ip即可成功解析

     1.查看core-dns的service ip    kubectl get svc -n kube-system   service ip是一个虚拟IP 它是不能够被ping通的

       

    2.查看core dns的pod ip

     

    3.查看业务pod中配置的dns服务器地址

       

       

      解析不存在的域名地址

        

       

 

posted @ 2021-01-06 10:59  不懂123  阅读(2500)  评论(0编辑  收藏  举报