部署 Lua 自定义插件
当内置插件无法满足需求时,可以通过开发自定义插件扩展网关能力。
本指南介绍如何在 Kubernetes 上将 Lua 自定义插件加载到网关,并通过 APISIX 或 API7 Ingress Controller 在路由上启用该插件。
前提条件
- 完成设置 Ingress Controller 和网关。
- 阅读 Lua 自定义插件指南,并将
file-proxy.lua保存为示例自定义插件文件。
加载自定义插件
- APISIX
- API7 企业版
基于自定义插件文件生成 ConfigMap:
# Replace with your file path
FILE_PATH="/path/to/file-proxy.lua"
kubectl create configmap custom-file-proxy --from-file="$FILE_PATH"
升级安装配置,挂载包含 file-proxy.lua 插件的自定义 ConfigMap,并将其与默认插件一起启用:
helm upgrade -n aic apisix apisix/apisix \
--set ... \ # add other parameters
--set "apisix.customPlugins.enabled=true" \
--set "apisix.customPlugins.plugins[0].name=file-proxy" \
--set "apisix.customPlugins.plugins[0].attrs={}" \
--set "apisix.customPlugins.plugins[0].configMap.name=custom-file-proxy" \
--set "apisix.customPlugins.plugins[0].configMap.mounts[0].key=file-proxy.lua" \
--set "apisix.customPlugins.plugins[0].configMap.mounts[0].path=/usr/local/apisix/apisix/plugins/file-proxy.lua" \
--set "apisix.plugins={file-proxy}"
Caution about
apisix.plugins={file-proxy}该参数只会将 file-proxy 插件加入插件列表,并覆盖所有默认插件。如需在不移除现有插件的情况下添加自定义插件,请在 apisix.plugins 列表中同时包含现有插件名称。
或者,也可以在 values 文件中更新这些值。先导出所有 values(包括默认值):
helm get values -n aic apisix --all > values.yaml
更新以下配置段:
values.yaml
apisix:
# ...
customPlugins:
enabled: true
plugins:
- name: "file-proxy"
attrs: {}
configMap:
name: "file-proxy-config"
mounts:
- key: "file-proxy.lua"
path: "/usr/local/apisix/apisix/plugins/file-proxy.lua"
plugins:
- ... # make sure to include other plugins
- file-proxy
升级 Helm release:
helm upgrade -n aic apisix apisix/apisix -f values.yaml
如果你使用 API7 企业版,可以在 API7 控制台上加载自定义插件。
测试 Custom Plugin
在网关实例上存储一个静态 openapi.yaml 文件:
kubectl exec -it <your-gateway-pod-name> -- /bin/sh -c "echo '
openapi: 3.0.1
info:
title: OpenAPI Spec
description: OpenAPI Spec file description.
' > /usr/local/apisix/openapi.yaml"
创建带有自定义插件的路由,该插件会使用 openapi.yaml 文件:
- Gateway API
- APISIX CRD
file-proxy-route.yaml
apiVersion: apisix.apache.org/v1alpha1
kind: PluginConfig
metadata:
namespace: aic
name: file-proxy-plugin-config
spec:
plugins:
- name: file-proxy
config:
path: /usr/local/apisix/openapi.yaml
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: aic
name: openapi-file-proxy
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: Exact
value: /openapi.yaml
filters:
- type: ExtensionRef
extensionRef:
group: apisix.apache.org
kind: PluginConfig
name: file-proxy-plugin-config
file-proxy-route.yaml
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: aic
name: openapi-file-proxy
spec:
ingressClassName: apisix
http:
- name: openapi-file-proxy
match:
paths:
- /openapi.yaml
plugins:
- name: file-proxy
enable: true
config:
path: /usr/local/apisix/openapi.yaml
将配置应用到集群:
kubectl apply -f file-proxy-route.yaml
向路由发送请求:
curl "http://127.0.0.1:9080/openapi.yaml"
你应收到包含 openapi.yaml 文件内容的响应:
openapi: 3.0.1
info:
title: OpenAPI Spec
description: OpenAPI Spec file description.
这表示自定义插件已成功加载并正常工作。