天天看點

EnvoyFilter

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 配置。

字段 類型 描述 是否必需

workloadSelector

WorkloadSelector

用于選擇在其上應用此更新檔配置的指定

Pods/VMs

組的條件。如果省略,

EnvoyFilter

更新檔将應用于同一命名空間中的所有工作負載。如果在配置根名稱空間中存在

EnvoyFilter

,它将被應用于任何命名空間中的所有工作負載

configPatches

EnvoyConfigObjectPatch[]

具有比對條件的一個或多個更新檔

EnvoyFilter.ApplyTo

ApplyTo

指定在

Envoy

配置中的哪個位置應用給定的更新檔。

名稱 描述

INVALID

占位符

LISTENER

将更新檔應用到監聽器

FILTER_CHAIN

将更新檔應用到過濾器鍊上

NETWORK_FILTER

将更新檔應用到網絡過濾器鍊,可以修改現有的過濾器或添加新的過濾器

HTTP_FILTER

将更新檔應用于 HTTP 連接配接管理器中的 HTTP 過濾器鍊,以修改現有的過濾器或添加新的過濾器

ROUTE_CONFIGURATION

将更新檔應用于 HTTP 連接配接管理器中的

Route

配置(rds 輸出)。這不适用于虛拟主機。目前,僅允許對路由配置對象進行

MERGE

操作

VIRTUAL_HOST

将更新檔應用到路由配置中的虛拟主機

HTTP_ROUTE

在路由配置中将更新檔應用于比對的虛拟主機内部的路由對象上。目前,僅允許對路由對象進行

MERGE

操作

CLUSTER

在 CDS 輸出中将更新檔應用于叢集。也用于添加新的叢集

EnvoyFilter.ClusterMatch

必須滿足在

ClusterMatch

中指定的條件,該更新檔才能應用于叢集。

字段 類型 描述 是否必需

portNumber

uint32

為其生成叢集的服務端口。如果省略,則應用于任何端口的叢集

service

string

此叢集的完全限定服務名。如果省略,則應用于任何服務的叢集。對于通過

ServiceEntry

定義的服務,服務名稱與在

ServiceEntry

中定義的主機相同

subset

string

與服務關聯的子集。如果省略,則應用于服務的任何子集的叢集

name

string

要比對的叢集的精确名稱。要通過名稱比對特定的叢集,例如内部生成的

Passthrough

叢集,請将

ClusterMatch

中除

name

之外的所有字段保留為空

EnvoyFilter.DeprecatedListenerMatch.ListenerProtocol

名稱 描述

ALL

所有協定

HTTP

HTTP

/

HTTPS

/

HTTPS

/

gRPC

TCP

任何非 HTTP 監聽器

EnvoyFilter.DeprecatedListenerMatch.ListenerType

名稱 描述

ALL

所有監聽器

SIDECAR_INBOUND

sidecar

中的入站監聽器

SIDECAR_OUTBOUND

sidecar

中的出站監聽器

GATEWAY

網關監聽器

EnvoyFilter.EnvoyConfigObjectMatch

在将更新檔應用到為給定代理生成的配置之前,需要滿足一個或多個比對條件。

字段 類型 描述 是否必需

context

PatchContext

比對的特定配置生成的上下文。Istio Pilot 會在

Gateway

、到

sidecar

的入站流量和

sidecar

的出站流量的上下文中生成 Envoy 配置

proxy

ProxyMatch

比對與代理關聯的屬性

listener

ListenerMatch (oneof)

比對 Envoy 監聽器屬性

routeConfiguration

RouteConfigurationMatch (oneof)

比對 Envoy HTTP 路由配置屬性

cluster

ClusterMatch (oneof)

比對 Envoy 叢集屬性

EnvoyFilter.EnvoyConfigObjectPatch

字段 類型 描述 是否必需

applyTo

ApplyTo

指定應在 Envoy 配置中的何處應用更新檔。比對将根據

applyTo

選擇合适的對象。例如,帶有

HTTPFILTER

applyTo

在監聽器上具有一個比對條件,在

envoy.http connection_manager

上具有一個網絡過濾器選擇,在應該執行插入的 HTTP 過濾器上具有一個子過濾器選擇。同樣,

CLUSTER

上的

applyTo

應該在叢集上而不是在監聽器上具有比對項(如果提供)

match

EnvoyConfigObjectMatch

比對 監聽器或路由 的 配置或叢集

