Istio Filters
Istio, một trong những nền tảng service mesh phổ biến nhất hiện nay, cung cấp cho chúng ta một loạt các tính năng để quản lý và bảo mật lưu lượng giữa các microservices. Một trong những tính năng quan trọng nhất của Istio là Istio Filters. Vậy Istio Filters là gì và tại sao chúng lại hữu ích?
Istio Filters là gì?
Istio Filters là một cơ chế cho phép chúng ta tùy chỉnh cấu hình của Envoy proxy, một thành phần cốt lõi trong Istio. Envoy proxy đóng vai trò là một sidecar proxy, được triển khai cùng với mỗi microservice để bắt giữ và xử lý tất cả lưu lượng đi vào và đi ra khỏi microservice đó.
Istio Filters cho phép chúng ta:
Thêm các filter mới: Thêm các filter tùy chỉnh vào pipeline xử lý của Envoy để thực hiện các chức năng như logging, authentication, rate limiting, ...
Cấu hình lại các filter hiện có: Thay đổi hành vi của các filter có sẵn để phù hợp với yêu cầu cụ thể của ứng dụng.
Thay đổi thứ tự các filter: Điều chỉnh thứ tự thực thi của các filter để kiểm soát luồng xử lý request và response.
Các layer filter trong Istio
Istio Filters được tổ chức thành các layer khác nhau, mỗi layer có một mục đích cụ thể trong pipeline xử lý của Envoy. Dưới đây là một số layer filter phổ biến:
HTTP Filter:
Xử lý các yêu cầu HTTP/HTTPS và có thể được sử dụng để thực hiện các thao tác như xác thực, ủy quyền, ghi log, chỉnh sửa tiêu đề, và hơn thế nữa.
Các filter phổ biến bao gồm:
Authn Filter: Xác thực người dùng và đảm bảo các yêu cầu tuân thủ chính sách bảo mật.
Authz Filter: Quyết định cho phép hoặc từ chối các yêu cầu dựa trên quyền truy cập.
Cors Filter: Thiết lập chính sách CORS (Cross-Origin Resource Sharing).
Fault Injection Filter: Giả lập các lỗi trong hệ thống, giúp kiểm tra tính chịu lỗi của ứng dụng.
Router Filter: Xác định đường dẫn cho lưu lượng.
Thực hiện các tác vụ liên quan đến HTTP request và response, chẳng hạn như:
Thêm/xóa header
Chuyển mã
Logging
Authentication
Rate limiting
- Ví dụ: Lua filter, Compressor filter, Local rate limit filter
Network Filter:
Xử lý các giao thức mạng không phải HTTP (TCP, UDP) và được áp dụng trên tầng 4 của mô hình OSI.
Các filter phổ biến bao gồm:
TCP Proxy Filter: Kiểm soát lưu lượng TCP và áp dụng các quy tắc proxying.
Mongo Proxy Filter: Quản lý và giám sát lưu lượng MongoDB.
Redis Proxy Filter: Hỗ trợ giám sát và điều khiển lưu lượng Redis.
Thrift Proxy Filter: Xử lý các giao thức dựa trên Thrift.
Thực hiện các tác vụ liên quan đến mạng, chẳng hạn như:
TLS termination
TCP proxy
Ví dụ: TCP proxy filter
Transport Socket Filter:
Thực hiện các tác vụ liên quan đến socket, chẳng hạn như:
Mã hóa
Giảm tải
- Ví dụ: Upstream TLS filter, Downstream TLS filter
Access Log Filter
- Được dùng để ghi log chi tiết về lưu lượng mạng đi qua proxy, giúp theo dõi và phân tích lưu lượng trong hệ thống.
WASM Filter
- Các filter dựa trên WebAssembly (WASM) cho phép tùy chỉnh và mở rộng chức năng của proxy Envoy. Lập trình viên có thể viết các filter tùy chỉnh bằng WASM và thêm vào Istio để xử lý các yêu cầu theo yêu cầu riêng biệt của tổ chức.
Tại sao Istio Filters lại quan trọng?
Tùy biến cao: Istio Filters cho phép chúng ta tùy chỉnh hành vi của Envoy proxy một cách rất linh hoạt, giúp đáp ứng các yêu cầu cụ thể của từng ứng dụng.
Mở rộng: Chúng ta có thể tạo ra các filter tùy chỉnh để thực hiện các chức năng đặc biệt mà không cần phải sửa đổi code của Envoy.
Kiểm soát lưu lượng: Istio Filters giúp chúng ta kiểm soát chặt chẽ lưu lượng đi qua Envoy proxy, đảm bảo tính bảo mật và hiệu năng của hệ thống.
Ví dụ thực tế
Thực hiện authentication: Sử dụng HTTP filter để thêm cơ chế authentication vào ứng dụng, đảm bảo chỉ những request hợp lệ mới được xử lý.
Thực hiện rate limiting: Sử dụng HTTP filter để giới hạn số lượng request mà một client có thể gửi đến server trong một khoảng thời gian nhất định, tránh quá tải hệ thống.
Logging: Sử dụng HTTP filter để log các thông tin chi tiết về request và response, giúp chúng ta dễ dàng theo dõi và debug hệ thống.
EnvoyFilter
cho phép bạn tùy chỉnh cấu hình của proxy Envoy một cách linh hoạt hơn cho từng namespace hoặc dịch vụ cụ thể. Dưới đây là vài ví dụ về cách dùng EnvoyFilter
để thiết lập Access Log:
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: full-access-log
namespace: default
spec:
workloadSelector:
labels:
app: my-app # Định danh cho workload cụ thể
configPatches:
- applyTo: NETWORK_FILTER
match:
listener:
filterChain:
filter:
name: "envoy.http_connection_manager"
patch:
operation: MERGE
value:
typed_config:
"@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager"
access_log:
- name: "envoy.access_loggers.file"
typed_config:
"@type": "type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog"
path: "/dev/stdout"
log_format:
json_format:
trace_id: "%REQ(X-B3-TraceId)%" # Prefix với traceID lấy từ header X-B3-TraceId
start_time: "%START_TIME%"
method: "%REQ(:METHOD)%"
path: "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%"
protocol: "%PROTOCOL%"
response_code: "%RESPONSE_CODE%"
response_flags: "%RESPONSE_FLAGS%"
duration: "%DURATION%"
upstream_service_time: "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%"
request_headers: "%REQ_WITH_HEADERS%" # Toàn bộ header của request
response_headers: "%RESP_WITH_HEADERS%" # Toàn bộ header của response
request_body: "%REQ_BODY%" # Body của request
response_body: "%RESP_BODY%" # Body của response
bytes_received: "%BYTES_RECEIVED%"
bytes_sent: "%BYTES_SENT%"
trace_id: Trích xuất trace ID từ header
X-B3-TraceId
, thường được dùng trong các hệ thống tracking.request_headers và response_headers: Sử dụng
%REQ_WITH_HEADERS%
và%RESP_WITH_HEADERS%
để ghi lại toàn bộ header của yêu cầu và phản hồi.request_body và response_body:
%REQ_BODY%
và%RESP_BODY%
để log toàn bộ nội dung body của yêu cầu và phản hồi.
#Ghi Log Theo Điều Kiện (Chỉ Ghi Lại Lỗi)
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: error-log
namespace: default
spec:
workloadSelector:
labels:
app: my-app
configPatches:
- applyTo: NETWORK_FILTER
match:
listener:
filterChain:
filter:
name: "envoy.http_connection_manager"
patch:
operation: MERGE
value:
typed_config:
"@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager"
access_log:
- name: "envoy.access_loggers.file"
typed_config:
"@type": "type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog"
path: "/dev/stdout"
filter:
response_flag_filter:
flags:
- "UH" # Lỗi không tìm thấy upstream host
- "NR" # Không có route
log_format:
json_format:
start_time: "%START_TIME%"
response_code: "%RESPONSE_CODE%"
upstream_host: "%UPSTREAM_HOST%"
response_flags: "%RESPONSE_FLAGS%"
duration: "%DURATION%"
Subscribe to my newsletter
Read articles from Kilo directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by