為瞭解決CoreDNS負載過高或業務Pod所在節點負載過高引發的DNS解析失敗的問題,可部署NodeLocal DNSCache組件,在各節點運行DNS緩衝代理,降低解析延遲,提高可用性。
工作原理
適用範圍
不支援Windows節點。
只有當Pod適用主機網路(
hostNetwork:true)且DNS策略為DNSPolicy: ClusterFirstWithHostNet,或未使用主機網路模式(hostNetwork:false)且DNS策略為DNSPolicy: ClusterFirst時,才會自動注入。若叢集網路外掛程式為Terway,要求Terway版本為v1.0.10.301或更高。
若叢集建立時使用的網路外掛程式為Terway早期版本且使用了IPvlan模式,請參照為什麼配置組件後沒有效果判斷是否需要修改Terway配置。
虛擬節點在ACK NodeLocal DNSCache版本為v1.6.0或更高,且ACK Virtual Node版本為2.14.0或更高時支援啟用DNS緩衝。
啟用DNS緩衝
步驟一:安裝組件
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理。
在網路頁簽中找到ACK NodeLocal DNSCache卡片,單擊安裝,在彈出的對話方塊中單擊確認。
步驟二:配置並啟用
啟用DNS緩衝有多種方式,作用範圍不同:
僅在ACK NodeLocal DNSCache v1.6.0及更高版本支援。
適用於調試與測試的情境,因
dnsConfig會被強制覆蓋,不適用於虛擬節點上的Pod。
在叢集全域啟用(推薦)
NodeLocal DNSCache組件提供了是否預設啟用 DNSCache配置。啟用此配置後,除系統保留命名空間外的所有命名空間中的Pod在建立時都會被自動注入DNS Cache。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理。
在網路頁簽中找到ACK NodeLocal DNSCache卡片,單擊配置,在彈出的對話方塊中勾選是否預設啟用 DNSCache,然後單擊確認。
為單個命名空間啟用
NodeLocal DNSCache組件會自動監聽包含了node-local-dns-injection=enabled標籤的命名空間,並為其中建立的Pod自動注入DNS Cache相關配置。
替換YOUR_NAMESPACE,為命名空間添加標籤:
kubectl label namespace YOUR_NAMESPACE node-local-dns-injection=enabled在啟用DNS緩衝的命名空間中,建立的Pod會自動注入下方的dnsConfig配置,使用DNS緩衝:
nameservers中會額外添加CoreDNS的ClusterIP作為備份的DNS伺服器,保證DNS請求高可用(不適用於虛擬節點上的Pod)。dnsConfig:
nameservers:
- 169.254.20.10
- <kube-dns> # 自動填入kube-dns Service的ClusterIP
options:
- name: ndots
value: "3"
- name: attempts
value: "2"
- name: timeout
value: "1"
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
dnsPolicy: None為單個Pod手動啟用
在Pod中添加spec.dnsConfig配置,在其中配置nameservers為169.254.20.10和kube-dns Service的IP,可手動為Pod啟用DNS緩衝。
該方式不適用於虛擬節點,虛擬節點上的Pod的dnsConfig會被強制覆蓋,無法使用169.254.20.10作為DNS Server。
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: None
dnsConfig:
nameservers: ["169.254.20.10","<kube-dns>"] # 替換為kube-dns Service IP
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
options:
- name: ndots
value: "3"
- name: attempts
value: "2"
- name: timeout
value: "1"dnsPolicy:必須設定為None。nameservers:配置為169.254.20.10(NodeLocal DNSCache在節點上的IP),<kube-dns>需替換為kube-system命名空間中的kube-dnsService的IP地址。請登入Container Service管理主控台,在左側中查看。searches:設定搜尋域,保證叢集內部網域名稱能夠被正常解析。ndots:預設為3,適當降低ndots可以提升解析效率。更多資訊,請參見resolv.conf。
效果驗證
啟用DNS緩衝後,建立一個新的工作負載,驗證是否自動注入DNS緩衝配置。
查看Pod資訊。
kubectl get pods預期輸出:
NAME READY STATUS RESTARTS AGE nginx-766448f68c-m**** 1/1 Running 0 4m39s nginx-766448f68c-w**** 1/1 Running 0 4m39s選擇其中一個Pod,查看dnsConfig。
kubectl get pod nginx-766448f68c-m**** -o=jsonpath='{.spec.dnsConfig}'預期輸出如下,
nameservers中同時存在兩個IP,說明成功為應用接入NodeLocal DNSCache。下方輸出中的
172.21.0.10是kube-dns的ClusterIP,請以實際輸出為準。map[nameservers:[169.254.20.10 172.21.0.10] options:[map[name:ndots value:5]] searches:[default.svc.cluster.local svc.cluster.local cluster.local]]
使用限制
在命名空間啟用DNS Cache的情況下,擁有
node-local-dns-injection=disabled標籤的Pod不會進行自動注入。NodeLocal DNSCache不提供Hosts、Rewrite等外掛程式能力,僅作為CoreDNS的透明緩衝代理。如有需要,請在CoreDNS配置中修改。
DNS緩衝在ACK系統保留的命名空間中不會生效,請查看不生效的命名空間。
常見問題
為什麼配置組件後沒有效果?
配置組件後沒有效果,同時NodeLocal DNSCache的日誌中也看不到來自Pod的訪問,這是由於在Terway早期版本建立的叢集中,預設Terway配置無法使用NodeLocal DNSCache。請參照下方的步驟,對Terway配置進行修改。
查看Terway設定檔。
kubectl -n kube-system get cm eni-config -o yaml | grep eniip_virtual_type kubectl -n kube-system get cm eni-config -o yaml | grep host_stack_cidrs檢查設定檔中
eniip_virtual_type欄位是否開啟IPVLAN模式。如果設定檔中此項不存在或不是IPVLAN,則無需進行後續配置。檢查設定檔中是否已配置
host_stack_cidrs欄位。如果設定檔中已配置host_stack_cidrs欄位,則無需進行後續配置。
在Terway設定檔中添加
host_stack_cidrs欄位,並輸入網段169.254.20.10/32,儲存並退出。10-terway.conf: | { "cniVersion": "0.3.0", "name": "terway", "eniip_virtual_type": "IPVlan", "host_stack_cidrs": ["169.254.20.10/32"], "type": "terway" }查看當前Terway的DaemonSet。
kubectl -n kube-system get daemonset terway-eniip預期輸出:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE terway-eniip 2 2 2 2 2 <none> 15m觸發Terway DaemonSet重建。
kubectl rollout restart -n kube-system daemonset terway-eniip登入任意叢集節點,查看Terway設定檔。
如果Terway設定檔包含添加的網段,則說明配置成功。
cat /etc/cni/net.d/*預期輸出:
{ "cniVersion": "0.3.0", "name": "terway-chainer", "plugins": [ { "eniip_virtual_type": "IPVlan", "host_stack_cidrs": [ "169.254.20.10/32", ], "type": "terway" }, { "type": "cilium-cni" } ] }所有Terway Pod重建並正常後,可以繼續安裝NodeLocal DNSCache了。
為什麼Pod沒有注入DNS緩衝配置?
下列原因都可能導致Pod沒有自動注入DNS配置:
Pod處於ACK系統保留命名空間:
ACK NodeLocal DNSCache版本早於v1.6.0,且Pod處於虛擬節點上、Pod或其所在命名空間擁有ECI相關標籤,例如
virtual-node-affinity-injection、eci、alibabacloud.com/eci等。Pod擁有
node-local-dns-injection=disabled標籤。Pod的網路為
hostNetwork時,未配置DNSPolicy: ClusterFirstWithHostNet;其他類型的Pod,未配置DNSPolicy: ClusterFirst。
如何查看組件監控?
ack-arms-prometheus組件版本為1.1.33及以上時,才會顯示NodeLocal DNSCache大盤。
NodeLocal DNSCache監控大盤記錄了包括快取命中率等關鍵資料。請通過大盤確認組件狀況、評估組件負載,確保NodeLocal DNSCache在生產環境中的穩定性。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在Prometheus監控頁面,單擊網路監控頁簽。然後在NodeLocal DNSCache頁簽查看監控大盤。
如果監控大盤內無資料,請參見為什麼監控大盤內無資料?

為什麼監控大盤內無資料?
可能是由於NodeLocal DNSCache未配置Prometheus採集相關配置。
在kube-system命名空間中找到名為node-local-dns的DaemonSet,確認Annotations中是否已存在Prometheus相關配置。如果未存在,請添加相關配置。
apiVersion: apps/v1
kind: DaemonSet
metadata:
annotations:
deprecated.daemonset.template.generation: '1'
meta.helm.sh/release-name: ack-node-local-dns
meta.helm.sh/release-namespace: kube-system
#Prometheus相關配置:
prometheus.io/path: "/metrics"
prometheus.io/port: "9253"
prometheus.io/scrape: "true"
...升級組件時,有哪些注意事項?
及時升級組件版本,可以擷取新功能、效能改進或安全修複。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理。
在組件管理頁面單擊ACK NodeLocal DNSCache卡片下的升級,在彈出的對話方塊中單擊確認。
重要若對ConfigMap
node-local-dns進行過修改操作,升級時修改配置將會被覆蓋。建議在升級前對node-local-dns進行備份,當組件升級完成後,重新設定組件。若對node-local-dns DaemonSet進行過汙點容忍等修改操作,升級時汙點容忍等操作將會被覆蓋,升級後需要再次設定。
如果升級NodeLocal DNSCache失敗,需要根據操作異常碼尋找對應的問題,查看問題原因和解決方案。詳細描述,請參見組件異常問題排查。
如何卸載組件?
關閉DNS緩衝注入功能:根據DNS緩衝的配置方式關閉DNS緩衝,例如開啟方式為通過組件配置在叢集全域開啟時,則通過組件配置關閉DNS緩衝注入。
調整現有Pod中的DNS配置:
修改現有Pod中的DNS配置,移除
169.254.20.10(NodeLocal DNSCache在節點上的IP)配置,將DNS伺服器位址設定為kube-dns Service的ClusterIP),然後重啟Pod。檢查Pod配置中是否留存DNS緩衝,如果沒有任何輸出,表明所有Pod都已遷移。
kubectl get pods -A -o jsonpath='{range .items[?(@.spec.dnsConfig.nameservers[*] contains "169.254.20.10")]}{.metadata.namespace}{"/"}{.metadata.name}{"\n"}{end}'
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理。
在組件管理頁面單擊ACK NodeLocal DNSCache卡片下的卸載,在彈出的對話方塊中單擊確認。
重要卸載後所有解析流量會請求至CoreDNS,建議參照DNS最佳實務進行配置以保證DNS的高可用性。