EnvoyFilter
EnvoyFilter
提供了一種機制,來自定義 Istio Pilot 生成的 Envoy 配置。使用
EnvoyFilter
可以 修改某些字段的值,添加特定的過濾器,甚至添加全新的監聽器、叢集等。必須謹慎使用此功能,因為不正确的配置可能會破壞整個網格的穩定性。與其他 Istio 網絡對象不同,
EnvoyFilters
是附加應用的。對于特定命名空間中的給定工作負載,可以有任意數量的
EnvoyFilters
。這些
EnvoyFilters
的應用順序如下:配置根命名空間中的所有
EnvoyFilters
,然後是工作負載命名空間中的所有比對的
EnvoyFilters
。
注意1:由于這是“碎玻璃”配置,不同 Istio 版本之間不會有任何向後相容性。即 此配置會根據 Istio 網絡子系統的内部實作而發生變化。
注意2:在 Istio 代理版本更新中,應仔細檢查通過此機制提供的 Envoy 配置,以確定廢棄字段被删除并合适地替換。
注意3:當多個
EnvoyFilters
綁定到給定命名空間中的同一個工作負載時,将按建立時間的順序順序處理所有更新檔。如果多個
EnvoyFilters
配置互相沖突,則該行為是不确定的。
注釋4:
*_To
将
EnvoyFilter
資源應用于系統中的所有工作負載(
sidecars
和
gateways
),在配置根命名空間中定義資源,而不需要工作負載選擇器。
下面的示例中,在名為
istio-config
的根命名空間中聲明了一個全局預設的
EnvoyFilter
資源,該資源在系統中的所有
sidecars
上添加了自定義協定過濾器,以使出站端口 9307 生效。應該在終止
tcp_proxy
過濾器生效之前添加該過濾器。此外,它為
sidecars
和
gateways
中的所有 HTTP 連接配接設定了 30s 的空閑逾時。
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: custom-protocol
namespace: istio-config # as defined in meshConfig resource.
spec:
configPatches:
- applyTo: NETWORK_FILTER
match:
context: SIDECAR_OUTBOUND # will match outbound listeners in all sidecars
listener:
portNumber: 9307
filterChain:
filter:
name: "envoy.tcp_proxy"
patch:
operation: INSERT_BEFORE
value:
name: "envoy.config.filter.network.custom_protocol"
config:
...
- applyTo: NETWORK_FILTER # http connection manager is a filter in Envoy
match:
# context omitted so that this applies to both sidecars and gateways
listener:
filterChain:
filter:
name: "envoy.http_connection_manager"
patch:
operation: MERGE
value:
typed_config:
"@type": "type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager"
idle_timeout: 30s
下面的示例中,為
bookinfo
命名空間中到達帶有标簽為
app: reviews
的
reviews
服務
Pod
的服務端口 8080 的所有入站 HTTP 調用啟用 Envoy 的 Lua 篩選器。Lua 過濾器調出到外部服務
internal.org.net:8888
,該服務在 Envoy 中需要特殊的叢集定義,叢集也作為此配置的一部分添加到
sidecar
中。
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: reviews-lua
namespace: bookinfo
spec:
workloadSelector:
labels:
app: reviews
configPatches:
# The first patch adds the lua filter to the listener/http connection manager
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
listener:
portNumber: 8080
filterChain:
filter:
name: "envoy.http_connection_manager"
subFilter:
name: "envoy.router"
patch:
operation: INSERT_BEFORE
value: # lua filter specification
name: envoy.lua
config:
inlineCode: |
function envoy_on_request(request_handle)
-- Make an HTTP call to an upstream host with the following headers, body, and timeout.
local headers, body = request_handle:httpCall(
"lua_cluster",
{
[":method"] = "POST",
[":path"] = "/acl",
[":authority"] = "internal.org.net"
},
"authorize call",
5000)
end
# The second patch adds the cluster that is referenced by the lua code
# cds match is omitted as a new cluster is being added
- applyTo: CLUSTER
match:
context: SIDECAR_OUTBOUND
patch:
operation: ADD
value: # cluster specification
name: "lua_cluster"
type: STRICT_DNS
connect_timeout: 0.5s
lb_policy: ROUND_ROBIN
hosts:
- socket_address:
protocol: TCP
address: "internal.org.net"
port_value: 8888
下面的示例中,覆寫了 HTTP 連接配接管理器中的某些字段(HTTP 空閑逾時和
X-Forward-For
受信任的躍點),這些字段位于 SNI 主機
app.example.com
的
istio-system
命名空間的入口網關上的監聽器中。
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: hcm-tweaks
namespace: istio-system
spec:
workloadSelector:
labels:
istio: ingress-gateway
configPatches:
- applyTo: NETWORK_FILTER # http connection manager is a filter in Envoy
match:
context: GATEWAY
listener:
filterChain:
sni: app.example.com
filter:
name: "envoy.http_connection_manager"
patch:
operation: MERGE
value:
idle_timeout: 30s
xff_num_trusted_hops: 5
EnvoyFilter
EnvoyFilter
提供了一種機制,自定義 Istio Pilot 生成的 Envoy 配置。
字段 | 類型 | 描述 | 是否必需 |
---|---|---|---|
| | 用于選擇在其上應用此更新檔配置的指定 組的條件。如果省略, 更新檔将應用于同一命名空間中的所有工作負載。如果在配置根名稱空間中存在 ,它将被應用于任何命名空間中的所有工作負載 | 否 |
| | 具有比對條件的一個或多個更新檔 | 是 |
EnvoyFilter.ApplyTo
ApplyTo
指定在
Envoy
配置中的哪個位置應用給定的更新檔。
名稱 | 描述 |
---|---|
| 占位符 |
| 将更新檔應用到監聽器 |
| 将更新檔應用到過濾器鍊上 |
| 将更新檔應用到網絡過濾器鍊,可以修改現有的過濾器或添加新的過濾器 |
| 将更新檔應用于 HTTP 連接配接管理器中的 HTTP 過濾器鍊,以修改現有的過濾器或添加新的過濾器 |
| 将更新檔應用于 HTTP 連接配接管理器中的 配置(rds 輸出)。這不适用于虛拟主機。目前,僅允許對路由配置對象進行 操作 |
| 将更新檔應用到路由配置中的虛拟主機 |
| 在路由配置中将更新檔應用于比對的虛拟主機内部的路由對象上。目前,僅允許對路由對象進行 操作 |
| 在 CDS 輸出中将更新檔應用于叢集。也用于添加新的叢集 |
EnvoyFilter.ClusterMatch
必須滿足在
ClusterMatch
中指定的條件,該更新檔才能應用于叢集。
字段 | 類型 | 描述 | 是否必需 |
---|---|---|---|
| | 為其生成叢集的服務端口。如果省略,則應用于任何端口的叢集 | 否 |
| | 此叢集的完全限定服務名。如果省略,則應用于任何服務的叢集。對于通過 定義的服務,服務名稱與在 中定義的主機相同 | 否 |
| | 與服務關聯的子集。如果省略,則應用于服務的任何子集的叢集 | 否 |
| | 要比對的叢集的精确名稱。要通過名稱比對特定的叢集,例如内部生成的 叢集,請将 中除 之外的所有字段保留為空 | 否 |
EnvoyFilter.DeprecatedListenerMatch.ListenerProtocol
名稱 | 描述 |
---|---|
| 所有協定 |
| / / / |
| 任何非 HTTP 監聽器 |
EnvoyFilter.DeprecatedListenerMatch.ListenerType
名稱 | 描述 |
---|---|
| 所有監聽器 |
| 中的入站監聽器 |
| 中的出站監聽器 |
| 網關監聽器 |
EnvoyFilter.EnvoyConfigObjectMatch
在将更新檔應用到為給定代理生成的配置之前,需要滿足一個或多個比對條件。
字段 | 類型 | 描述 | 是否必需 |
---|---|---|---|
| | 比對的特定配置生成的上下文。Istio Pilot 會在 、到 的入站流量和 的出站流量的上下文中生成 Envoy 配置 | 否 |
| | 比對與代理關聯的屬性 | 否 |
| | 比對 Envoy 監聽器屬性 | 是 |
| | 比對 Envoy HTTP 路由配置屬性 | 是 |
| | 比對 Envoy 叢集屬性 | 是 |
EnvoyFilter.EnvoyConfigObjectPatch
字段 | 類型 | 描述 | 是否必需 |
---|---|---|---|
| | 指定應在 Envoy 配置中的何處應用更新檔。比對将根據 選擇合适的對象。例如,帶有 的 在監聽器上具有一個比對條件,在 上具有一個網絡過濾器選擇,在應該執行插入的 HTTP 過濾器上具有一個子過濾器選擇。同樣, 上的 應該在叢集上而不是在監聽器上具有比對項(如果提供) | 否 |
| | 比對 監聽器或路由 的 配置或叢集 | 否 |
| | 與操作一起應用的更新檔 | 否 |
EnvoyFilter.Filter.FilterType
名稱 | 描述 |
---|---|
| 占位符 |
| HTTP 過濾器 |
| 網絡過濾器 |
EnvoyFilter.InsertPosition.Index
在過濾器鍊中的索引或位置。
名稱 | 描述 |
---|---|
| 首位插入 |
| 尾部插入 |
| 在給定過濾器之前插入 |
| 在給定過濾器之後插入 |
EnvoyFilter.ListenerMatch
要将更新檔應用到跨所有過濾鍊的指定監聽器上,或者應用到監聽器内部的指定過濾鍊上,必須滿足監聽器比對中指定的條件。
字段 | 類型 | 描述 | 是否必需 |
---|---|---|---|
| | 向其發送或接收流量的服務端口或網關端口。如果未指定,則比對所有監聽器。即使為執行個體端口或 端口生成了入站監聽器,也應該隻使用服務端口來比對監聽器 | 否 |
| | 比對監聽器中的指定過濾器鍊。如果指定了,則更新檔将應用于過濾器鍊(以及指定的過濾器,如果指定了),而不是應用于監聽器中的其他過濾器鍊 | 否 |
| | 通過名稱比對指定的監聽器。Pilot 生成的監聽器通常命名為 | 否 |
EnvoyFilter.ListenerMatch.FilterChainMatch
對于有多個過濾器鍊的監聽器(如 帶有許可的 mTLS 的
sidecars
上的入站監聽器,有多個 SNI 比對的網關監聽器),可以使用過濾器鍊比對來選擇要打更新檔的指定過濾器鍊。
字段 | 類型 | 描述 | 是否必需 |
---|---|---|---|
| | 過濾器鍊的名稱 | 否 |
| | 過濾器鍊的比對條件使用的 SNI 值。如果過濾器鍊沒有 SNI 比對,則此條件的值為 false | 否 |
| | 僅适用于 SIDECAR INBOUND 上下文。如果非空,則在決定過濾器鍊比對時要考慮傳輸協定。當 監聽器過濾器檢測到該值時,會将其與新連接配接的傳輸協定進行比較。可接受的值包括: - 預設值,當沒有檢測到傳輸協定時使用; - 當 檢測到 tls 協定時設定 | 否 |
| | 僅适用于 。如果非空,則在決定過濾器鍊比對時要考慮一組逗号分隔的應用程式協定。當某個監聽器過濾器(如 )檢測到該值時,會将其與新連接配接的應用程式協定進行比較。接受的值包括: / / | 否 |
| | 要應用更新檔的指定過濾器的名稱。将其設定為 ,以添加過濾器或将更新檔應用于 HTTP 連接配接管理器 | 否 |
EnvoyFilter.ListenerMatch.FilterMatch
比對過濾器鍊中的特定過濾器的條件。
字段 | 類型 | 描述 | 是否必需 |
---|---|---|---|
| | 要比對的過濾器的名稱 | 否 |
| | 過濾器中要比對的下一級過濾器。通常用于 HTTP 連接配接管理器過濾器和 Thrift 過濾器 | 否 |
EnvoyFilter.ListenerMatch.SubFilterMatch
比對另一個過濾器中的特定過濾器的條件。此字段通常用于比對
envoy.httpconnectionmanager
網絡過濾器内的 HTTP 過濾器。也适用于 Thrift 過濾器。
字段 | 類型 | 描述 | 是否必需 |
---|---|---|---|
| | 要比對的過濾器的名稱 | 否 |
EnvoyFilter.Patch
指定如何給選中的對象打更新檔。
字段 | 類型 | 描述 | 是否必需 |
---|---|---|---|
| | 指定如何應用更新檔 | 否 |
| | 更新檔對象的 json 配置。這将使用 json 合并語義與路徑中現有的 proto 進行合并 | 否 |
EnvoyFilter.Patch.Operation
Operation
指定如何應用更新檔到標明的配置。
名稱 | 描述 |
---|---|
| 使用 json 合并語義将提供的配置與生成的配置合并 |
| 将提供的配置添加到現有清單(監聽器,叢集,虛拟主機,網絡過濾器 或 HTTP 過濾器)。當 設定為 或 時,将忽略此操作 |
| 從清單中删除標明的對象(監聽器,叢集,虛拟主機,網絡過濾器 或 HTTP 過濾器)。不需要指定值。當 設定為 或 時,将忽略此操作 |
| 在給定對象數組上執行插入操作。此操作僅在過濾器的上下文中才有用,因為過濾器的順序很重要。對于叢集和虛拟主機,數組中元素的順序無關緊要。在標明的過濾器或子過濾器之前插入。如果沒有選擇任何過濾器,指定的過濾器将被插入到清單的開頭 |
| 在給定對象數組上執行插入操作。此操作僅在過濾器的上下文中才有用,因為過濾器的順序很重要。對于叢集和虛拟主機,數組中元素的順序無關緊要。在標明的過濾器或子過濾器之後插入。如果沒有選擇任何過濾器,指定的過濾器将被插入到清單的末尾 |
EnvoyFilter.PatchContext
PatchContext
将根據流量流向和工作負載選擇一類配置。
名稱 | 描述 |
---|---|
| 和 中的所有監聽器、路由、叢集 |
| 中入站的監聽器、路由、叢集 |
| 中出站的監聽器、路由、叢集 |
| 監聽器、路由、叢集 |
EnvoyFilter.ProxyMatch
要比對的代理的一個或多個屬性。
字段 | 類型 | 描述 | 是否必需 |
---|---|---|---|
| | golang regex 格式(RE2)的正規表達式,可以使用 Istio 代理的特定版本來選擇代理。給定代理的 Istio 版本是在連接配接到 Pilot 時從代理提供的節點中繼資料字段 中獲得的。此值作為環境變量 嵌入在 Istio 代理的 鏡像中。自定義代理實作應該提供這個中繼資料變量,以利用 Istio 版本檢查選項 | 否 |
| | 當連接配接到 Istio Pilot 時,比對代理提供的節點中繼資料。注意,雖然 Envoy 的節點中繼資料的類型為 ,但 Pilot 隻處理字元串的鍵值對。中繼資料中指定的所有鍵都必須與精确值比對。如果指定的任何鍵不存在或值不比對,則比對将失敗 | 否 |
EnvoyFilter.RouteConfigurationMatch
當更新檔應用到路由配置對象或路由配置中的指定虛拟主機時,必須滿足
RouteConfigurationMatch
中指定的條件。
字段 | 類型 | 描述 | 是否必需 |
---|---|---|---|
| | 生成此路由配置的服務端口号或網關伺服器端口号。如果省略,則适用于所有端口的路由配置 | 否 |
| | 僅适用于 上下文。生成此路由配置的網關伺服器端口名稱 | 否 |
| | 生成此路由配置的 Istio 網關配置的 。僅在上下文為 時适用,應該采用 格式。将此字段與 和 結合使用,可以為網關配置對象内的特定 伺服器準确選擇 路由配置 | 否 |
| | 在路由配置中比對指定的虛拟主機,然後将更新檔應用到該虛拟主機 | 否 |
| | 用于比對的路由配置名稱,可用于按此名稱比對特定的路由配置。例如,為所有 内部生成的 路由配置 | 否 |
EnvoyFilter.RouteConfigurationMatch.RouteMatch
在路由配置中比對虛拟主機中的特定路由。
字段 | 類型 | 描述 | 是否必需 |
---|---|---|---|
| | 預設情況下生成的路由對象命名為 。使用 生成的路由對象将攜帶 的 HTTP 路由中使用的名稱 | 否 |
| | 将路由與特定操作類型比對 | 否 |
EnvoyFilter.RouteConfigurationMatch.RouteMatch.Action
Action
是指 Envoy 在比對 HTTP 路由時對路由采取的操作。
名稱 | 描述 |
---|---|
| 所有三個路由操作 |
| 将流量路由到 叢集 |
| 重定向請求 |
| 直接響應具有特定有效負載的請求 |
EnvoyFilter.RouteConfigurationMatch.VirtualHostMatch
在路由配置中比對特定的虛拟主機。
字段 | 類型 | 描述 | 是否必需 |
---|---|---|---|
| | 由 Istio 生成的虛拟主機對象被命名為 ,其中主機通常對應 的 字段或系統資料庫中某個服務的主機名 | 否 |
| | 比對虛拟主機中的特定路由 | 否 |