Lua 스크립트 실행하기
Lua 스크립트 실행하기
TrafficExtension API를 사용해서 인라인 Lua 스크립트로 프록시 기능을 확장하는 방법을 알려드려요.
출처: Istio 문서
본문
Istio는 TrafficExtension API를 통해 인라인 Lua 스크립트로 프록시 기능을 확장할 수 있는 기능을 제공해요.
Lua 필터는 단순한 요청·응답 변환을 위한 WebAssembly의 가벼운 대안이에요. 스크립트가 리소스에 직접 포함되고 Envoy 프록시 안에서 실행되며, 모듈 배포가 필요 없어요.
시작하기 전에
Bookinfo 샘플 애플리케이션을 배포해요.
Lua 스크립트 설정
Lua 스크립트는 다음 함수 중 하나 또는 둘 다를 정의해야 해요:
envoy_on_request(request_handle): 각 인바운드 요청마다 호출됨envoy_on_response(response_handle): 각 아웃바운드 응답마다 호출됨
핸들은 헤더, 바디, 메타데이터, 로깅에 대한 접근을 제공해요. 전체 API는 Envoy Lua filter 문서를 참고하세요.
이 예시에서는 x-number 요청 헤더를 읽고, 값이 odd인지 even인지를 나타내는 x-parity 헤더로 응답하는 Lua 필터를 ingress 게이트웨이에 추가할 거예요. 값은 요청 처리 중에 읽히고 동적 메타데이터에 저장되어 응답 헤더를 쓸 때 사용할 수 있어요:
$ kubectl apply -f - <<EOF
apiVersion: extensions.istio.io/v1alpha1
kind: TrafficExtension
metadata:
name: parity
namespace: istio-system
spec:
selector:
matchLabels:
istio: ingressgateway
phase: AUTHN
lua:
inlineCode: |
function envoy_on_request(request_handle)
local number = tonumber(request_handle:headers():get("x-number"))
if number == nil then return end
local parity = number % 2 == 0 and "even" or "odd"
request_handle:streamInfo():dynamicMetadata():set(
"envoy.filters.http.lua", "parity", parity)
end
function envoy_on_response(response_handle)
local meta = response_handle:streamInfo():dynamicMetadata():get(
"envoy.filters.http.lua")
if meta == nil then return end
response_handle:headers():add("x-parity", meta["parity"])
end
EOF
Lua 스크립트 검증
x-number 헤더로 요청을 보내고 응답에 x-parity가 설정되어 있는지 확인해요:
$ curl -s -o /dev/null -D - -H "x-number: 42" "http://$INGRESS_HOST:$INGRESS_PORT/productpage" | grep x-parity
x-parity: even
$ curl -s -o /dev/null -D - -H "x-number: 7" "http://$INGRESS_HOST:$INGRESS_PORT/productpage" | grep x-parity
x-parity: odd
순서와 범위
여러 TrafficExtension 리소스가 같은 워크로드를 대상으로 할 때, 실행 순서는 phase와 priority로 제어돼요.
- **
phase**는 필터 체인에서의 넓은 위치를 설정해요:AUTHN,AUTHZ, 또는STATS. phase가 없는 확장은 라우터 앞, 체인의 끝 근처에 삽입돼요. - **
priority**는 같은 phase 안에서의 순위를 가른다. 값이 높을수록 먼저 실행돼요.
match 필드는 모드와 포트로 TrafficExtension을 특정 트래픽으로 제한해요:
spec:
match:
- mode: SERVER
ports:
- number: 8080
유효한 모드는 CLIENT(아웃바운드), SERVER(인바운드), CLIENT_AND_SERVER(둘 다, 기본값)예요.
정리
$ kubectl delete trafficextension -n istio-system parity