【kubernetes/k8s概念】coredns 概念原理與使用


【kubernetes/k8s概念】coredns 概念原理與使用

 

 

 

WHY ?     

kuberntes 中的 pod 基於 service 域名解析后,再負載均衡分發到 service 后端的各個 pod 服務中,如果沒有 DNS 解析,則無法查到各個服務對應的 service 服務

在 Kubernetes 中,服務發現有幾種方式:

  • 基於環境變量的方式
  • 基於內部域名的方式

WHAT ?      

從 K8S 1.11 開始,K8S 已經使用 CoreDNS,替換 KubeDNS 來充當其 DNS 解析

     DNS 如何解析,依賴容器內 resolv 文件的配置

# cat /etc/resolv.conf 
nameserver 10.200.254.254
search default.svc.cluster.local. svc.cluster.local. cluster.local.
options ndots:5

     ndots:5:如果查詢的域名包含的點 “.” 不到 5 個,那么進行 DNS 查找,將使用非完全限定名稱(或者叫絕對域名),如果你查詢的域名包含點數大於等於 5,那么 DNS 查詢,默認會使用絕對域名進行查詢。

 

     Kubernetes 域名的全稱,必須是 service-name.namespace.svc.cluster.local 這種模式,服務名

# nslookup kubernetes.default.svc.cluster.local
Server:        10.200.254.254
Address:    10.200.254.254:53

Name:    kubernetes.default.svc.cluster.local
Address: 10.200.0.1

 

DNS策略,在Pod,Deployment RC等資源設置 dnsPolicy

  • None
用於想要自定義 DNS 配置的場景,而且需要和 dnsConfig 配合一起使用
  • Default
讓 kubelet 來決定使用何種 DNS 策略。而 kubelet 默認使用宿主機的 /etc/resolv.conf(使用宿主機的DNS策略)

但 kubelet 可以配置使用什么文件來進行 DNS 策略,使用 kubelet 的參數:–resolv-conf=/etc/resolv.conf 來決定 DNS 解析文件地址
  • ClusterFirst
表示 POD 內的 DNS 使用集群中配置的 DNS 服務,使用 Kubernetes 中 kubedns 或 coredns 服務進行域名解析。如果解析不成功,才會使用宿主機的 DNS 進行解析
  • ClusterFirstWithHostNet
POD 是用 HOST 模式啟動的(HOST模式),用 HOST 模式表示 POD 中的所有容器,
都使用宿主機的 /etc/resolv.conf 進行 DNS 查詢,但如果使用了 HOST 模式,還繼續使用 Kubernetes 的 DNS 服務,
那就將 dnsPolicy 設置為 ClusterFirstWithHostNet

 

 

   配置文件使用 configmap 

  • health:CoreDNS 健康檢查為 http://$IP:8080/health,返回為 OK
  • kubernetes:CoreDNS 將根據 Kubernetes 服務和 pod 的 IP 回復 DNS 查詢
  • prometheus:CoreDNS 度量 http://$IP:9153/metrics
  • proxy:不在 Kubernetes 集群域內的查詢都將轉發到預定義的解析器(/etc/resolv.conf),可以配置多個upstream 域名服務器,也可以用於延遲查找 /etc/resolv.conf 中定義的域名服務器
  • cache:啟用緩存,30 秒 TTL
  • loop:檢測簡單的轉發循環,如果找到循環則停止 CoreDNS 進程
  • reload:允許自動重新加載已更改的 Corefile
  • loadbalance:DNS 負載均衡器,默認round_robin
  • 所有插件,請看這里:https://coredns.io/plugins
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: namespace-test
data:
  Corefile: |
    .:53 {
        errors
        health
        ready
        kubernetes cluster.local  10.200.0.0/16 {
          pods insecure
          upstream 114.114.114.114
          fallthrough in-addr.arpa ip6.arpa
          namespaces namespace-test
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }
 

 

 

coredns 安裝部署   

下載:https://github.com/coredns/deployment/tree/master/kubernetes

     deploy.sh 用於生成用於 kube-dns 的集群上運行 CoreDNS 的 yaml 文件

     coredns.yaml.sed 文件作為模板,它創建一個 ConfigMap 和一個 CoreDNS  deployment 的yaml 文件 

    ./deploy.sh 172.18.0.0/24 cluster.local 生成 yaml 文件,在使用 kubectl apply 部署在 k8s 中

 

 官方性能 

    計算表達式: MB required (default settings) = (Pods + Services) / 1000 + 54

  •       cache 需要 30 MB,大約緩存 10000 條記錄
  •       操作 buffer 需要 5 MB,用於處理查詢,大約可以承受 30 K QPS 量

 

 


 

    容器內抓包

docker inspect --format "{{.State.Pid}}" container
# 進入 container namespace
nsenter -n -t ¥pid
# 對 53 端口進行抓包
# tcpdump -i eth0 -N udp dst port 53

參考:

     https://coredns.io/ 

     https://github.com/coredns/coredns

     https://github.com/coredns/deployment/blob/master/kubernetes/Scaling_CoreDNS.md    
————————————————
版權聲明:本文為CSDN博主「張忠琳」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zhonglinzhang/article/details/99674903


免責聲明!

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



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