Skip to content

feat: support dynamic modules #5669

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

Xunzhuo
Copy link
Member

@Xunzhuo Xunzhuo commented Apr 6, 2025

What type of PR is this?

What this PR does / why we need it:

Which issue(s) this PR fixes:

Fixes #5668

Release Notes: Yes

@Xunzhuo Xunzhuo requested a review from a team as a code owner April 6, 2025 04:35
@Xunzhuo Xunzhuo force-pushed the feat-dm-support branch 3 times, most recently from 3f82e3a to b81c44c Compare April 6, 2025 05:05
@Xunzhuo Xunzhuo requested a review from mathetake April 6, 2025 05:05
Copy link

codecov bot commented Apr 6, 2025

Codecov Report

Attention: Patch coverage is 78.16092% with 38 lines in your changes missing coverage. Please review.

Project coverage is 70.46%. Comparing base (96c06be) to head (5faec1c).
Report is 224 commits behind head on main.

Files with missing lines Patch % Lines
internal/xds/translator/dynamicmodule.go 71.02% 20 Missing and 11 partials ⚠️
internal/gatewayapi/envoyextensionpolicy.go 84.00% 3 Missing and 1 partial ⚠️
internal/gatewayapi/dynamicmodule.go 92.50% 2 Missing and 1 partial ⚠️
Additional details and impacted files
@@           Coverage Diff            @@
##             main    #5669    +/-   ##
========================================
  Coverage   70.45%   70.46%            
========================================
  Files         217      219     +2     
  Lines       36016    36177   +161     
========================================
+ Hits        25376    25493   +117     
- Misses       9135     9164    +29     
- Partials     1505     1520    +15     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@arkodg
Copy link
Contributor

arkodg commented Apr 6, 2025

  1. EEP is probably not the best place for this, since a bad module can take out the entire proxy, not just the route
  2. Can you share a workflow of how a user will fetch a module into the pod

@zhaohuabing
Copy link
Member

zhaohuabing commented Apr 7, 2025

Some options that I can think of:

  • use a docker image to download dynamic modules. This docker image can be deployed as a side car in the Envoy pod and the lib can be loaded to Envoy via a shared volume.
  • use a customized envoy docker image provided by users. The libs for dynamic modules are already loaded to that image.

@Xunzhuo
Copy link
Member Author

Xunzhuo commented Apr 7, 2025

The first approach can solve the same issues for golang filter, so I'm +1 for this.

Second one needs some prerequisites for features like golang/dynamic module, use envoyproxy to customize the image before using EEP for dm/go filter

@arkodg
Copy link
Contributor

arkodg commented Apr 7, 2025

Some options that I can think of:

  • use a docker image to download dynamic modules. This docker image can be deployed as a side car in the Envoy pod and the lib can be loaded to Envoy via a shared volume.
  • use a customized envoy docker image provided by users. The libs for dynamic modules are already loaded to that image.

this experience is not seamless, so maybe lets first document this in docs post v1.4, and then get feedback, and then we can eliminate the need for the EnvoyPatchPolicy with an API field (maybe in EnvoyProxy) in the future

@mathetake
Copy link
Member

mathetake commented Apr 7, 2025

FYI: Dynamic modules require the exact version match (at least for now), so for example, the modules working with Envoy v1.50.0 are not guaranteed to work with v1.51.0 (if the compatibility check fails, then HTTP filter configuration xds request will be rejected). So, coupling Envoy images would be the safest way; either using the Envoy container itself or with init container downloading (with some version argument). I believe the same restriction applies to golang filter.

So either way, the life cycle of downloading into Envoy container should match the one of Envoy container itself. that's my 2p

@zhaohuabing
Copy link
Member

zhaohuabing commented Apr 8, 2025

@mathetake Thanks for clarifying how dynamic modules need to match the version of Enovy Proxy.

This would be a problem for upgrade - since the ABI version is defined in the abi_version.h, EG can't check if a dynamic module will still be compatible or not after upgrade. Users can only find out after something is broken.

Is there a way for EG to detect an incompatibility between Envoy and a dynamic module, and then surfaced that issue in the status of EG resources?

@mathetake
Copy link
Member

mathetake commented Apr 9, 2025

There's no mechanism to check that without actually loading Envoy. Like i suggested, the current best way is to tie the Envoy container with modules as in the examples or EG introduce some module management init container like the container receives the Envoy version and downloads the specific dynamic modules for that version before Envoy running. To be clear, the same problem exists for golang filter already, and nothing specific to dynamic modules.

