Current Behavior
Write a custom idempot.lua, save it and get an error: schema validate failed: schema not found, path:plugins.custom-idempot
Expected Behavior
No response
Error Logs
/usr/local/openresty//luajit/bin/luajit ./apisix/cli/apisix.lua init
/usr/local/openresty//luajit/bin/luajit ./apisix/cli/apisix.lua init_etcd
trying to initialize the data of etcd
2026/01/12 09:48:27 [warn] 1#1: low address bits of 127.0.0.1/24 are meaningless in /usr/local/apisix/conf/nginx.conf:246
nginx: [warn] low address bits of 127.0.0.1/24 are meaningless in /usr/local/apisix/conf/nginx.conf:246
2026/01/12 09:48:27 [warn[] 55#55: 7 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 52#52: 4 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 54#54: 6 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 49#49: 1 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 53#53: 5 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 51#51: 3 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 50#50: 2 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 56#56: 8 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 59#59: 9 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 52#52: 4 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 55#55: 7 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 53#53: 5 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 51#51: 3 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 56#56: 8 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 50#50: 2 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 49#49: 1 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 54#54: 6 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 59#59: 9 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
Steps to Reproduce
Title
APISIX installed via Helm cannot load custom in-tree plugins even when plugin files and config are present
Environment
APISIX version : 3.14.1-ubuntu
Installation method : Helm Chart
Kubernetes : v1.33.3
Deployment type : traditional
Plugin type : Custom Lua plugin (non-ext-plugin / in-tree style)
What I tried (Steps)
1. Install APISIX via Helm
helm install apisix apisix/apisix \
--namespace apisix \
--create-namespace \
--set gateway.type=NodePort \
--set admin.enabled=true \
--set etcd.persistence.enabled=true
APISIX starts successfully with default plugins.
2. Add a custom in-tree plugin
Create a custom plugin file:
The plugin has a valid structure:
name
priority
schema
access(conf, ctx) implemented
-- custom-access-logger.lua
local core = require("apisix.core")
local schema = {
type = "object",
properties = {},
additionalProperties = false,
}
local _M = {
name = "custom-access-logger",
priority = 100,
version = 1.0,
schema = schema,
}
function _M.log(conf, ctx)
if ngx.status >= 400 then
return
end
if not ctx.custom_ctx then
return
end
local now = ngx.now()
local latency = now - (ctx.custom_ctx.start_time or now)
local access_log = {
event_type = "apisix_access_log",
request_id = ctx.custom_ctx.request_id,
traceparent = ctx.custom_ctx.traceparent,
method = ctx.custom_ctx.method,
uri = ctx.custom_ctx.uri,
status = ngx.status,
latency_ms = math.floor(latency * 1000),
timestamp = os.date("!%Y-%m-%dT%H:%M:%SZ")
}
core.log.info(
"APISIX_ACCESS_LOG ",
core.json.encode(access_log)
)
end
return _M
3. Mount the plugin file into the Pod
Mount the plugin without overwriting built-in plugins, for example:
/usr/local/apisix/custom_plugins/apisix/plugins/custom-context.lua
And configure Lua search path:
apisix :
extra_lua_path : " /usr/local/apisix/custom_plugins/?.lua;;"
4. Enable the plugin in config.yaml
apisix :
plugins :
- custom-context
5. Restart APISIX Pod
kubectl rollout restart deploy apisix -n apisix
Expected Behavior
APISIX should attempt to load custom-context
The plugin should appear in startup logs (e.g. plugin.lua: load(): new plugins)
The plugin should be available for use via Admin API / route configuration
Actual Behavior
APISIX starts normally
No error logs
No warning logs
custom-context never appears in the loaded plugin list
The plugin is silently ignored
Startup logs only show built-in plugins.
Conclusion / Questions
Is it expected behavior that APISIX installed via Helm cannot load new custom in-tree plugins without rebuilding the image ?
Is ext-plugin the only supported extension mechanism for Helm-based deployments?
If so, could this limitation be documented more explicitly in Helm / plugin documentation?
Environment
APISIX version (run apisix version):
Operating system (run uname -a):Linux k8s-master 5.10.134-19.1.al8.x86_64 change: added doc of how to load plugin. #1 SMP Wed Jun 25 10:21:27 CST 2025 x86_64 x86_64 x86_64 GNU/Linux
OpenResty / Nginx version (run openresty -V or nginx -V):use k8s
etcd version, if relevant (run curl http://127.0.0.1:9090/v1/server_info):
APISIX Dashboard version, if relevant:
Plugin runner version, for issues related to plugin runners:
LuaRocks version, for installation issues (run luarocks --version):
Current Behavior
Write a custom idempot.lua, save it and get an error: schema validate failed: schema not found, path:plugins.custom-idempot
Expected Behavior
No response
Error Logs
/usr/local/openresty//luajit/bin/luajit ./apisix/cli/apisix.lua init
/usr/local/openresty//luajit/bin/luajit ./apisix/cli/apisix.lua init_etcd
trying to initialize the data of etcd
2026/01/12 09:48:27 [warn] 1#1: low address bits of 127.0.0.1/24 are meaningless in /usr/local/apisix/conf/nginx.conf:246
nginx: [warn] low address bits of 127.0.0.1/24 are meaningless in /usr/local/apisix/conf/nginx.conf:246
2026/01/12 09:48:27 [warn[] 55#55: 7 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 52#52: 4 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 54#54: 6 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 49#49: 1 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 53#53: 5 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 51#51: 3 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 50#50: 2 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 56#56: 8 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 59#59: 9 [lua] plugin.lua:219: load(): new plugins: {"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-transcode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 52#52: 4 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 55#55: 7 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 53#53: 5 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 51#51: 3 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 56#56: 8 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 50#50: 2 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 49#49: 1 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 54#54: 6 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
2026/01/12 09:48:27 [warn[] 59#59: 9 [lua] plugin.lua:269: load_stream(): new plugins: {"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true}, context: init_worker_by_lua
Steps to Reproduce
Title
APISIX installed via Helm cannot load custom in-tree plugins even when plugin files and config are present
Environment
What I tried (Steps)
1. Install APISIX via Helm
APISIX starts successfully with default plugins.
2. Add a custom in-tree plugin
Create a custom plugin file:
The plugin has a valid structure:
namepriorityschemaaccess(conf, ctx)implemented3. Mount the plugin file into the Pod
Mount the plugin without overwriting built-in plugins, for example:
And configure Lua search path:
4. Enable the plugin in
config.yaml5. Restart APISIX Pod
Expected Behavior
custom-contextplugin.lua: load(): new plugins)Actual Behavior
custom-contextnever appears in the loaded plugin listStartup logs only show built-in plugins.
Conclusion / Questions
ext-pluginthe only supported extension mechanism for Helm-based deployments?Environment
apisix version):uname -a):Linux k8s-master 5.10.134-19.1.al8.x86_64 change: added doc of how to load plugin. #1 SMP Wed Jun 25 10:21:27 CST 2025 x86_64 x86_64 x86_64 GNU/Linuxopenresty -Vornginx -V):use k8scurl http://127.0.0.1:9090/v1/server_info):luarocks --version):