patch

Patch

與操作一起應用的更新檔

EnvoyFilter.Filter.FilterType

名稱 描述

INVALID

占位符

HTTP

HTTP 過濾器

NETWORK

網絡過濾器

EnvoyFilter.InsertPosition.Index

在過濾器鍊中的索引或位置。

名稱 描述

FIRST

首位插入

LAST

尾部插入

BEFORE

在給定過濾器之前插入

AFTER

在給定過濾器之後插入

EnvoyFilter.ListenerMatch

要将更新檔應用到跨所有過濾鍊的指定監聽器上,或者應用到監聽器内部的指定過濾鍊上,必須滿足監聽器比對中指定的條件。

字段 類型 描述 是否必需

portNumber

uint32

向其發送或接收流量的服務端口或網關端口。如果未指定,則比對所有監聽器。即使為執行個體端口或

Pod

端口生成了入站監聽器,也應該隻使用服務端口來比對監聽器

filterChain

FilterChainMatch

比對監聽器中的指定過濾器鍊。如果指定了,則更新檔将應用于過濾器鍊(以及指定的過濾器,如果指定了),而不是應用于監聽器中的其他過濾器鍊

name

string

通過名稱比對指定的監聽器。Pilot 生成的監聽器通常命名為

IP:Port

EnvoyFilter.ListenerMatch.FilterChainMatch

對于有多個過濾器鍊的監聽器(如 帶有許可的 mTLS 的

sidecars

上的入站監聽器,有多個 SNI 比對的網關監聽器),可以使用過濾器鍊比對來選擇要打更新檔的指定過濾器鍊。

字段 類型 描述 是否必需

name

string

過濾器鍊的名稱

sni

string

過濾器鍊的比對條件使用的 SNI 值。如果過濾器鍊沒有 SNI 比對,則此條件的值為 false

transportProtocol

string

僅适用于 SIDECAR INBOUND 上下文。如果非空,則在決定過濾器鍊比對時要考慮傳輸協定。當

tls inspector

監聽器過濾器檢測到該值時,會将其與新連接配接的傳輸協定進行比較。可接受的值包括:

raw_buffer

- 預設值,當沒有檢測到傳輸協定時使用;

tls

- 當

tls inspector

檢測到 tls 協定時設定

applicationProtocols

string

僅适用于

sidecars

。如果非空,則在決定過濾器鍊比對時要考慮一組逗号分隔的應用程式協定。當某個監聽器過濾器(如

http_inspector

)檢測到該值時,會将其與新連接配接的應用程式協定進行比較。接受的值包括:

h2

/

http/1.1

/

http/1.0

filter

FilterMatch

要應用更新檔的指定過濾器的名稱。将其設定為

envoy.httpconnectionmanager

,以添加過濾器或将更新檔應用于 HTTP 連接配接管理器

EnvoyFilter.ListenerMatch.FilterMatch

比對過濾器鍊中的特定過濾器的條件。

字段 類型 描述 是否必需

name

string

要比對的過濾器的名稱

subFilter

SubFilterMatch

過濾器中要比對的下一級過濾器。通常用于 HTTP 連接配接管理器過濾器和 Thrift 過濾器

EnvoyFilter.ListenerMatch.SubFilterMatch

比對另一個過濾器中的特定過濾器的條件。此字段通常用于比對

envoy.httpconnectionmanager

網絡過濾器内的 HTTP 過濾器。也适用于 Thrift 過濾器。

字段 類型 描述 是否必需

name

string

要比對的過濾器的名稱

EnvoyFilter.Patch

指定如何給選中的對象打更新檔。

字段 類型 描述 是否必需

operation

Operation

指定如何應用更新檔

value

Struct

更新檔對象的 json 配置。這将使用 json 合并語義與路徑中現有的 proto 進行合并

EnvoyFilter.Patch.Operation

Operation

指定如何應用更新檔到標明的配置。

名稱 描述

MERGE

使用 json 合并語義将提供的配置與生成的配置合并

ADD

将提供的配置添加到現有清單(監聽器,叢集,虛拟主機,網絡過濾器 或 HTTP 過濾器)。當

applyTo

設定為

ROUTECONFIGURATION

HTTPROUTE

時,将忽略此操作

REMOVE

從清單中删除標明的對象(監聽器,叢集,虛拟主機,網絡過濾器 或 HTTP 過濾器)。不需要指定值。當

applyTo

設定為