@mathetake
Copy link
Member

so i think we can go with this as-is leaving the lifecycle of dynamic modules to users for now, and then we can later add the "managed" installation of remote dynamic modules like in EnvoyProxy API or EnvoyGateway API maybe

apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
  name: envoy-ai-gateway
spec:
  dynamic_modules:
  - name: mymodule
    location:
      url_template: https://foo.bar.com/path/to/${ENVOY_VERSION}/libmymodule.so

@arkodg
Copy link
Contributor

arkodg commented Apr 15, 2025

yah above approach looks good @mathetake, this is maybe hard to predict, but any guesstimate on average and max sizes of the module ?

@mathetake
Copy link
Member

but any guesstimate on average and max sizes of the module ?

shared library is almost the same as normal application binary, so the question would be how large a normal application would be; a few MB at least for Rust and Go, and tens of MB if it contains debug info:

~/dynamic-modules-examples/rust$ ls -hl target/debug/librust_module.so 
-rwxr-xr-x 2 mathetake mathetake 23M Apr 16 01:58 target/debug/librust_module.so

@Xunzhuo
Copy link
Member Author

Xunzhuo commented May 8, 2025

so i think we can go with this as-is leaving the lifecycle of dynamic modules to users for now, and then we can later add the "managed" installation of remote dynamic modules like in EnvoyProxy API or EnvoyGateway API maybe

apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
  name: envoy-ai-gateway
spec:
  dynamic_modules:
  - name: mymodule
    location:
      url_template: https://foo.bar.com/path/to/${ENVOY_VERSION}/libmymodule.so

Why not just directly add this to DM fields EEP API? Like what we did in WASM

@arkodg
Copy link
Contributor

arkodg commented May 8, 2025

so i think we can go with this as-is leaving the lifecycle of dynamic modules to users for now, and then we can later add the "managed" installation of remote dynamic modules like in EnvoyProxy API or EnvoyGateway API maybe

apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
  name: envoy-ai-gateway
spec:
  dynamic_modules:
  - name: mymodule
    location:
      url_template: https://foo.bar.com/path/to/${ENVOY_VERSION}/libmymodule.so

Why not just directly add this to DM fields EEP API? Like what we did in WASM

That will allow a route owner to access another route or even the listener violating its scope of extension

@Xunzhuo Xunzhuo force-pushed the feat-dm-support branch from e3c3251 to 440487c Compare May 8, 2025 03:13
@mathetake
Copy link
Member

So currently a dynamic module's capability is as same as Lua and Wasm so I don't have that concern right now. However yes indeed it can expand to have more broader capability plus a module won't be limited to HTTP filter (might end up having Load balancer extension etc). So loading/distribution of modules should be a separate API vs EEP which purely should focus on the configuration of HTTP filters. That's my 2c

@Xunzhuo Xunzhuo force-pushed the feat-dm-support branch 2 times, most recently from 7fd1249 to 3426de9 Compare May 8, 2025 03:50
@Xunzhuo
Copy link
Member Author

Xunzhuo commented May 8, 2025

That will allow a route owner to access another route or even the listener violating its scope of extension

Get it, thanks for clarifying @arkodg

@Xunzhuo Xunzhuo force-pushed the feat-dm-support branch 2 times, most recently from bcc0517 to cafc4af Compare May 9, 2025 03:17
// For example, no HTTP filters are using the module (e.g. after configuration update).
//
// +optional
DoNotClose *bool `json:"doNotClose,omitempty"`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Even though it's required at Envoy config level, i am not sure if this could be part of EEP - this feels like an option at the EnvoyProxy API level (distribution/loading) rather than filter. not strong opinion

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

@Xunzhuo Xunzhuo force-pushed the feat-dm-support branch from cafc4af to 5faec1c Compare May 12, 2025 11:08
Copy link

This pull request has been automatically marked as stale because it has not had activity in the last 30 days. Please feel free to give a status update now, ping for review, when it's ready. Thank you for your contributions!

@github-actions github-actions bot added stale and removed stale labels Jun 11, 2025
Copy link

This pull request has been automatically marked as stale because it has not had activity in the last 30 days. Please feel free to give a status update now, ping for review, when it's ready. Thank you for your contributions!

@github-actions github-actions bot added stale and removed stale labels Jul 11, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Support dynamic module in EEP
4 participants