先檢視這篇文章k8s~envoy的部署
當在Kubernetes中使用Envoy的WASM過濾器時,WASM過濾器會與Envoy一起部署在同一個Pod中,並與後端服務進行通訊。以下是一個簡單的關係圖示意:
+----------------------+
| Kubernetes |
| Cluster |
+----------|-----------+
|
|
+----------v-----------+
| |
| Pod |
| |
| +------------------+ |
| | Envoy | |
| | with WASM | |
| | Filter | |
| +------------------+ |
| | Backend App | |
| +------------------+ |
| |
+----------------------+
在這個示意圖中,我們有一個執行在Kubernetes中的Pod,其中包含了Envoy和後端服務兩個容器。Envoy與WASM過濾器一起作為Sidecar代理與後端服務一起執行,負責處理流量轉發、負載均衡、安全策略等功能。後端服務則是實際提供業務功能的應用程式。
WASM過濾器可以在Envoy中攔截請求並對其進行修改或增強,然後將請求傳送到後端服務。這種部署模式允許WASM過濾器直接與Envoy共用相同的網路名稱空間,並通過Envoy來與後端服務通訊。
在Kubernetes中應用Envoy的Filter並實現WebAssembly(WASM)的過濾器涉及以下幾個步驟:
準備WASM模組:
設定Envoy Filter:
在你的Envoy組態檔中,新增一個Filter設定,指定使用你的WASM模組。
在組態檔中,你可能需要新增類似以下的部分:
filters:
- name: envoy.filters.http.wasm
config:
name: "my_wasm_filter"
root_id: "my_root_id"
vm_config:
code:
local:
filename: "/etc/wasm/ip-rate-limit/main.wasm"
runtime: "envoy.wasm.runtime.v8"
configuration:
"@type": "type.googleapis.com/google.protobuf.StringValue"
value: |
{
"ttlSecond": 60,
"burst": 3
}
my_wasm_filter
、my_root_id
、/etc/wasm/ip-rate-limit/main.wasm
。部署Envoy設定:
監控紀錄檔和錯誤:
測試Filter行為:
admin:
access_log_path: /tmp/admin_access.log
address:
socket_address: { address: 0.0.0.0, port_value: 9901 } #envoy後臺系統的埠
static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 10000 } #envoy路由的埠
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
scheme_header_transformation:
scheme_to_overwrite: https
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/"
route:
cluster: httpbin
http_filters:
- name: wasmdemo
typed_config:
"@type": type.googleapis.com/udpa.type.v1.TypedStruct
type_url: type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
value:
config:
name: wasmdemo
vm_config:
runtime: envoy.wasm.runtime.v8
code:
local:
filename: /etc/wasm/ip-rate-limit/main.wasm
configuration:
"@type": "type.googleapis.com/google.protobuf.StringValue"
value: |
{
"ttlSecond": 60,
"burst": 3
}
- name: envoy.filters.http.router
clusters:
- name: httpbin
connect_timeout: 30s
type: LOGICAL_DNS
# Comment out the following line to test on v6 networks
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: httpbin
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: httpbin_app_service.app_namespace
port_value: 8080
最後,我們把envoy服務的10000埠公開出去,在叢集外就可以存取它了,你的wasm就可以被啟用了;當然將10000埠公開出現的方法有很多,比較通用的方式是將它通過ingress或者阿里higress進行代理,更靈活。