全部產品
Search
文件中心

Container Service for Kubernetes:DNS FAQ

更新時間:Aug 28, 2024

本文介紹在ACK叢集中DNS相關的常見問題及對應的解決方案。

為什麼通過exec無法進入CoreDNS Pod?

問題現象

使用kubectl -n kube-system exec -it {coredns pod} bash及類似命令無法進入到CoreDNS Pod。

問題原因

CoreDNS所使用的容器鏡像是基於Scratch構建,不具備Shell執行環境。

解決方案

可以使用nsenter的方式訪問CoreDNS Pod所處的容器網路環境。具體操作,請參見檢查CoreDNS Pod的網路連通性。如果您需要查看CoreDNS日誌,可以啟用CoreDNS日誌分析與監控能力。具體操作,請參見分析和監控CoreDNS日誌

為什麼CoreDNS正在使用廢棄的API?

問題現象

執行叢集升級前置檢查時,發現使用者代理程式(UserAgent)為coredns的用戶端正在訪問已棄用的discovery.k8s.io/v1beta1Kubernetes API,其API路徑為/apis/discovery.k8s.io/v1beta1

問題原因

CoreDNS使用discovery.k8s.io/v1beta1API串連到APIServer,但該API在您叢集版本中即將棄用或已棄用。產生這種現象的原因有兩種:

  • CoreDNS版本較低:當前叢集安裝的CoreDNS版本較低,不支援調用discovery.k8s.io/v1API,只能使用discovery.k8s.io/v1beta1API。

  • CoreDNS是在較早版本的Kubernetes中啟動的:儘管Kubernetes和CoreDNS的版本都是最新的,但CoreDNS是在較早的Kubernetes版本(例如1.20版本)中啟動,並在容器啟動階段選擇了discovery.k8s.io/v1beta1API版本。然而,隨著Kubernetes叢集逐漸升級,discovery.k8s.io/v1beta1API被棄用,但CoreDNS仍然在使用它。

解決方案

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

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

  3. 組件管理頁面對CoreDNS組件進行升級操作。

    如果頁面提示不可升級,請執行下一步,否則執行步驟3。關於如何升級組件,請參見管理組件

  4. 使用kubectl執行如下命令,重啟CoreDNS。

    kubectl -n kube-system rollout restart deployment coredns
    重要

    請注意重啟過程中可能存在小機率解析異常的問題。更多資訊,請參見避免IPVS缺陷導致的DNS機率性解析逾時問題

  5. CoreDNS升級或重啟成功後,使用kubectl執行如下命令,確認CoreDNS Pod的狀態。

    kubectl -n kube-system get pod -l k8s-app=kube-dns

    如果CoreDNS Pod剛剛重建並處於Running狀態,您可忽略叢集升級前置檢查頁面中由CoreDNS產生的廢棄API調用記錄,繼續對叢集進行升級。

CoreDNS日誌中報錯,顯示dns: buffer size too small

問題現象

使用kubectl -n kube-system logs {coredns pod} 命令查看CoreDNS Pod日誌時,提示dns: buffer size too small

問題原因

由於CoreDNS的預設緩衝區大小(bufsize)為1232位元組,所以Kubernetes Pod的DNS查詢的UDP資料包最大隻能為1232位元組。如果某個DNS請求的響應超過了這個限制,DNS解析則會失敗,無法擷取該請求的結果。在Pod中進行某些DNS查詢,尤其是當請求的響應資料較大時,可能會受到影響,詳情請參見issue

解決方案

升級CoreDNS版本至v1.7.1及以上。對於CoreDNS版本低於v1.7.1,可使用kubectl edit cm -n kube-system coredns 配置CoreDNS的bufsize大小,該值取值範圍為[512, 4096]之間。更多資訊,請參見CoreDNS社區文檔

. {
    bufsize 1220
    log
}