Skip to content

help request: The APISIX installed on Helm on Kubernetes does not support the integration of custom plugins. #12890

@EthanSivan

Description

@EthanSivan

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:

custom-context.lua

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):

Metadata

Metadata

Assignees

No one assigned

    Labels

    pluginquestionlabel for questions asked by users

    Type

    No type
    No fields configured for issues without a type.

    Projects

    Status

    ✅ Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions