DNS為Kubernetes集群內的工作負載提供域名解析服務。本文主要介紹Kubernetes集群中DNS域名解析原理和ACK集群中默認內置的DNS服務器CoreDNS。在Kubernetes集群中,CoreDNS扮演著至關重要的角色,它實現了服務發現的功能,使得集群內部的服務可以通過服務名來互相訪問,無需知道具體的IP地址。CoreDNS的強大之處在于其插件化架構,可以根據需求配置不同的插件以實現各種DNS相關的功能
Kubernetes集群中DNS域名解析原理
DNS解析原理圖
序號 | 描述 |
① | 業務Pod(Pod Client)試圖訪問Nginx服務(Service Nginx)時,先會請求本地DNS配置文件(/etc/resolv.conf)中指向的DNS服務器(nameserver 172.21.0.10,即Service kube-dns)獲取服務IP地址,得到解析結果為172.21.0.30的IP地址。 |
② | 業務Pod(Pod Client)再直接發起往該IP地址的請求,請求最終經過Nginx服務(Service Nginx)轉發到達后端的Nginx容器(Pod Nginx-1和Pod Nginx-2)上。 |
關于集群DNS域名解析原理的詳細說明,請參見DNS策略配置和域名解析說明。
域名解析配置
ACK集群中kubelet的啟動參數有--cluster-dns=<dns-service-ip>
、--cluster-domain=<default-local-domain>
,這兩個參數分別被用來設置集群DNS服務器的IP地址和主域名后綴。
ACK集群默認部署了一套CoreDNS工作負載,并通過kube-dns的服務名暴露DNS服務。ACK部署的CoreDNS工作負載后端是兩個名為coredns的Pod,集群會根據Pod內的配置,將域名請求發往集群DNS服務器獲取結果。Pod內的DNS域名解析配置文件為/etc/resolv.conf,文件內容如下。
nameserver xx.xx.0.10
search kube-system.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
參數 | 描述 |
nameserver | 定義DNS服務器的IP地址。 |
search | 設置域名的查找后綴規則,查找配置越多,說明域名解析查找匹配次數越多。ACK集群匹配有 |
options | 定義域名解析配置文件選項,支持多個KV值。例如該參數設置成 |
根據上述Pod內的配置,集群會將域名請求(集群內部定義的服務或是集群外部域名)查詢發往集群DNS服務器獲取結果。
CoreDNS介紹
CoreDNS是Kubernetes集群中負責DNS解析的組件,能夠支持解析集群內部自定義服務域名和集群外部域名。CoreDNS具備豐富的插件集,在集群層面支持自建DNS、自定義hosts、CNAME、rewrite等需求。與Kubernetes一樣,CoreDNS項目由CNCF托管。關于CoreDNS的更多信息,請參見CoreDNS: DNS and Service Discovery。
ACK集群使用CoreDNS負責集群的服務發現,您可以根據不同的使用場景配置CoreDNS以及使用CoreDNS提升集群的DNS QPS性能:
關于ACK集群CoreDNS的詳細配置說明,請參見集群CoreDNS配置。
關于如何使用CoreDNS提高ACK集群整體DNS查詢性能,請參見DNS最佳實踐。
您還可以在ACK集群中部署Node Local DNS提升服務發現的穩定性和性能,Node Local DNS通過在集群節點上作為DaemonSet運行DNS緩存代理來提高集群的DNS性能。關于如何在集群中部署Node Local DNS的具體步驟,請參見使用NodeLocal DNSCache。