WebAssembly 플러그인으로 웨이포인트 확장하기
WebAssembly 플러그인으로 웨이포인트 확장하기 (Extend waypoints with WebAssembly plugins)
Istio는 TrafficExtension API를 통해 WebAssembly (Wasm) 모듈로 웨이포인트 프록시를 확장하는 기능을 제공해요. 앰비언트 모드에서 TrafficExtension 리소스는 targetRefs를 사용해 웨이포인트 프록시에 부착되어야 해요.
출처: Istio 문서
본문
시작하기 전에 (Before you begin)
- 앰비언트 모드 Getting Started 가이드를 따라 Istio를 설정하세요.
- Bookinfo 샘플 애플리케이션을 배포하세요.
- default 네임스페이스를 앰비언트 메시에 추가하세요.
- 테스트 소스로 curl 샘플 앱을 배포하세요:
$ kubectl apply -f @samples/curl/curl.yaml@
게이트웨이에서 (At a gateway)
쿠버네티스 Gateway API와 함께, Istio는 서비스 메시로의 트래픽 관리를 위한 중앙 집중식 진입점을 제공해요. 게이트웨이 수준에서 TrafficExtension을 구성해서, 게이트웨이를 통과하는 모든 트래픽이 확장된 인증 규칙의 적용을 받도록 할 거예요.
게이트웨이용 WebAssembly 플러그인 구성하기 (Configure a WebAssembly plugin for a gateway)
이 예제에서, 메시에 HTTP Basic auth 모듈을 추가할 거예요. Istio를 구성해 원격 이미지 레지스트리에서 Basic auth 모듈을 가져와 로드하도록 할 거예요. /productpage 호출에 실행되도록 구성할 거예요. 이 단계들은 Executing WebAssembly Modules의 것과 유사하지만, 레이블 선택자 대신 targetRefs 필드를 사용한다는 점이 달라요.
게이트웨이 이름을 가져오세요:
$ kubectl get gateway
NAME CLASS ADDRESS PROGRAMMED AGE
bookinfo-gateway istio bookinfo-gateway-istio.default.svc.cluster.local True 42m
bookinfo-gateway를 대상으로 하는 TrafficExtension을 생성하세요:
$ kubectl apply -f - <<EOF
apiVersion: extensions.istio.io/v1alpha1
kind: TrafficExtension
metadata:
name: basic-auth-at-gateway
spec:
targetRefs:
- kind: Gateway
group: gateway.networking.k8s.io
name: bookinfo-gateway
phase: AUTHN
wasm:
url: oci://ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0
pluginConfig:
basic_auth_rules:
- prefix: "/productpage"
request_methods:
- "GET"
- "POST"
credentials:
- "ok:test"
- "YWRtaW4zOmFkbWluMw=="
EOF
게이트웨이에 인증 필터로 HTTP 필터가 주입돼요. Istio 에이전트가 TrafficExtension 구성을 해석하고, OCI 이미지 레지스트리에서 원격 Wasm 모듈을 로컬 파일로 다운로드하고, 그 파일을 참조해 게이트웨이에 HTTP 필터를 주입해요.
게이트웨이를 통한 트래픽 검증하기 (Verify the traffic via the gateway)
- 자격 증명 없이
/productpage테스트:
$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null "http://bookinfo-gateway-istio.default.svc.cluster.local/productpage"
401
TrafficExtension리소스에 구성된 자격 증명으로/productpage테스트:
$ kubectl exec deploy/curl -- curl -s -o /dev/null -H "Authorization: Basic YWRtaW...Mw==" -w "%{http_code}" "http://bookinfo-gateway-istio.default.svc.cluster.local/productpage"
200
네임스페이스의 모든 서비스에 대해 웨이포인트에서 (At a waypoint, for all services in a namespace)
웨이포인트 프록시는 Istio의 앰비언트 모드에서 중요한 역할을 하며, 서비스 메시 안에서 안전하고 효율적인 통신을 촉진해요. 아래에서는 웨이포인트에 Wasm 구성을 적용해 프록시 기능을 동적으로 강화하는 방법을 살펴볼 거예요.
웨이포인트 프록시 배포하기 (Deploy a waypoint proxy)
웨이포인트 배포 지침을 따라 bookinfo 네임스페이스에 웨이포인트 프록시를 배포하세요:
$ istioctl waypoint apply --enroll-namespace --wait
트래픽이 서비스에 도달하는지 확인하세요:
$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://productpage:9080/productpage
200
웨이포인트용 WebAssembly 플러그인 구성하기 (Configure a WebAssembly plugin for a waypoint)
웨이포인트 게이트웨이 이름을 가져오세요:
$ kubectl get gateway
NAME CLASS ADDRESS PROGRAMMED AGE
bookinfo-gateway istio bookinfo-gateway-istio.default.svc.cluster.local True 23h
waypoint istio-waypoint 10.96.202.82 True 21h
웨이포인트를 대상으로 하는 TrafficExtension을 생성하세요:
$ kubectl apply -f - <<EOF
apiVersion: extensions.istio.io/v1alpha1
kind: TrafficExtension
metadata:
name: basic-auth-at-waypoint
spec:
targetRefs:
- kind: Gateway
group: gateway.networking.k8s.io
name: waypoint
phase: AUTHN
wasm:
url: oci://ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0
pluginConfig:
basic_auth_rules:
- prefix: "/productpage"
request_methods:
- "GET"
- "POST"
credentials:
- "ok:test"
- "YWRtaW4zOmFkbWluMw=="
EOF
구성된 플러그인 보기 (View the configured plugin)
$ kubectl get trafficextension
NAME AGE
basic-auth-at-gateway 28m
basic-auth-at-waypoint 14m
웨이포인트 프록시를 통한 트래픽 검증하기 (Verify the traffic via the waypoint proxy)
- 자격 증명 없이 내부
/productpage테스트:
$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://productpage:9080/productpage
401
- 자격 증명으로 내부
/productpage테스트:
$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic YWRtaW...Mw==" http://productpage:9080/productpage
200
특정 서비스에 대해 웨이포인트에서 (At a waypoint, for a specific service)
reviews 서비스를 대상으로 하는 TrafficExtension을 생성해서, 확장이 reviews 서비스에만 적용되도록 하세요. 이 구성에서 인증 토큰과 프리픽스는 reviews 서비스에 특별히 맞춰져 있어, 그것을 향한 요청만 이 인증 메커니즘의 적용을 받도록 보장해요.
$ kubectl apply -f - <<EOF
apiVersion: extensions.istio.io/v1alpha1
kind: TrafficExtension
metadata:
name: basic-auth-for-service
spec:
targetRefs:
- kind: Service
group: ""
name: reviews
phase: AUTHN
wasm:
url: oci://ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0
pluginConfig:
basic_auth_rules:
- prefix: "/reviews"
request_methods:
- "GET"
- "POST"
credentials:
- "ok:test"
- "MXQtaW4zOmFkbWluMw=="
EOF
서비스를 대상으로 하는 트래픽 검증하기 (Verify the traffic targeting the service)
- 일반
waypoint프록시에 구성된 자격 증명으로 내부/productpage테스트:
$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic YWRtaW...Mw==" http://productpage:9080/productpage
200
reviews서비스용으로 구성된 자격 증명으로 내부/reviews테스트:
$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic MXQtaW...Mw==" http://reviews:9080/reviews/1
200
- 자격 증명 없이 내부
/reviews테스트:
$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://reviews:9080/reviews/1
401
정리 (Cleanup)
TrafficExtension리소스를 제거하세요:
$ kubectl delete trafficextension basic-auth-at-gateway basic-auth-at-waypoint basic-auth-for-service
- 앰비언트 모드 제거 가이드를 따라 Istio와 샘플 테스트 애플리케이션을 제거하세요.