By Venkata Reddy Bhavanam
Author LinkedIn:https://www.linkedin.com/in/venkatareddybhavanam/
This is the second post on installing a custom plugin in Kong API Gateway. Please check out the 1st post if you need a quick introduction to Kong and how to install a custom plugin in a VM.
In this post, we’ll learn how to install a custom plugin in Docker.
We’ll use the same custom plugin code as we used in the previous post.
Copying the code over here for completeness. The folder structure:
api-version/
├── handler.lua
└── schema.lua
The plugin name api-version
and the contents of schema.lua
local typedefs = require "kong.db.schema.typedefs"
local PLUGIN_NAME = "api-version"
local schema = {
name = "api-version",
fields = {
{ consumer = typedefs.no_consumer }, -- this plugin cannot be configured on a consumer (typical for auth plugins)
{ protocols = typedefs.protocols_http },
{ config = {
type = "record",
fields = {
{ request_header = typedefs.header_name {
required = true,
default = "Hello-World" } },
{ response_header = typedefs.header_name {
required = true,
default = "Bye-World" } },
},
entity_checks = {
{ at_least_one_of = { "request_header", "response_header" }, },
{ distinct = { "request_header", "response_header"} },
},
},
},
},
}
return schema
Contents of handler.lua
:
local typedefs = require "kong.db.schema.typedefs"
local PLUGIN_NAME = "api-version"
local schema = {
name = "api-version",
fields = {
{ consumer = typedefs.no_consumer }, -- this plugin cannot be configured on a consumer (typical for auth plugins)
{ protocols = typedefs.protocols_http },
{ config = {
type = "record",
fields = {
{ request_header = typedefs.header_name {
required = true,
default = "Hello-World" } },
{ response_header = typedefs.header_name {
required = true,
default = "Bye-World" } },
},
entity_checks = {
{ at_least_one_of = { "request_header", "response_header" }, },
{ distinct = { "request_header", "response_header"} },
},
},
},
},
}
return schema
Building the docker image:
We’ll take a base Kong image, add the plugin(and dependencies, if any), and use the final image. The Dockerfile
FROM kong/kong-gateway:3.2.2.1
**USER root**
# luarocks install dependency-name # to install any dependencies for cusotm plugin
RUN mkdir /usr/local/share/lua/5.1/kong/plugins/api-versionCOPY ./api-version /usr/local/share/lua/5.1/kong/plugins/api-version
Here, we are taking Kong base image kong/kong-gateway:3.2.2.1 and adding our plugin code.
We can now build it and run it with the following:
docker build -t kong-demo .
docker run -d --name kong-demo \
-p "8000-8001:8000-8001" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001" \
-e "KONG_PROXY_LISTEN=0.0.0.0:8000" \
-e "KONG_DATABASE=off" \
-e "KONG_LOG_LEVEL=debug" \
-e "KONG_PLUGINS=bundled,api-version" \
kong-demo
As you can see, we specify the custom plugin name along with the bundled plugins using KONG_PLUGINS
environment variable.
Kong can be run either in DB mode using Postgres (and Cassandra, but it will be deprecated) or DB Less mode. We’ll use db-less mode and the following declarative config to create a service, route, and apply the plugin for this demo.
config.yaml
_format_version: "3.0"
_transform: trueservices:
- name: demo
url: https://mockbin.org
plugins:
- name: api-version
routes:
- name: demo-route
paths:
- /echo
Create the config with an API call to the admin API.
curl -X POST http://localhost:8001/config -F config=@config.yam
l
Verify the custom plugin works by visiting the proxy URL. We’ll use HTTPie
http :8000/echo --headers
HTTP/1.1 200 OK
Bye-World: 0.1
...
That’s it. In the next post, we’ll see how to install the custom plugin in Kubernetes.
For more information: https://zelarsoft.com/
Top comments (0)