執行階段
執行階段組態 指定了一個虛擬檔案系統樹,其中包含可重新載入的組態元素。此虛擬檔案系統可透過一系列的本地檔案系統、靜態啟動組態、RTDS 和管理控制台衍生的覆蓋層來實現。
虛擬檔案系統
分層
執行階段可以視為一個由多個層組成的虛擬檔案系統。分層執行階段啟動組態指定了此分層。較後層的執行階段設定會覆寫較早層的設定。典型的組態可能如下所示
layers:
- name: static_layer_0
static_layer:
health_check:
min_interval: 5
- name: disk_layer_0
disk_layer: { symlink_root: /srv/runtime/current, subdirectory: envoy }
- name: disk_layer_1
disk_layer: { symlink_root: /srv/runtime/current, subdirectory: envoy_override, append_service_cluster: true }
- name: admin_layer_0
admin_layer: {}
在已棄用的 執行階段 啟動組態中,分層是隱含且固定的
較高層的值會覆寫較低層的對應值。
檔案系統配置
組態指南的各個章節描述了可用的執行階段設定。例如,這裡 是上游叢集的執行階段設定。
執行階段金鑰中的每個「.」都表示層次結構中的一個新目錄。路徑的最後一部分是檔案。檔案的內容構成了執行階段值。從檔案讀取數值時,空格和換行符號將被忽略。
numerator 或 denominator 是保留關鍵字,不能出現在任何目錄中。
靜態啟動
可以在 啟動組態 中透過 protobuf JSON 表示法 指定靜態基本執行階段。
本機磁碟檔案系統
當 執行階段虛擬檔案系統 在本機磁碟上實現時,它會以 symlink_root + subdirectory 為根目錄。例如,health_check.min_interval 金鑰將具有以下完整檔案系統路徑(使用符號連結)
/srv/runtime/current/envoy/health_check/min_interval
覆寫
可以在 分層執行階段 啟動組態中覆蓋任意數量的磁碟檔案系統層。
在已棄用的 執行階段 啟動組態中,有一個不同的檔案系統覆寫。假設資料夾 /srv/runtime/v1
指向儲存全域執行階段組態的實際檔案系統路徑。以下是執行階段的典型組態設定
symlink_root:
/srv/runtime/current
subdirectory:
envoy
override_subdirectory:
envoy_override
其中 /srv/runtime/current
是指向 /srv/runtime/v1
的符號連結。
叢集特定子目錄
在已棄用的 執行階段 啟動組態中,override_subdirectory 與 --service-cluster
CLI 選項一起使用。假設 --service-cluster
已設定為 my-cluster
。Envoy 會先在以下完整檔案系統路徑中尋找 health_check.min_interval 金鑰
/srv/runtime/current/envoy_override/my-cluster/health_check/min_interval
如果找到,該值將覆寫在主要查找路徑中找到的任何值。這允許使用者在全域預設值的基礎上自訂個別叢集的執行階段值。
透過 分層執行階段 啟動組態,可以透過任何磁碟層的 append_service_cluster 選項來針對服務叢集進行客製化。
透過符號連結交換更新執行階段值
更新任何執行階段值有兩個步驟。首先,建立整個執行階段樹的硬拷貝,並更新所需的執行階段值。其次,使用相當於以下命令的方式,以原子方式將符號連結根從舊樹交換到新的執行階段樹
/srv/runtime:~$ ln -s /srv/runtime/v2 new && mv -Tf new current
檔案系統資料如何部署、垃圾回收等不在本文檔的範圍之內。
執行階段探索服務 (RTDS)
可以透過指定 rtds_layer 來指定和傳遞一個或多個執行階段層。這會將執行階段層指向常規的 xDS 端點,並訂閱給定層的單個 xDS 資源。這些層的資源類型是 執行階段訊息。
管理控制台
可以在 /runtime 管理端點 檢視值。可以在 /runtime_modify 管理端點 修改和新增值。如果未設定執行階段,則會使用空的提供者,其效果是使用程式碼中內建的所有預設值,除了透過 /runtime_modify
新增的任何值之外。
注意
請謹慎使用 /runtime_modify 端點。變更會立即生效。至關重要的是,管理介面必須妥善保護。
最多可以指定一個管理層。如果在沒有管理層的情況下指定非空的 分層執行階段 啟動組態,則任何變更的管理控制台動作都會引發 503 回應。
原子性
執行階段將重新載入,並在各種情況下產生新的快照,例如
偵測到符號連結根下的檔案移動操作或符號連結根變更時。
新增或修改管理控制台覆寫時。
所有執行階段層都會在快照期間評估。具有錯誤的層會被忽略,並從有效層中排除,請參閱 num_layers。走訪符號連結根將花費一定的時間,因此如果需要真正的原子性,則執行階段目錄應該是不可變的,並且應該使用符號連結變更來協調更新。
當偵測到檔案移動時,具有相同符號連結根的磁碟層只會觸發單次重新整理。當偵測到檔案移動時,具有非相同重疊符號連結根路徑的磁碟層可能會觸發多次重新載入。
Protobuf 和 JSON 表示法
執行階段 檔案系統 可以在 proto3 訊息中表示為一個 google.protobuf.Struct,模擬具有以下規則的 JSON 物件
點分隔符號對應到樹狀邊緣。
純量葉(整數、字串、布林值、雙精度數)以其各自的 JSON 類型表示。
FractionalPercent 透過其 規範 JSON 編碼 表示。
以下是 YAML 中 health_check.min_interval 金鑰設定的範例表示法
health_check:
min_interval: 5
注意
從雙精度數剖析的整數值會向下捨入到最接近的整數。
針對已棄用功能使用執行階段覆寫
Envoy 執行階段也是 Envoy 功能棄用流程的一部分。
如 Envoy 重大變更政策中所述,Envoy 中的功能棄用分為三個階段:預設警告、預設失敗和程式碼移除。
在第一階段,Envoy 會在警告日誌中記錄一則警告,指出該功能已棄用,並增加 deprecated_feature_use 執行階段統計資料。建議使用者前往 已棄用 頁面,查看如何遷移到新的程式碼路徑,並確保其適合他們的用例。
在第二階段,該欄位將被標記為 disallowed_by_default,預設情況下使用該組態欄位將導致組態被拒絕。此禁止模式可以在執行階段組態中覆寫,方法是將 envoy.deprecated_features:full_fieldname 或 envoy.deprecated_features:full_enum_value 設定為 true。例如,對於已棄用的欄位 Foo.Bar.Eep
,將 envoy.deprecated_features:Foo.bar.Eep
設定為 true
。這裡有一個使用靜態執行階段來允許預設失敗欄位的生產範例:configs/using_deprecated_config.yaml。也可以在執行階段組態中覆寫禁止模式,方法是將 envoy.features.enable_all_deprecated_feature
設定為 true
,這允許使用所有已棄用的欄位。強烈不建議使用這些覆寫,因此請謹慎使用,並盡快切換到新的欄位。預設致命組態表示舊程式碼路徑的移除即將發生。如果新的程式碼路徑中的任何錯誤或功能缺失能夠提前找出,而不是在程式碼移除之後才發現,對於 Envoy 使用者和 Envoy 貢獻者來說,都會是更好的結果!
透過啟用執行階段鍵 envoy.features.fail_on_any_deprecated_feature
,Envoy 使用者可以在典型的預設警告階段觸發組態載入失敗。這是一種有用的方法,可以在 Envoy 的棄用排程之前驗證您正在使用的欄位。
注意
1.14.1 之前的 Envoy 版本無法從整數值解析執行階段布林值,需要明確的「true」或「false」。錯誤地放置一個整數(例如「0」)來表示「false」會導致使用預設值。對於 已棄用功能 的執行階段覆寫情況,尤其要注意這一點,因為它可能會導致意想不到的 Envoy 行為。
統計資料
檔案系統執行階段提供程式會在 runtime. 命名空間中發出一些統計資料。
名稱 |
類型 |
說明 |
---|---|---|
admin_overrides_active |
量具 |
如果任何管理員覆寫已啟用,則為 1,否則為 0 |
deprecated_feature_use |
計數器 |
使用已棄用功能的總次數。有關所使用功能的詳細資訊將以「從檔案 Y 使用已棄用選項 'X'」的形式記錄到警告日誌中。 |
deprecated_feature_seen_since_process_start |
量具 |
使用已棄用功能的次數。這在熱重啟期間不會延續。 |
load_error |
計數器 |
導致任何層發生錯誤的載入嘗試總次數 |
load_success |
計數器 |
在所有層都成功的載入嘗試總次數 |
num_keys |
量具 |
目前載入的金鑰數量 |
num_layers |
量具 |
目前處於活動狀態(無載入錯誤)的層數 |
override_dir_exists |
計數器 |
使用了覆寫目錄的載入總次數 |
override_dir_not_exists |
計數器 |
未使用覆寫目錄的載入總次數 |
註解
以
#
作為第一個字元的行會被視為註解。註解可以用於提供現有值的上下文說明。在其他情況下為空的文件中,註解也可用於在需要時保留部署的佔位符。