Why Kafka Connect plugins need a managed install path
A team that needs several connectors on Kafka Connect workers has to decide three things early: how plugins get onto each worker, how the workers find them, and how they are upgraded without breaking running pipelines. In Connect terms, a plugin is a packaged set of connector, converter, transform or predicate classes that a worker loads at startup or on demand. Connectors are not part of the Kafka broker, so every connector your pipelines use is code you add to the Connect runtime. That is why an unmanaged install, where JARs are copied by hand onto different workers, becomes hard to reproduce, audit or roll back once a second or third connector is added.
Apache Kafka itself is released under the Apache License 2.0 (SPDX: Apache-2.0), and the project offers no paid edition. The supported releases listed on the Kafka downloads page are 4.3.1, 4.2.2 and 4.1.2. Since Kafka 4.0, brokers, Kafka Connect and tools require Java 17, so the worker image or host JVM must meet that baseline before any plugin is tested. Confirm the Java runtime on every worker, and check each connector's own licence and supported Kafka version, because the framework licence does not cover third-party plugins.
Before the first connector goes live, write down the plugin layout: which directories are listed in plugin.path, who may write to them, and how a release is promoted from test to production workers. A deliberate layout makes the next steps (discovery mode, version isolation and vetting of plugin code) possible to verify. Ask your team to confirm that every worker in a cluster loads the same plugin set, since a mismatch is a common cause of connectors that start on one worker and fail on another.
Plugin.path layout and discovery options and when each fits
This table compares the main ways to lay out connector plugins under plugin.path and how they reach worker nodes. Read each row against your upgrade cadence, your rollback needs and how many connector versions you run side by side. The main takeaway is that the layout you choose decides how hard upgrades, rollbacks and version conflicts will be later.
| Option | When it fits | What it makes harder | What to confirm |
|---|---|---|---|
| Single shared plugin directory | Small clusters with few connectors and one owner who installs every plugin | Upgrades touch every connector at once, rollback means restoring old jars, and two versions of one library can collide | Which plugin.path entries your release accepts and whether duplicate plugin classes are reported at startup |
| One directory per connector and version | Teams that upgrade connectors independently and need to keep the previous version on disk for rollback | Directory sprawl, more paths to list in plugin.path, and a need to remove unused versions on a schedule | How the worker resolves a plugin class that appears in more than one path for your release |
| Plugins baked into a container image | Kubernetes deployments where each image tag must match a tested set of connectors | Every connector change needs a new image build, and rollback means redeploying the prior image | How your build pipeline pins plugin artifact versions and checksums |
| Plugins on a mounted volume | Environments where connector jars change without rebuilding the worker image | Shared volume writes must be controlled, and a partial copy can leave the worker with mixed versions | Whether workers read plugin.path only at startup and how a restart is required after changes |
| Discovery mode left at default | Connectors that follow the standard plugin interface and need no extra service registration | Plugins that rely on legacy service files may not be found if they are not written for the mode | Which discovery modes your release supports and what the worker logs when a plugin is skipped |
| Discovery with service_load compatibility | Older connector packages that register through META-INF service files | Scanning takes longer, and the same class may appear through more than one discovery path | The documented service_load setting in the Connect configuration reference for the release in use |
Choosing a plugin layout for VMs, containers and Kubernetes
On VMs or bare-metal Connect workers, plugins reach the worker as directories on local disk or a shared mount, listed in the plugin.path setting of the worker configuration. Your team copies connector archives into a versioned directory, points the worker at it and restarts the process. Nothing in the platform builds an image, so the artifact is whatever your configuration management or release tooling places on disk.
- Delivery path: configuration management or a release script copies plugin directories to each worker, so every node must receive identical contents.
- Build and signing: your team downloads or builds connector archives, verifies the publisher's checksums or signatures, and stores approved copies in an internal artifact repository.
- Rollback: keep the previous plugin directory in place, repoint the path or symlink, and restart the worker. Confirm how running connector tasks restart on your Kafka version.
- Platform team owns: file permissions, drift detection across workers, operating system and JVM patching, and the approved plugin inventory.
Check that every worker reports the same plugin set after each change, because a single drifted node can cause tasks to fail only when they are scheduled onto it.
Container-based workers bake connector plugins into an image at build time, so the image tag or digest identifies exactly what runs. The image is built from a base image plus plugin directories, and a rollout replaces the worker containers with the new image. A rollback redeploys the previous digest, which restores the code that was running before.
- Delivery path: a CI pipeline builds the image and pushes it to your registry, and workers pull a pinned digest rather than a floating tag.
- Build and signing: the pipeline records plugin versions and checksums in the build metadata, scans the image and signs it with a key your team controls.
- Rollback: redeploy the previous image digest. Connector configurations are stored separately, so confirm that the image swap does not reset them in your deployment model.
- Platform team owns: base image selection, CI credentials, registry access, the vulnerability scanning policy and the rebuild schedule when a base image or plugin receives a patch.
Confirm that connector configuration and the plugin set are versioned together, so that a rollback restores both the code and the settings that depend on it.
With a Kubernetes operator, you describe the Connect cluster and its plugins as custom resources, and the operator reconciles the workers and connectors from that declared state. Ask the operator project which plugin delivery methods it supports, such as building images from artifact references or consuming prebuilt images, and how it handles version changes. Strimzi is one example to confirm for your release, since its documented plugin workflow should be checked against your Kafka version rather than assumed.
- Delivery path: the operator reconciles the Connect resource. Confirm whether it builds a new image from declared plugin artifacts or expects a prebuilt image.
- Build and signing: artifact sourcing, checksum verification and signing remain your responsibility unless the operator documents them. Confirm this before you depend on it.
- Rollback: revert the custom resource to the prior image or plugin reference and let reconciliation roll the workers back. Confirm how connectors behave during the change.
- Platform team owns: the operator version and its custom resource definition upgrades, role-based access, secrets for connector credentials and the git repository that holds the declared state.
Test a rollback in a non-production namespace before you rely on it, because operator behavior during plugin changes can differ between versions.
How service_load compatibility changes which plugins start
Kafka Connect finds connector plugins in two ways, and the difference decides which of your plugins actually load. Plugins that ship META-INF/services entries register their classes through Java's ServiceLoader mechanism, so the worker can find them without any extra help. Plugins that lack those entries can only be found by scanning the plugin path and reading class metadata, which is slower and less predictable. The plugin.discovery setting controls how the worker combines these approaches, and its service_load value is the compatibility mode that accepts plugins relying on ServiceLoader metadata. Before you change anything, confirm the exact mode names, their defaults and any warnings in the Kafka Connect configuration documentation for the release you run, since these settings have changed across versions.
The surprise usually comes from mixing plugin sets. A plugin folder that loads cleanly under one discovery mode can silently disappear after an upgrade or a configuration change, and the connector then fails with a class-not-found error that looks like a packaging fault. Mixed sets are the common trigger: a connector pack from one vendor may include service entries while a community connector from another does not, and each behaves differently when the worker's discovery mode changes. Check the worker startup log for each plugin's discovery result and compare it against the plugin inventory you keep for each cluster, rather than assuming that a plugin present on disk is a plugin the worker has loaded.
Test this before production, on a worker built from the same image and plugin path as production. Start the target Kafka Connect version with the planned discovery mode, list the loaded plugins through the REST API, and create one instance of every connector class the pipelines use. Repeat the test after any upgrade, including a plugin version bump, because a new plugin release may add or drop service entries. Record the results in the change ticket so that a failed plugin is caught in staging, not during an incident. If a plugin will not load under the mode you need, the decision is between repackaging it with service entries and changing the discovery mode, and that choice should be made with the connector owner, not during a rollout.
How to install and verify a connector plugin on Connect workers
This sequence takes a connector from an approved inventory entry to a verified plugin on a non-production Connect cluster. Each step ends with a check that the plugin loaded, so the team knows the artifact works before it reaches production workers.
Inventory connectors and their licenses
The platform owner lists every connector the pipelines need, with its exact version, source repository, license identifier and the team that will own it. Confirm each license against the connector's own repository and your legal review before anything is downloaded. The list is complete when every planned connector has an approved entry and a named owner, and no artifact is queued without one.
Set plugin.path to a dedicated directory
The Connect platform engineer sets the plugin.path key in each worker's configuration to one dedicated directory that holds only connector plugins, owned by the service account that runs Connect and not writable by ordinary users. Keep the directory outside the worker's own libraries. The check is that the path resolves to the intended directory on every worker and that the directory is read-only for other accounts.
Stage each artifact in a versioned directory
The engineer copies the connector archive or unpacked JARs into a subdirectory named for the connector and exact version, so two versions of one connector never share a directory. Record the checksum from the publisher and compare it with the file on disk before the copy is placed under plugin.path. The step is done when the checksum matches the recorded value and the directory contains only that connector's files.
Restart or reload workers per the documented procedure
The platform engineer restarts workers one at a time, following the Connect procedure for the running Kafka version, so the rest of the cluster keeps serving tasks. Confirm in the upgrade and operations documentation whether a plain restart is enough for the release in use. The check is that each worker rejoins the Connect group and reports healthy status before the next worker is restarted.
Confirm the plugin in the connector plugin list
The engineer queries the Connect REST API for the list of installed connector plugins and confirms the expected class name and version appear on every worker. If the plugin is missing, check the worker logs for loading errors and confirm the plugin.path value and directory layout. The step is complete when the plugin is listed on all workers, and any missing or duplicate entries are explained and resolved.
Validate discovery mode and service loading
The engineer checks how the connector registers itself and confirms the plugin discovery mode configured on the workers matches what the connector's packaging supports. Connectors that rely on service loader files need those files intact in the archive, and older plugins may need compatibility settings that must be confirmed in the Kafka documentation for your version. The check is a successful plugin listing that also shows the connector config definitions when queried.
Run a test connector in a non-production cluster
Before production use, the team creates a test connector on a non-production Connect cluster that runs the same Kafka and Connect versions, using synthetic or masked data and a dedicated test topic. The connector should reach the RUNNING state for its connector and tasks, and the team should confirm records flow end to end and that errors are logged as expected. The sequence is complete when the test passes, the result is recorded with the artifact checksum, and the test connector is removed.
Trusting plugin code before it runs in your cluster
A connector plugin runs inside a Connect worker with the worker's network reach and credentials, so the plugin is code you are trusting with your data. The six controls below cover how plugin artifacts arrive, who can change them, how they are reviewed, which credentials touch them and what the Kafka side allows them to do.
Verify artifact provenance and checksums
Download connector archives only from the publisher's release location, record the checksum the publisher publishes, and verify it before the archive enters your build. Keep the source URL, version and digest together in your plugin inventory so any later plugin can be traced to a specific release. For illustrative purposes, a jar rebuilt from a mirror without a matching digest should be treated as a new, unreviewed artifact.
Restrict write access to plugin directories
Plugin directories listed in plugin.path should be writable only by the build pipeline and readable by the Connect service account. A worker that can write to its own plugin path can be altered by any process that compromises it. Confirm the file ownership and mode on every worker image or host, and check that no runtime mount grants write access to the plugin tree.
Scan and review licenses before approval
Run a dependency and vulnerability scan on each plugin archive and its transitive libraries, then review the license of the connector itself. Record the approving owner and the scan result before the plugin version is promoted. Licensing terms for some connectors differ from the Kafka project's Apache License 2.0, so the review should confirm the terms that apply to the version you intend to run.
Separate build and runtime credentials
The identity that fetches and packages plugins should not be the identity that runs connectors. Build credentials can reach artifact repositories and signing keys, while runtime credentials reach databases and Kafka topics. Keep them in different secret stores with different scopes, so a compromised build job cannot read the data a connector moves.
Grant least-privilege ACLs to connector principals
Each connector should authenticate as its own principal with ACLs limited to the topics, consumer groups and Connect internal topics it uses. In KRaft clusters, the StandardAuthorizer stores ACLs in the metadata log, and resources without an ACL are limited to super users unless allow.everyone.if.no.acl.found is set to true. Leave that setting at its default and confirm each connector's grants with a test run against a non-production cluster.
Audit every plugin change
Log who added, replaced or removed a plugin archive, which version and checksum were involved, and which workers picked it up. Store these records outside the Connect cluster so a compromised worker cannot erase them. Review the log when a connector behaves differently after a restart, because that is often the first sign that the plugin set has changed.
What the plugin migration script changes and what it leaves for you
Before you run any plugin migration script, establish exactly what it rewrites. Teams moving connector plugins between Kafka releases or between plugin directory layouts may reach for a migration script to rename, relocate or re-register plugin folders under plugin.path. The script's name, its source repository, the Kafka versions it targets and the directory layouts it accepts must be confirmed from the Apache Kafka project or the owning repository before use. Do not rely on a script copied from a blog post or a chat thread, and do not assume it covers your connectors, which may come from other maintainers with their own packaging.
Ask four questions before the first run. Which files does it modify: worker configuration, plugin directories, the plugin list or only archives it unpacks? Which inputs does it accept, and does it refuse anything it does not recognize? What does it not check: whether each connector jar is compatible with the target Kafka Connect version, whether duplicate versions of the same connector now load from different paths, or whether service_load discovery still finds the connector classes. Finally, how is the change reversed: is there a backup step, and can you restore the previous plugin.path contents and worker configuration in one action?
Plan the verification yourself. Run the script against a copy of the plugin tree in a non-production Connect cluster, start the workers, and confirm that each connector plugin appears in the plugin list with the expected version. Then test one connector instance end to end and keep the before and after plugin inventories as change evidence. Treat the script as one step in a change you control, with the rollback path tested before production, rather than as a finished migration.
Limits to confirm in your environment before rollout
Plugins change what a Connect cluster runs, so the risks sit in the release line, the Java runtime, shared libraries, restarts, storage and vendor support. Check each item against your own environment and the connector owner's documentation before a plugin reaches production.
Connect release and Java runtime
Confirm that each connector supports the Kafka Connect release you run and the Java runtime your workers use. Since Kafka 4.0, Connect requires Java 17. A connector built for an older runtime or a newer Connect API can fail to load, or load and then fail at runtime, so test every plugin on a staging worker with the same JVM as production.
Shared library version conflicts
Plugins that bundle their own copies of common libraries, such as Jackson, Guava or database drivers, can clash with each other or with the worker's classpath. Use plugin isolation for each connector directory, list the bundled jars of every plugin, and check that no two plugins ship different versions of the same library that both must be loaded.
Restart impact on running connectors
Adding or upgrading a plugin usually needs a worker restart to be discovered, and a restart pauses tasks on that worker while they rebalance. Ask the team which connectors are critical, confirm that tasks resume from stored offsets, and plan rolling restarts so consumer lag stays within what your sinks can absorb.
Storage and image size for many plugins
Each connector adds jars, and some bundle large dependency trees. Count the plugins you intend to run, measure the on-disk size of each plugin directory, and check the size of the container image that includes them. Large images slow pod startup and rollouts, and every worker must hold the full set of plugins it might be asked to run.
Support status from the connector owner
Open-source connectors come from different owners, including Apache projects, vendors and individual maintainers, and each sets its own support and security patch policy. Record the owner, the license, the latest release and the support window for every plugin before you depend on it. A connector no longer maintained by its owner becomes your patching burden.
Whether your release line is supported
Confirm that your Kafka broker and Connect release is one of the supported releases listed on the project's downloads page, because bugfix releases are made only for supported lines. Plugins that you test against an unsupported Kafka release may receive no fixes. Plan any broker upgrade before adding plugins that need a newer release.
What teams ask before managing Kafka Connect plugins themselves
How much effort does managing Kafka Connect plugins take?
Most of the effort is recurring, not the first install. Each plugin is a set of JARs you must select, version, test, store, deploy to every Connect worker and track for security fixes, so the workload grows with the number of connectors and environments you run. The main drivers are:
- How many connector plugins you run and how many of them ship frequent releases
- How many Connect clusters and environments (development, test, production) must carry the same plugin set
- Whether plugins are baked into worker images or loaded at runtime from a shared path
- How much review each new or updated artifact needs before it reaches production
When you request a quote, ask for the effort split between initial setup and ongoing work, and confirm who performs security review of each artifact.
How long does a first plugin rollout take?
The duration depends on how much is in scope and how many approvals sit between a tested artifact and production. Plan the timeline around the inventory first: the number of connectors, whether each has a license review, and whether your Connect workers already run from images on Kubernetes or from hosts managed by hand. Other factors that lengthen the rollout are the number of test clusters you need, the frequency of your change windows, and how many teams must sign off on target-system access. Fixed-scope work is agreed in writing before it starts, so ask for the milestones, the dependencies between them and the client decisions each milestone requires. Ask us to show the scope the timeline is based on.
What does the work need from our team?
The work needs access, named people and a path to production. On the access side, expect to provide administrative access to Connect hosts or the cluster deployment repository, write access to your artifact repository or image registry, and credentials for target systems in test environments. On the people side, each connector needs an owner who can decide on upgrades and accept changes to its configuration, and someone must own the plugin pipeline itself. You will also need at least one test cluster that matches production in Kafka version, Java runtime and plugin layout, plus a documented change approval process that says who signs off on a plugin update and how an emergency rollback is approved. Confirm these items with your team before the scope is written.
Can an internal team manage Kafka Connect plugins alone?
An internal team can manage plugins alone if it already runs Kafka and can cover the gaps. The team needs working knowledge of Kafka Connect, JVM dependency management, a CI pipeline that builds or packages plugin artifacts, and enough capacity to review code and dependencies before each change. Gaps that often delay internal teams are the first build of the pipeline, the review of third-party connector code, and coordination of plugin upgrades with Kafka upgrades. Options include an in-house build, a partner-led build with a handover of documentation and runbooks, or a retainer for ongoing upgrades and testing. Whichever you choose, check that a named person can respond when a connector fails to load after a restart.
How should we check connector licenses before installing them?
Check the license of each connector and each of its dependencies before it enters your environment, and record the result with the artifact version. Licenses differ across connectors, even when they come from the same ecosystem, so the license belongs to the specific artifact you plan to deploy. Your review should answer three questions: whether the license allows your intended use, whether it imposes restrictions on offering the software to third parties or on running it as a service, and whether a commercial license is required for the edition you deploy. Keep the review in the same record as the plugin's owner and version so that an upgrade triggers a new check. Your legal or compliance team should confirm the conclusions for your organization.
How do upgrades of Kafka and plugins affect each other?
Plugins must match the Kafka Connect version they run on, so a Kafka upgrade can force a plugin upgrade and the reverse can also happen. The Kafka project supports rolling upgrades from each release in the past year, the last three releases, to the latest version, according to its release plan. Since Kafka 4.0, Connect workers require Java 17, which may also require plugin rebuilds if a connector targets an older runtime. Review the Kafka 4.3 upgrade notes before scheduling a change. Plan each upgrade in a test cluster first, record the plugin versions that passed, and keep the previous artifact available for rollback.
How do we keep untrusted connector code out of production?
Install only plugins from sources your team has reviewed, and treat every plugin as code that runs inside the Connect worker process. A plugin can read the configuration and credentials the worker holds, so the trust decision applies to the whole worker. Practical controls include:
- Pin each plugin to an exact version and record the checksum of the artifact
- Verify signatures or published checksums where the publisher provides them
- Build plugin images in a pipeline with restricted write access to the registry
- Limit who can change the contents of the plugin path on any host
- Scan dependencies for known vulnerabilities before promotion
Document who approved each artifact and why, so an auditor or incident responder can trace it.
Can different connectors use different versions of the same library?
Connect isolates each plugin in its own class loader, which reduces conflicts between connectors that depend on different library versions. Isolation is not complete, though. Libraries placed on the worker's shared classpath are visible to every plugin, and a plugin that bundles a conflicting copy of a shared dependency can still cause failures. Layout your plugin.path so that each plugin has its own directory with all its dependencies, and confirm which plugin discovery mode your Connect version uses, including whether service_load compatibility applies to the connectors you run. Test each plugin's loading behavior on a worker that matches production before you rely on it.
How DeployOpen scopes and delivers Connect plugin management
DeployOpen plans, implements, hardens, documents and supports self-hosted open-source platforms inside your own infrastructure, including the Kafka Connect plugin layout that your connectors depend on. Engagements are fixed-scope, with scope, deliverables and timelines agreed in writing before work starts.
How we scope
- Inventory every connector plugin, its source, license and the Kafka Connect version it must run on
- Agree the plugin.path layout, discovery mode and service_load decision for each worker group in writing
- Define which plugin versions are approved, who may add new code and the trust checks required first
How we build
- Lay out plugin directories per connector family so versions can coexist without classpath conflicts
- Test each plugin in a non-production Connect cluster, including the plugin migration script where it applies
- Verify that connector startup, discovery and task restarts behave as expected after each change
How we hand over
- Deliver the plugin inventory, directory layout, worker configuration and approved-artifact register as documentation
- Provide the runbook for adding, upgrading and removing a plugin, with rollback steps for each
- Walk your platform and security teams through the trust process and the evidence it produces
How we support
- Offer ongoing support, upgrades and continuous testing as a retainer after handover
- Review plugin versions against Kafka release changes before each planned Connect upgrade
- Re-run plugin discovery and connector tests when base images, Java runtimes or Kafka versions change

