重新載入

原始碼

reload 允許自動重新載入變更後的 Corefile。

描述

此外掛程式允許自動重新載入變更後的 Corefile。若要啟用自動重新載入 zone file 變更,請使用 auto 外掛程式。

此外掛程式會定期檢查 Corefile 是否已變更,方法是讀取該檔案並計算其 SHA512 檢查碼。如果檔案已變更,它會使用新的 Corefile 重新載入 CoreDNS。這省去了在變更 Corefile 後發送 SIGHUP 或 SIGUSR1 的需要。

重新載入是平穩的 - 您在重新載入發生時不應看到任何服務中斷。即使新的 Corefile 有錯誤,CoreDNS 也會繼續執行舊的組態,並且會在記錄中印出錯誤訊息。但請參閱「錯誤」章節以了解失敗模式。

在某些環境中(例如 Kubernetes),可能會有許多 CoreDNS 實例在幾乎相同的時間啟動,且它們都共用一個通用的 Corefile。為了防止它們同時重新載入,會向重新載入檢查間隔新增一些抖動。這是從多個 CoreDNS 實例的角度來看的抖動;每個實例仍然會定期檢查,但所有這些實例的重新載入將分散在整個抖動持續時間內。鑑於重新載入是平穩的,這並非絕對必要,可以透過將抖動設定為 0s 來停用。

每次重新載入 Corefile 時,都會重新計算抖動。

此外掛程式在每個伺服器區塊中只能使用一次。

語法

reload [INTERVAL] [JITTER]

此外掛程式將檢查每隔 INTERVAL 發生的變更,並受到 +/- JITTER 持續時間的影響。

  • INTERVALJITTER 是 Golang 持續時間。預設 INTERVAL 為 30 秒,預設 JITTER 為 15 秒,INTERVAL 的最小值為 2 秒,而 JITTER 的最小值為 1 秒。如果 JITTER 超過 INTERVAL 的一半,它將被設定為 INTERVAL 的一半。

範例

使用預設間隔檢查

. {
    reload
    erratic
}

每 10 秒檢查一次(在這種情況下,抖動會自動設定為 10 / 2 = 5)

. {
    reload 10s
    erratic
}

錯誤

重新載入會發生且不會遺失資料(即 DNS 查詢會持續進行),但有一個角落案例會導致重新載入失敗,而您會遺失功能。請考慮以下 Corefile

. {
	health :8080
	whoami
}

CoreDNS 啟動並從 :8080 提供健康狀態。現在,您將 :8080 變更為 :443,卻不知道已經有程序正在監聽該埠。程序會重新載入並執行以下步驟

  1. 關閉 8080 上的監聽器
  2. 重新載入並再次剖析組態
  3. 無法在 443 上啟動新的監聽器
  4. 無法載入新的 Corefile,中止並繼續使用舊的程序

在中止重新載入嘗試後,我們保留了正在執行的舊程序,但監聽器已在步驟 1 中關閉;因此健康狀態端點會損壞。同樣的情況也可能發生在 prometheus 外掛程式中。

一般而言,請小心指定新埠,並期望重新載入能完全運作。

在 CoreDNS v1.6.0 和更早版本中,此外掛程式不會發現任何 import 陳述式。這表示如果任何這些匯入的檔案發生變更,reload 外掛程式不會知道該事實。CoreDNS v1.7.0 和更高版本會剖析 Corefile 並支援偵測匯入檔案中的變更。

指標

如果已啟用監控(透過 prometheus 外掛程式),則會匯出以下指標

  • coredns_reload_failed_total{} - 計算失敗的重新載入嘗試次數。
  • coredns_reload_version_info{hash, value} - 記錄重新載入期間的雜湊值。

目前 hash 的類型為 "sha512",value 是傳回的雜湊值。

另請參閱

請參閱 coredns-import(7) 和 corefile(5)。