協調策略
使用宣告式設定時,您會定義系統的理想狀態。接著,系統會持續運作,盡可能維持在這個狀態。詳情請參閱「使用設定檔以宣告方式管理 Kubernetes 物件」。
有了 Config Connector,您就能以任何順序建立及更新資源,不受依附元件關係影響。GKE 會將宣告的設定移至與所需狀態最終一致。
舉例來說,如果您在對應的 PubSubTopic 之前建立 PubSubSubscription,Config Connector 會等到主題建立後,再建立相關聯的訂閱項目。
Config Connector 安裝作業不一致的時間長度,取決於其管理的資源數量和類型。GKE 叢集的變更通常會在幾秒內執行。不過,建立Google Cloud 資源所需的時間可能會因資源類型而異。舉例來說,建立單一 PubSubTopic 只需要幾秒鐘。 Google Cloud資源在建立完成前不會達到一致性。舉例來說,建立 SQLInstance 和 SQLDatabase 時,系統在建立資料庫的幾分鐘內會不一致。
每次更新後,或在抖動期過後,GKE 和 Config Connector 都會根據預先設定的預設間隔平均值,協調各項資源。您可以在各資源的參考頁面中,找到「Config Connector Default Average Reconcile Interval In Seconds」的預設間隔。如需各項資源的連結,請參閱「資源總覽」。如果協調時發生錯誤,Config Connector 會以指數輪詢方式重試,最長輪詢時間為 2 分鐘。如果是直接控制器管理的資源,您可以使用 cnrm.cloud.google.com/backoff-max-delay-in-seconds 註解設定這項上限。您可以在特定資源的「Events」(事件) 中查看任何錯誤。
設定協調間隔
從 Config Connector 1.102 開始,您可以使用 cnrm.cloud.google.com/reconcile-interval-in-seconds 註解,設定 Config Connector 管理資源的平均協調間隔。註解的值會覆寫資源參考頁面中「Config Connector Default Average Reconcile Interval In Seconds」的預設值。註解的值應為非負整數,代表時間 (以秒為單位)。如果值設為 0,Config Connector 會在資源達到 UpToDate 狀態後,停止啟動資源協調。這項註解可控制資源達到 UpToDate 狀態後的定期協調作業。如果協調失敗,這個註解不會影響重試間隔。詳情請參閱「設定協調錯誤的指數輪詢」。
舉例來說,如果您希望 Config Connector 降低資源協調頻率,以免發生基礎 Google Cloud API 配額問題,可以將平均協調間隔值設為 1 小時。
cnrm.cloud.google.com/reconcile-interval-in-seconds: "3600"
如要讓 Config Connector 更頻繁地協調資源,以便更快修正偏差,可以將註解設為較小的值。
您可以使用下列指令碼,為共用相同群組版本種類 (GVK) 的特定類型所有資源加上註解:
#!/bin/bash
KIND=RESOURCE_KIND
NAMESPACE=RESOURCE_NAMESPACE
ANNOTATION_KEY="cnrm.cloud.google.com/reconcile-interval-in-seconds"
ANNOTATION_VALUE=RECONCILE_INTERVAL
kubectl annotate --overwrite --all ${KIND} ${ANNOTATION_KEY}=${ANNOTATION_VALUE} -n ${NAMESPACE}
echo "Annotation added to all ${KIND} RESOURCE"
更改下列內容:
RESOURCE_KIND:要加上註解的資源種類。RESOURCE_NAMESPACE::包含要加上註解的資源的命名空間。RECONCILE_INTERVAL:協調間隔,以秒為單位。
您可以將協調間隔設為 0,停用資源的偏移校正功能,但這不會停用資源操作。如果您變更資源 Spec,系統會再次協調資源。
將對帳間隔設為 0 後即無法復原。也就是說,即使將值改回非零數字,Config Connector 也不會再次協調資源。
如要還原 0 的協調間隔,可以採取下列做法:
- 修改資源規格,加入協調間隔值,啟用新的協調作業。
- 設定
cnrm.cloud.google.com/deletion-policy: "abandon"註解來捨棄資源,並以非 0 的協調間隔值重新建立資源。
設定指數輪詢,處理對帳錯誤
如果資源無法協調,Config Connector 會使用指數輪詢重試協調。延遲時間從 250 毫秒開始,每次嘗試失敗後會加倍 (例如 500 毫秒、1 秒、2 秒),預設上限為 2 分鐘。
cnrm.cloud.google.com/reconcile-interval-in-seconds 註解會控制資源達到 UpToDate 狀態後的定期偏移校正。在 Config Connector 1.160.0 以上版本中,您可以使用 cnrm.cloud.google.com/backoff-max-delay-in-seconds 註解,控管協調失敗時的重試行為。將註解設為下列其中一個值:
- 正整數 (
"1"以上):設定重試之間的延遲時間上限 (以秒為單位)。舉例來說,"600"會將重試間隔上限設為 10 分鐘,"3600"則會設為 1 小時。 "0":在對帳失敗後停止自動重試。資源會維持在失敗狀態,直到變更觸發協調程序為止,例如更新spec、metadata.labels、metadata.annotations、參照的資源或Secret。
舉例來說,如要將重試間隔上限設為 30 分鐘,並減少失敗資源的 Google Cloud API 配額用量,請新增下列註解:
metadata:
annotations:
cnrm.cloud.google.com/backoff-max-delay-in-seconds: "1800"
如要停止自動重試協調錯誤,直到您更新資源為止,請新增下列註解:
metadata:
annotations:
cnrm.cloud.google.com/backoff-max-delay-in-seconds: "0"
可變更但無法讀取的欄位,只有在變更時才會觸發
部分 API 會公開不可讀取但可變動的欄位 (例如 SQL 使用者的密碼)。由於無法查看這些欄位是否經過修改,因此只有在修改自訂資源時,系統才會更新可變動但無法讀取的欄位。
修改不可變更的欄位時,不會重新建立資源
資源中的某些欄位不可變動,必須刪除並重新建立目標資源,才能進行協調。
在這種情況下,Config Connector 會為資源發出「UpdatedFailed」Kubernetes 事件,而不是執行這項重新建立作業。您必須刪除並重新建立資源。
事件範例:
Warning UpdateFailed 37m (x643 over 15d) computeinstance-controller Update call failed: the desired mutation for the following field(s) is invalid: [bootDisk.0.InitializeParams.0.Image networkInterface.0.NetworkIp]