ROUTECONFIGURATION

HTTPROUTE

時,将忽略此操作

INSERT_BEFORE

在給定對象數組上執行插入操作。此操作僅在過濾器的上下文中才有用,因為過濾器的順序很重要。對于叢集和虛拟主機,數組中元素的順序無關緊要。在標明的過濾器或子過濾器之前插入。如果沒有選擇任何過濾器,指定的過濾器将被插入到清單的開頭

INSERT_AFTER

在給定對象數組上執行插入操作。此操作僅在過濾器的上下文中才有用,因為過濾器的順序很重要。對于叢集和虛拟主機,數組中元素的順序無關緊要。在標明的過濾器或子過濾器之後插入。如果沒有選擇任何過濾器,指定的過濾器将被插入到清單的末尾

EnvoyFilter.PatchContext

PatchContext

将根據流量流向和工作負載選擇一類配置。

名稱 描述

ANY

sidecars

gateways

中的所有監聽器、路由、叢集

SIDECAR_INBOUND

sidecars

中入站的監聽器、路由、叢集

SIDECAR_OUTBOUND

sidecars

中出站的監聽器、路由、叢集

GATEWAY

gateways

監聽器、路由、叢集

EnvoyFilter.ProxyMatch

要比對的代理的一個或多個屬性。

字段 類型 描述 是否必需

proxyVersion

string

golang regex 格式(RE2)的正規表達式,可以使用 Istio 代理的特定版本來選擇代理。給定代理的 Istio 版本是在連接配接到 Pilot 時從代理提供的節點中繼資料字段

ISTIOVERSION

中獲得的。此值作為環境變量

ISTIOMETAISTIOVERSION

嵌入在 Istio 代理的

docker

鏡像中。自定義代理實作應該提供這個中繼資料變量,以利用 Istio 版本檢查選項

metadata

map<string, string>

當連接配接到 Istio Pilot 時,比對代理提供的節點中繼資料。注意,雖然 Envoy 的節點中繼資料的類型為

Struct

,但 Pilot 隻處理字元串的鍵值對。中繼資料中指定的所有鍵都必須與精确值比對。如果指定的任何鍵不存在或值不比對,則比對将失敗

EnvoyFilter.RouteConfigurationMatch

當更新檔應用到路由配置對象或路由配置中的指定虛拟主機時,必須滿足

RouteConfigurationMatch

中指定的條件。

字段 類型 描述 是否必需

portNumber

uint32

生成此路由配置的服務端口号或網關伺服器端口号。如果省略,則适用于所有端口的路由配置

portName

string

僅适用于

Gateway

上下文。生成此路由配置的網關伺服器端口名稱

gateway

string

生成此路由配置的 Istio 網關配置的

namespace/name

。僅在上下文為

Gateway

時适用,應該采用

namespace/name

格式。将此字段與

portNumber

portName

結合使用,可以為網關配置對象内的特定

HTTPS

伺服器準确選擇

Envoy

路由配置

vhost

VirtualHostMatch

在路由配置中比對指定的虛拟主機,然後将更新檔應用到該虛拟主機

name

string

用于比對的路由配置名稱,可用于按此名稱比對特定的路由配置。例如,為所有

sidecars

内部生成的

http_proxy

路由配置

EnvoyFilter.RouteConfigurationMatch.RouteMatch

在路由配置中比對虛拟主機中的特定路由。

字段 類型 描述 是否必需

name

string

預設情況下生成的路由對象命名為

default

。使用

VirtualService

生成的路由對象将攜帶

VirtualService

的 HTTP 路由中使用的名稱

action

Action

将路由與特定操作類型比對

EnvoyFilter.RouteConfigurationMatch.RouteMatch.Action

Action

是指 Envoy 在比對 HTTP 路由時對路由采取的操作。

名稱 描述

ANY

所有三個路由操作

ROUTE

将流量路由到

cluster/weighted

叢集

REDIRECT

重定向請求

DIRECT_RESPONSE

直接響應具有特定有效負載的請求

EnvoyFilter.RouteConfigurationMatch.VirtualHostMatch

在路由配置中比對特定的虛拟主機。

字段 類型 描述 是否必需

name

string

由 Istio 生成的虛拟主機對象被命名為

host:port

,其中主機通常對應

VirtualService

host

字段或系統資料庫中某個服務的主機名

route

RouteMatch

比對虛拟主機中的特定路由

繼續閱讀