Plugin support is a powerful feature that allows developers to add new functionality to Traefik and define new behaviors. For example, plugins can modify requests or headers, issue redirects, add authentication, and so on, providing similar functionality to Traefik middleware; they can be used as a Traefik provider to allow providing configuration from a new infrastructure component such as an orchestrator or a cloud provider.
Unlike traditional middleware or providers, however, plugins are loaded dynamically and executed by an embedded interpreter. There is no need to compile binaries and all plugins are 100% cross-platform, making them easy to develop and share with the broader Traefik community.
Traefik operators can browse and install plugins from the online catalog, which is available from the Plugin Catalog.
Selecting Install Plugin will display the necessary code to be added to the Traefik proxy's static and/or dynamic configurations to complete the installation process.
Choosing a plugin's tile brings up a page describing the plugin's function and, optionally, the configuration options available for it.
For a plugin to be active for a given Traefik instance, it must be declared in the static configuration. The code to be added is provided by the Plugin Catalog UI when you choose Install Plugin.
Plugins are parsed and loaded exclusively during startup, which allows Traefik to check the integrity of the code and catch errors early on. If an error occurs during loading, the plugin is disabled.
Once loaded, these plugins behave like statically compiled middlewares. Their instantiation and behavior are driven by the dynamic configuration.
In the examples below, we add the blockpath
and rewritebody
plugins in the Traefik Static Configuration:
[entryPoints][entryPoints.web]address = ":80"[experimental.plugins][experimental.plugins.block]modulename = "github.com/traefik/plugin-blockpath"version = "v0.2.0"[experimental.plugins.rewrite]modulename = "github.com/traefik/plugin-rewritebody"version = "v0.3.0"
Some plugins will need to be configured by adding a dynamic configuration.
For the bodyrewrite
plugin, for example:
apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata:name: my-rewritebodyspec:plugin:rewrite:rewrites: - regex: examplereplacement: test
Once loaded, these plugins behave like statically compiled providers. Their instantiation and behavior are driven by the static configuration.
In the examples below, we add and configure the service-fabric-plugin
plugin in the Traefik Static Configuration:
[entryPoints][entryPoints.web]address = ":80"[experimental.plugins][experimental.plugins.traefikServiceFabricPlugin]modulename = "github.com/dariopb/traefikServiceFabricPlugin"version = "v0.2.2"[provider.plugin.traefikServiceFabricPlugin]pollInterval = "4s"clusterManagementURL = "http://dariotraefik1.southcentralus.cloudapp.azure.com:19080/"
Traefik also offers a local mode that can be used for:
To use a plugin in local mode, the Traefik static configuration must define the module name (as is usual for Go packages) and a path to a Go workspace, which can be the local GOPATH or any directory.
The plugins must be placed in ./plugins-local
directory, which should be in the working directory of the process running the Traefik binary.
The source code of the plugin should be organized as follows:
./plugins-local/└── src└── github.com└── traefik└── plugindemo├── demo.go├── demo_test.go├── go.mod├── go.sum├── LICENSE├── Makefile├── readme.md└── vendor├── github.com│ └── traefik│ └── genconf│ ├── dynamic│ │ ├── config.go│ │ ├── http_config.go│ │ ├── marshaler.go│ │ ├── middlewares.go│ │ ├── plugins.go│ │ ├── tcp_config.go│ │ ├── tls│ │ │ ├── certificate.go│ │ │ └── tls.go│ │ ├── types│ │ │ ├── domains.go│ │ │ └── tls.go│ │ └── udp_config.go│ └── LICENSE└── modules.txt
[entryPoints][entryPoints.web]address = ":80"[experimental.localPlugins][experimental.localPlugins.traefikServiceFabricPlugin]modulename = "github.com/dariopb/traefikServiceFabricPlugin"[provider.plugin.traefikServiceFabricPlugin]pollInterval = "4s"clusterManagementURL = "http://dariotraefik1.southcentralus.cloudapp.azure.com:19080/"
In the above example, the plugindemo
plugin will be loaded as a localPlugins
from the path ./plugins-local/src/github.com/traefik/plugindemo
instead of being downloaded from the internet.