如何從metadata.google.internal清除GKE池的dns快取?

如何從metadata.google.internal清除GKE池的dns快取?

我遇到一個問題,外部網域的 DNS 條目損壞。當時問題的性質尚不清楚。

當條目被破壞時,從 Google Kubernetes Engine 中的 kubernetes cluster pod 查詢該網域。從叢集查詢該網域時,問題仍然存在(事件發生在 2 個多月前)。

叢集 dns 解析器使用metadata.google.internal 進行 dns 解析,並且從叢集中使用 dig 進行這些查詢將:

dig problematic.external.domain @169.254.169.254
# does not resolve and takes over 2 seconds
dig problematic.external.domain  @1.1.1.1
# resolves correctly under 200ms

在同一專案和區域中建立新虛擬機器可以正確解決有問題的網域。這僅影響活動叢集元資料伺服器 DNS 解析器。

有沒有辦法刷新 dns 快取或任何其他建議?

一般來說,我試圖避免編輯集群內 dns 設置,並且更喜歡其他一些方法來修復它。

編輯更多資訊: NodeLocal DNSCache已在叢集中處於活動狀態並引用該文檔https://cloud.google.com/kubernetes-engine/docs/how-to/nodelocal-dns-cache問題是元資料 DNS 伺服器。福利清單摘錄如下:

DNS queries for external URLs (URLs that don't refer to cluster resources) are forwarded directly to the local Cloud DNS metadata server, bypassing kube-dns.

ip 169.254.169.254 是哪個

答案1

雖然沒有特定的方法來刷新Cloud DNS的元資料伺服器,但每個查詢仍然有TTL,並且大多數GCE DNS都尊重這一點,它會在一定時間後過期,快取也會失效。

不過,如果問題出在快取上,則應使用kubectl cordon $NODENAME指令封鎖 GKE 節點來解決。

此外,您可以透過指定存根 DNS 設定來繞過 GCE DNS。查看這個連結了解詳情。

答案2

NodeLocal DNS 快取外掛程式可以協助解析您案例中提到的網域,因為它將外部URL 的DNS 查詢直接轉送至本機Cloud DNS 元資料伺服器,繞過kube-dns,並且由於您的Compute Engine 虛擬機器可以解析提到的DNS(使用本地雲端) DNS),因此您的叢集也能夠這樣做。

參考本文檔有關如何在 GKE 叢集上配置 NodeLocal DNSCache 的詳細說明。

相關內容