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服務器地址

       

       

      解析不存在的域名地址

        

       

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM