執行階段

執行階段組態 指定了一個虛擬檔案系統樹,其中包含可重新載入的組態元素。此虛擬檔案系統可透過一系列的本地檔案系統、靜態啟動組態、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: {}

在已棄用的 執行階段 啟動組態中,分層是隱含且固定的

  1. 靜態啟動組態

  2. 本機磁碟檔案系統

  3. 本機磁碟檔案系統 *override_subdirectory*

  4. 管理控制台覆寫

較高層的值會覆寫較低層的對應值。

檔案系統配置

組態指南的各個章節描述了可用的執行階段設定。例如,這裡 是上游叢集的執行階段設定。

執行階段金鑰中的每個「.」都表示層次結構中的一個新目錄。路徑的最後一部分是檔案。檔案的內容構成了執行階段值。從檔案讀取數值時,空格和換行符號將被忽略。

numeratordenominator 是保留關鍵字,不能出現在任何目錄中。

靜態啟動

可以在 啟動組態 中透過 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 選項來針對服務叢集進行客製化。

執行階段探索服務 (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

計數器

未使用覆寫目錄的載入總次數