프로그래밍/이것저것_개발일지

tinygo로 Wasm filter 만들어서 istio에 envoy plugin으로 붙이기

inspirit941 2024. 4. 11. 21:16
반응형

eventing-kafka-broker로 외부의 cloudevent를 받아서 Fanout하는 기능을 만들고 있었는데

  • event source별로 순서 보장이 필요하지만
  • cloudevent 보내는 쪽의 로직을 변경할 수 없는

상황을 해결하기 위한 여러 작업 중 하나.


 

 

외부 cloudevent 이벤트를 받아서 kafka에 저장할 때, cloudevent spec에서 제공하는 paritionkey라는 옵션을 쓰면 된다.

 

spec/cloudevents/extensions/partitioning.md at main · cloudevents/spec

CloudEvents Specification. Contribute to cloudevents/spec development by creating an account on GitHub.

github.com

 

 

eventing-kafka-broker 소스코드를 건드리지 않은 채 header 변경을 해야 하는 상황.

istio sidecar에 envoy extension을 어떻게 잘 쓰면 가능할 것 같았다.

  • knative 쓰면서 istio도 마침 활용하고 있었고
  • 네트워크 관련 커스텀은 envoy를 직접 핸들링할 수 있기 때문.

 

 

envoy extension을 다루려면 Lua Script 또는 WebAssembly (Wasm) 이 필요한데,

k8s 다루느라 go가 가장 익숙한 상황에서 tinygo로 wasm binary를 만들 수 있다고 해서 테스트해 보았다.

 

 

cf. 최근에 tinygo wasm 관련 글을 보니, tinygo의 GC에 불필요한 메모리 소모가 많아서 Wasm에 적합하지 않다는 결론이 났다.
tinygo wasm SDK도 지원 종료됐다.

 

wasm이 필요하다면 다른 방법을 찾아보는 것이 좋을 듯.

 

 

소스코드는 아래 github에서 확인할 수 있다.

 

https://github.com/inspirit941/wasm-tinygo-istio

 

GitHub - inspirit941/wasm-tinygo-istio: wasm plugin example using tinygo

wasm plugin example using tinygo. Contribute to inspirit941/wasm-tinygo-istio development by creating an account on GitHub.

github.com

 

 


트러블슈팅했던 것들 기록

 

wasm-extensions/doc/how-to-build-oci-images.md at master · istio-ecosystem/wasm-extensions

Contains miscellaneous Wasm extensions for Istio. Contribute to istio-ecosystem/wasm-extensions development by creating an account on GitHub.

github.com

 

cf. tinygo로 빌드 binary를 생성하려면, docker의 root 권한이 필요하다.
없으면 plugin.wasm 생성할 때 permission denied가 발생한다.

 

 

knative broker 컴포넌트 중 하나인 kafka-broker-receiver에 istio injection이 되어 있어야 한다.
그래야 wasm이 istio extension으로 붙어서 동작한다.

 

 

  • wasm yaml이 배포되더라도, 기존에 동작하고 있던 pod + sidecar는 동적으로 반영되지 않는다. pod을 재시작해줘야 함.
    • 코드 잘못 짜면 istio-proxy pod에서 postStartHook fail이 발생한다 (wasm 추가하는 시점이 postStart).
    • 따라서 기존 pod을 삭제하는 식으로 재시작하지 말고,
      replica를 증가시키는 방식으로 변경사항을 적용해야 문제가 생기지 않는다.
  • plugin.wasm 이름이 바뀌면 istio-proxy에서 plugin을 읽지 못한다.
    wasm 이름을 명시해서 해결하는 방법이 있겠지만, 여기서는 적용하지 않았다.
반응형