應用現狀
集群在做DNS解析時,如果請求量大,那CoreDNS將承受壓力,會有如下影響。
- 查詢變慢,影響業務性能。
- 為保證性能,CoreDNS需要更高規格的配置。
解決方案
NodeLocal DNSCache 通過在集群節點上運行 DNS緩存代理來提高集群 DNS 性能。
啟用NodeLocal DNSCache之后,DNS查詢所遵循的路徑如下圖所示。
NodeLocal DNSCache查詢路徑


插件安裝
CCE提供了node-local-dns插件,可以方便的安裝NodeLocal DNSCache。
說明
?node-local-dns插件僅支持1.19及以上版本集群。
NodeLocal DNSCache不提供Hosts、Rewrite等插件能力,僅作為CoreDNS的透明緩存代理。如有需要,可在CoreDNS配置中修改。
kube-system命名空間下的Pod不支持自動注入。
步驟 1 (可選)修改CoreDNS配置,讓CoreDNS優先采用UDP協議與上游DNS服務器通信。
NodeLocal DNSCache采用TCP協議與CoreDNS進行通信,CoreDNS會根據請求來源使用的協議與上游DNS服務器進行通信。當使用了NodeLocal DNSCache時,訪問上游DNS服務器時會使用TCP協議,而云上DNS服務器對TCP協議支持有限,如果您使用了NodeLocal DNSCache,您需要修改CoreDNS配置,讓其總是優先采用UDP協議與上游DNS服務器進行通信,避免解析異常。
執行如下命令修改。
kubectl edit configmap coredns -nkube-system
在forward插件中指定請求上游的協議為perfer_udp,修改之后CoreDNS會優先使用UDP協議與上游通信。
forward . /etc/resolv.conf { prefer_udp }
步驟 2 登錄CCE控制臺,單擊集群名稱進入集群,在左側導航欄中選擇“插件管理”,在右側找到 node-local-dns ,單擊“安裝”。
步驟 3 在安裝插件頁面,選擇插件規格,并配置相關參數。
enable_dnsconfig_admission :是否自動注入DNSConfig至新建的Pod中。默認為 false ,設置為true表示支持自動注入,避免您手工配置Pod YAML進行注入。
步驟 4 完成以上配置后,單擊“安裝”。
使用NodeLocal DNSCache
有兩種方式可以使用NodeLocal DNSCache:
- 自動注入:創建Pod時自動配置Pod的dnsConfig字段。(kube-system命名空間下的Pod不支持自動注入)
- 手動配置:手動配置Pod的dnsConfig字段,從而使用NodeLocal DNSCache。
自動注入
自動注入需要滿足如下條件:
- 插件需要將enable_dnsconfig_admission參數配置為true
- 命名空間添加node-local-dns-injection=enabled標簽
**kubectl label namespace ***default ***** node-local-dns-injection=enabled
- 新建Pod不位于kube-system和kube-public命名空間
- 新建Pod沒有被打上禁用DNS注入node-local-dns-injection=disabled標簽
- 新建Pod的網絡為hostNetwork且DNSPolicy為ClusterFirstWithHostNet,或Pod為非hostNetwork且DNSPolicy為ClusterFirst
開啟自動注入后,創建的Pod會自動添加如下dnsConfig字段,nameservers中除了NodeLocal DNSCache的地址169.254.20.10外,還添加了CoreDNS的地址10.247.3.10,保障了業務DNS請求高可用。
dnsConfig:
nameservers:
- 169.254.20.10
- 10.247.3.10
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
options:
- name: timeout
value: ''
- name: ndots
value: '5'
- name: single-request-reopen
手動配置
手動配置即自行給Pod加上dnsConfig配置。
創建一個Pod,將dnsconfig配置為169.254.20.10。
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:image: nginx:alpine
name: container-0
dnsConfig:
nameservers:169.254.20.10
searches:default.svc.cluster.localsvc.cluster.localcluster.local
options:name: ndots
value: '2'
imagePullSecrets:name: default-secret