全部產品
Search
文件中心

Container Service for Kubernetes:DNS概述

更新時間:Jun 19, 2024

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叢集匹配有kube-system.svc.cluster.localsvc.cluster.localcluster.local3個尾碼,最多進行8次查詢才能得到正確解析結果,因為叢集裡面進行IPv4和IPv6查詢各四次。

options

定義網域名稱解析設定檔選項,支援多個KV值。例如該參數設定成ndots:5,說明如果訪問的網域名稱字串內的點字元數量超過ndots值,則認為是完整網域名稱,並被直接解析;如果不足ndots值,則追加search段尾碼再進行查詢。

根據上述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叢集中部署Node Local DNS提升服務發現的穩定性和效能,Node Local DNS通過在叢集節點上作為DaemonSet運行DNS緩衝代理來提高叢集的DNS效能。關於如何在叢集中部署Node Local DNS的具體步驟,請參見使用NodeLocal DNSCache