全部產品
Search
文件中心

Container Service for Kubernetes:使用NodeLocal DNSCache組件

更新時間:Dec 25, 2025

為瞭解決CoreDNS負載過高或業務Pod所在節點負載過高引發的DNS解析失敗的問題,可部署NodeLocal DNSCache組件,在各節點運行DNS緩衝代理,降低解析延遲,提高可用性。

工作原理

  • 啟用DNS緩衝的Pod:Pod將DNS請求發送到DNS緩衝,如果命中緩衝則直接返回結果;如果緩衝未命中,則向CoreDNS發送請求,CoreDNS會解析所有叢集內網域名稱並向Pod返回結果。對於叢集外網域名稱,則會將請求發送至內網DNS解析處理。

    • ECS節點池混合雲節點池情境:ACK NodeLocal DNSCache組件通過在每個節點部署DaemonSet實現DNS緩衝。

    • 虛擬節點情境:組件通過在每個Pod中部署Blazing DNS Hidecar容器實現DNS緩衝。

  • 未啟用DNS緩衝的Pod:Pod將DNS請求直接發送到CoreDNS。對於叢集外網域名稱,則會將請求發送至內網DNS解析處理。

image

適用範圍

  • 不支援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緩衝

步驟一:安裝組件

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理

  3. 網路頁簽中找到ACK NodeLocal DNSCache卡片,單擊安裝,在彈出的對話方塊中單擊確認

步驟二:配置並啟用

啟用DNS緩衝有多種方式,作用範圍不同:

在叢集全域啟用(推薦)

NodeLocal DNSCache組件提供了是否預設啟用 DNSCache配置。啟用此配置後,除系統保留命名空間外的所有命名空間中的Pod在建立時都會被自動注入DNS Cache。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理

  3. 網路頁簽中找到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配置,在其中配置nameservers169.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-dns Service的IP地址。請登入Container Service管理主控台,在左側網路 > 服務中查看。

  • searches:設定搜尋域,保證叢集內部網域名稱能夠被正常解析。

  • ndots:預設為3,適當降低ndots可以提升解析效率。更多資訊,請參見resolv.conf

效果驗證

啟用DNS緩衝後,建立一個新的工作負載,驗證是否自動注入DNS緩衝配置。

  1. 查看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
  2. 選擇其中一個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配置進行修改。

  1. 查看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欄位,則無需進行後續配置。

  2. 在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"
      }
  3. 查看當前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
  4. 觸發Terway DaemonSet重建。

    kubectl rollout restart -n kube-system daemonset terway-eniip
  5. 登入任意叢集節點,查看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系統保留命名空間

    kubectl get mutatingwebhookconfigurations ack-node-local-dns-admission-controller -o yaml | grep -A 30 namespaceSelector

    預期輸出如下,namespaceSelector.matchExpressions.values中的命名空間的Pod不會自動注入DNS Cache。

    namespaceSelector:
        matchExpressions:
          ...
          values:
          - kube-system
          - kube-public
          - arms-prom
          - security-inspector
          - ack-csi-fuse
        matchLabels:
          node-local-dns-injection: enabled
      ...
  • ACK NodeLocal DNSCache版本早於v1.6.0,且Pod處於虛擬節點上、Pod或其所在命名空間擁有ECI相關標籤,例如virtual-node-affinity-injectionecialibabacloud.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在生產環境中的穩定性。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇營運管理 > Prometheus 監控

  3. Prometheus監控頁面,單擊網路監控頁簽。然後在NodeLocal DNSCache頁簽查看監控大盤。

    如果監控大盤內無資料,請參見為什麼監控大盤內無資料?

    image

為什麼監控大盤內無資料?

可能是由於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"
...

升級組件時,有哪些注意事項?

及時升級組件版本,可以擷取新功能、效能改進或安全修複。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理

  3. 組件管理頁面單擊ACK NodeLocal DNSCache卡片下的升級,在彈出的對話方塊中單擊確認

    重要
    • 若對ConfigMap node-local-dns進行過修改操作,升級時修改配置將會被覆蓋。建議在升級前對node-local-dns進行備份,當組件升級完成後,重新設定組件。

    • 若對node-local-dns DaemonSet進行過汙點容忍等修改操作,升級時汙點容忍等操作將會被覆蓋,升級後需要再次設定。

    • 如果升級NodeLocal DNSCache失敗,需要根據操作異常碼尋找對應的問題,查看問題原因和解決方案。詳細描述,請參見組件異常問題排查

如何卸載組件?

  1. 關閉DNS緩衝注入功能:根據DNS緩衝的配置方式關閉DNS緩衝,例如開啟方式為通過組件配置在叢集全域開啟時,則通過組件配置關閉DNS緩衝注入。

  2. 調整現有Pod中的DNS配置:

    1. 修改現有Pod中的DNS配置,移除169.254.20.10(NodeLocal DNSCache在節點上的IP)配置,將DNS伺服器位址設定為kube-dns Service的ClusterIP),然後重啟Pod。

    2. 檢查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}'
  3. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  4. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理

  5. 組件管理頁面單擊ACK NodeLocal DNSCache卡片下的卸載,在彈出的對話方塊中單擊確認

    重要

    卸載後所有解析流量會請求至CoreDNS,建議參照DNS最佳實務進行配置以保證DNS的高可用性。