You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2022/10/11 09:12:09 UTC

[camel] 01/01: CAMEL-16909: camel-kubernetes - Event support

This is an automated email from the ASF dual-hosted git repository.

nfilotto pushed a commit to branch CAMEL-16909/events-support
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 2a3ef334f01512a72bcbf82f7fd8d31de6cfa345
Author: Nicolas Filotto <nf...@talend.com>
AuthorDate: Tue Oct 11 11:11:34 2022 +0200

    CAMEL-16909: camel-kubernetes - Event support
---
 .../KubernetesEventsComponentConfigurer.java       |  72 +++++++
 .../events/KubernetesEventsEndpointConfigurer.java | 229 +++++++++++++++++++++
 .../events/KubernetesEventsEndpointUriFactory.java | 114 ++++++++++
 .../services/org/apache/camel/component.properties |   2 +-
 .../org/apache/camel/component/kubernetes-events   |   2 +
 .../camel/configurer/kubernetes-events-component   |   2 +
 .../camel/configurer/kubernetes-events-endpoint    |   2 +
 .../camel/urifactory/kubernetes-events-endpoint    |   2 +
 .../kubernetes/events/kubernetes-events.json       |  82 ++++++++
 .../src/main/docs/kubernetes-events-component.adoc | 187 +++++++++++++++++
 .../component/kubernetes/KubernetesConstants.java  |  36 +++-
 .../component/kubernetes/KubernetesOperations.java |   8 +
 .../config_maps/KubernetesConfigMapsConsumer.java  |   6 +-
 .../kubernetes/consumer/common/ConfigMapEvent.java |  47 -----
 .../consumer/common/DeploymentEvent.java           |  47 -----
 .../kubernetes/consumer/common/HPAEvent.java       |  48 -----
 .../kubernetes/consumer/common/NamespaceEvent.java |  47 -----
 .../kubernetes/consumer/common/NodeEvent.java      |  47 -----
 .../common/ReplicationControllerEvent.java         |  47 -----
 .../kubernetes/consumer/common/ServiceEvent.java   |  47 -----
 .../deployments/KubernetesDeploymentsConsumer.java |   6 +-
 .../KubernetesEventsComponent.java}                |  35 +---
 .../KubernetesEventsConsumer.java}                 |  44 ++--
 .../events/KubernetesEventsEndpoint.java           |  55 +++++
 .../events/KubernetesEventsProducer.java           | 207 +++++++++++++++++++
 .../kubernetes/hpa/KubernetesHPAConsumer.java      |   6 +-
 .../namespaces/KubernetesNamespacesConsumer.java   |   6 +-
 .../kubernetes/nodes/KubernetesNodesConsumer.java  |   6 +-
 .../kubernetes/pods/KubernetesPodsConsumer.java    |   6 +-
 .../KubernetesReplicationControllersConsumer.java  |   6 +-
 .../services/KubernetesServicesConsumer.java       |   6 +-
 .../integration/KubernetesEventsConsumerIT.java    | 229 +++++++++++++++++++++
 .../producer/KubernetesEventsProducerTest.java     | 180 ++++++++++++++++
 33 files changed, 1451 insertions(+), 415 deletions(-)

diff --git a/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/events/KubernetesEventsComponentConfigurer.java b/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/events/KubernetesEventsComponentConfigurer.java
new file mode 100644
index 00000000000..144413c78be
--- /dev/null
+++ b/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/events/KubernetesEventsComponentConfigurer.java
@@ -0,0 +1,72 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.kubernetes.events;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class KubernetesEventsComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        KubernetesEventsComponent target = (KubernetesEventsComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "autowiredenabled":
+        case "autowiredEnabled": target.setAutowiredEnabled(property(camelContext, boolean.class, value)); return true;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+        case "kubernetesclient":
+        case "kubernetesClient": target.setKubernetesClient(property(camelContext, io.fabric8.kubernetes.client.KubernetesClient.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public String[] getAutowiredNames() {
+        return new String[]{"kubernetesClient"};
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "autowiredenabled":
+        case "autowiredEnabled": return boolean.class;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return boolean.class;
+        case "kubernetesclient":
+        case "kubernetesClient": return io.fabric8.kubernetes.client.KubernetesClient.class;
+        case "lazystartproducer":
+        case "lazyStartProducer": return boolean.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        KubernetesEventsComponent target = (KubernetesEventsComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "autowiredenabled":
+        case "autowiredEnabled": return target.isAutowiredEnabled();
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+        case "kubernetesclient":
+        case "kubernetesClient": return target.getKubernetesClient();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/events/KubernetesEventsEndpointConfigurer.java b/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/events/KubernetesEventsEndpointConfigurer.java
new file mode 100644
index 00000000000..24be7deec90
--- /dev/null
+++ b/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/events/KubernetesEventsEndpointConfigurer.java
@@ -0,0 +1,229 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.kubernetes.events;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class KubernetesEventsEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        KubernetesEventsEndpoint target = (KubernetesEventsEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "apiversion":
+        case "apiVersion": target.getConfiguration().setApiVersion(property(camelContext, java.lang.String.class, value)); return true;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+        case "cacertdata":
+        case "caCertData": target.getConfiguration().setCaCertData(property(camelContext, java.lang.String.class, value)); return true;
+        case "cacertfile":
+        case "caCertFile": target.getConfiguration().setCaCertFile(property(camelContext, java.lang.String.class, value)); return true;
+        case "clientcertdata":
+        case "clientCertData": target.getConfiguration().setClientCertData(property(camelContext, java.lang.String.class, value)); return true;
+        case "clientcertfile":
+        case "clientCertFile": target.getConfiguration().setClientCertFile(property(camelContext, java.lang.String.class, value)); return true;
+        case "clientkeyalgo":
+        case "clientKeyAlgo": target.getConfiguration().setClientKeyAlgo(property(camelContext, java.lang.String.class, value)); return true;
+        case "clientkeydata":
+        case "clientKeyData": target.getConfiguration().setClientKeyData(property(camelContext, java.lang.String.class, value)); return true;
+        case "clientkeyfile":
+        case "clientKeyFile": target.getConfiguration().setClientKeyFile(property(camelContext, java.lang.String.class, value)); return true;
+        case "clientkeypassphrase":
+        case "clientKeyPassphrase": target.getConfiguration().setClientKeyPassphrase(property(camelContext, java.lang.String.class, value)); return true;
+        case "connectiontimeout":
+        case "connectionTimeout": target.getConfiguration().setConnectionTimeout(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "crdgroup":
+        case "crdGroup": target.getConfiguration().setCrdGroup(property(camelContext, java.lang.String.class, value)); return true;
+        case "crdname":
+        case "crdName": target.getConfiguration().setCrdName(property(camelContext, java.lang.String.class, value)); return true;
+        case "crdplural":
+        case "crdPlural": target.getConfiguration().setCrdPlural(property(camelContext, java.lang.String.class, value)); return true;
+        case "crdscope":
+        case "crdScope": target.getConfiguration().setCrdScope(property(camelContext, java.lang.String.class, value)); return true;
+        case "crdversion":
+        case "crdVersion": target.getConfiguration().setCrdVersion(property(camelContext, java.lang.String.class, value)); return true;
+        case "dnsdomain":
+        case "dnsDomain": target.getConfiguration().setDnsDomain(property(camelContext, java.lang.String.class, value)); return true;
+        case "exceptionhandler":
+        case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true;
+        case "exchangepattern":
+        case "exchangePattern": target.setExchangePattern(property(camelContext, org.apache.camel.ExchangePattern.class, value)); return true;
+        case "kubernetesclient":
+        case "kubernetesClient": target.getConfiguration().setKubernetesClient(property(camelContext, io.fabric8.kubernetes.client.KubernetesClient.class, value)); return true;
+        case "labelkey":
+        case "labelKey": target.getConfiguration().setLabelKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "labelvalue":
+        case "labelValue": target.getConfiguration().setLabelValue(property(camelContext, java.lang.String.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "namespace": target.getConfiguration().setNamespace(property(camelContext, java.lang.String.class, value)); return true;
+        case "oauthtoken":
+        case "oauthToken": target.getConfiguration().setOauthToken(property(camelContext, java.lang.String.class, value)); return true;
+        case "operation": target.getConfiguration().setOperation(property(camelContext, java.lang.String.class, value)); return true;
+        case "password": target.getConfiguration().setPassword(property(camelContext, java.lang.String.class, value)); return true;
+        case "poolsize":
+        case "poolSize": target.getConfiguration().setPoolSize(property(camelContext, int.class, value)); return true;
+        case "portname":
+        case "portName": target.getConfiguration().setPortName(property(camelContext, java.lang.String.class, value)); return true;
+        case "portprotocol":
+        case "portProtocol": target.getConfiguration().setPortProtocol(property(camelContext, java.lang.String.class, value)); return true;
+        case "resourcename":
+        case "resourceName": target.getConfiguration().setResourceName(property(camelContext, java.lang.String.class, value)); return true;
+        case "trustcerts":
+        case "trustCerts": target.getConfiguration().setTrustCerts(property(camelContext, java.lang.Boolean.class, value)); return true;
+        case "username": target.getConfiguration().setUsername(property(camelContext, java.lang.String.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "apiversion":
+        case "apiVersion": return java.lang.String.class;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return boolean.class;
+        case "cacertdata":
+        case "caCertData": return java.lang.String.class;
+        case "cacertfile":
+        case "caCertFile": return java.lang.String.class;
+        case "clientcertdata":
+        case "clientCertData": return java.lang.String.class;
+        case "clientcertfile":
+        case "clientCertFile": return java.lang.String.class;
+        case "clientkeyalgo":
+        case "clientKeyAlgo": return java.lang.String.class;
+        case "clientkeydata":
+        case "clientKeyData": return java.lang.String.class;
+        case "clientkeyfile":
+        case "clientKeyFile": return java.lang.String.class;
+        case "clientkeypassphrase":
+        case "clientKeyPassphrase": return java.lang.String.class;
+        case "connectiontimeout":
+        case "connectionTimeout": return java.lang.Integer.class;
+        case "crdgroup":
+        case "crdGroup": return java.lang.String.class;
+        case "crdname":
+        case "crdName": return java.lang.String.class;
+        case "crdplural":
+        case "crdPlural": return java.lang.String.class;
+        case "crdscope":
+        case "crdScope": return java.lang.String.class;
+        case "crdversion":
+        case "crdVersion": return java.lang.String.class;
+        case "dnsdomain":
+        case "dnsDomain": return java.lang.String.class;
+        case "exceptionhandler":
+        case "exceptionHandler": return org.apache.camel.spi.ExceptionHandler.class;
+        case "exchangepattern":
+        case "exchangePattern": return org.apache.camel.ExchangePattern.class;
+        case "kubernetesclient":
+        case "kubernetesClient": return io.fabric8.kubernetes.client.KubernetesClient.class;
+        case "labelkey":
+        case "labelKey": return java.lang.String.class;
+        case "labelvalue":
+        case "labelValue": return java.lang.String.class;
+        case "lazystartproducer":
+        case "lazyStartProducer": return boolean.class;
+        case "namespace": return java.lang.String.class;
+        case "oauthtoken":
+        case "oauthToken": return java.lang.String.class;
+        case "operation": return java.lang.String.class;
+        case "password": return java.lang.String.class;
+        case "poolsize":
+        case "poolSize": return int.class;
+        case "portname":
+        case "portName": return java.lang.String.class;
+        case "portprotocol":
+        case "portProtocol": return java.lang.String.class;
+        case "resourcename":
+        case "resourceName": return java.lang.String.class;
+        case "trustcerts":
+        case "trustCerts": return java.lang.Boolean.class;
+        case "username": return java.lang.String.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        KubernetesEventsEndpoint target = (KubernetesEventsEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "apiversion":
+        case "apiVersion": return target.getConfiguration().getApiVersion();
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+        case "cacertdata":
+        case "caCertData": return target.getConfiguration().getCaCertData();
+        case "cacertfile":
+        case "caCertFile": return target.getConfiguration().getCaCertFile();
+        case "clientcertdata":
+        case "clientCertData": return target.getConfiguration().getClientCertData();
+        case "clientcertfile":
+        case "clientCertFile": return target.getConfiguration().getClientCertFile();
+        case "clientkeyalgo":
+        case "clientKeyAlgo": return target.getConfiguration().getClientKeyAlgo();
+        case "clientkeydata":
+        case "clientKeyData": return target.getConfiguration().getClientKeyData();
+        case "clientkeyfile":
+        case "clientKeyFile": return target.getConfiguration().getClientKeyFile();
+        case "clientkeypassphrase":
+        case "clientKeyPassphrase": return target.getConfiguration().getClientKeyPassphrase();
+        case "connectiontimeout":
+        case "connectionTimeout": return target.getConfiguration().getConnectionTimeout();
+        case "crdgroup":
+        case "crdGroup": return target.getConfiguration().getCrdGroup();
+        case "crdname":
+        case "crdName": return target.getConfiguration().getCrdName();
+        case "crdplural":
+        case "crdPlural": return target.getConfiguration().getCrdPlural();
+        case "crdscope":
+        case "crdScope": return target.getConfiguration().getCrdScope();
+        case "crdversion":
+        case "crdVersion": return target.getConfiguration().getCrdVersion();
+        case "dnsdomain":
+        case "dnsDomain": return target.getConfiguration().getDnsDomain();
+        case "exceptionhandler":
+        case "exceptionHandler": return target.getExceptionHandler();
+        case "exchangepattern":
+        case "exchangePattern": return target.getExchangePattern();
+        case "kubernetesclient":
+        case "kubernetesClient": return target.getConfiguration().getKubernetesClient();
+        case "labelkey":
+        case "labelKey": return target.getConfiguration().getLabelKey();
+        case "labelvalue":
+        case "labelValue": return target.getConfiguration().getLabelValue();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        case "namespace": return target.getConfiguration().getNamespace();
+        case "oauthtoken":
+        case "oauthToken": return target.getConfiguration().getOauthToken();
+        case "operation": return target.getConfiguration().getOperation();
+        case "password": return target.getConfiguration().getPassword();
+        case "poolsize":
+        case "poolSize": return target.getConfiguration().getPoolSize();
+        case "portname":
+        case "portName": return target.getConfiguration().getPortName();
+        case "portprotocol":
+        case "portProtocol": return target.getConfiguration().getPortProtocol();
+        case "resourcename":
+        case "resourceName": return target.getConfiguration().getResourceName();
+        case "trustcerts":
+        case "trustCerts": return target.getConfiguration().getTrustCerts();
+        case "username": return target.getConfiguration().getUsername();
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/events/KubernetesEventsEndpointUriFactory.java b/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/events/KubernetesEventsEndpointUriFactory.java
new file mode 100644
index 00000000000..c5c3f56e7ec
--- /dev/null
+++ b/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/events/KubernetesEventsEndpointUriFactory.java
@@ -0,0 +1,114 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.kubernetes.events;
+
+import java.net.URISyntaxException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.camel.spi.EndpointUriFactory;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+public class KubernetesEventsEndpointUriFactory extends org.apache.camel.support.component.EndpointUriFactorySupport implements EndpointUriFactory {
+
+    private static final String BASE = ":masterUrl";
+
+    private static final Set<String> PROPERTY_NAMES;
+    private static final Set<String> SECRET_PROPERTY_NAMES;
+    private static final Set<String> MULTI_VALUE_PREFIXES;
+    static {
+        Set<String> props = new HashSet<>(34);
+        props.add("apiVersion");
+        props.add("bridgeErrorHandler");
+        props.add("caCertData");
+        props.add("caCertFile");
+        props.add("clientCertData");
+        props.add("clientCertFile");
+        props.add("clientKeyAlgo");
+        props.add("clientKeyData");
+        props.add("clientKeyFile");
+        props.add("clientKeyPassphrase");
+        props.add("connectionTimeout");
+        props.add("crdGroup");
+        props.add("crdName");
+        props.add("crdPlural");
+        props.add("crdScope");
+        props.add("crdVersion");
+        props.add("dnsDomain");
+        props.add("exceptionHandler");
+        props.add("exchangePattern");
+        props.add("kubernetesClient");
+        props.add("labelKey");
+        props.add("labelValue");
+        props.add("lazyStartProducer");
+        props.add("masterUrl");
+        props.add("namespace");
+        props.add("oauthToken");
+        props.add("operation");
+        props.add("password");
+        props.add("poolSize");
+        props.add("portName");
+        props.add("portProtocol");
+        props.add("resourceName");
+        props.add("trustCerts");
+        props.add("username");
+        PROPERTY_NAMES = Collections.unmodifiableSet(props);
+        Set<String> secretProps = new HashSet<>(12);
+        secretProps.add("caCertData");
+        secretProps.add("caCertFile");
+        secretProps.add("clientCertData");
+        secretProps.add("clientCertFile");
+        secretProps.add("clientKeyAlgo");
+        secretProps.add("clientKeyData");
+        secretProps.add("clientKeyFile");
+        secretProps.add("clientKeyPassphrase");
+        secretProps.add("oauthToken");
+        secretProps.add("password");
+        secretProps.add("trustCerts");
+        secretProps.add("username");
+        SECRET_PROPERTY_NAMES = Collections.unmodifiableSet(secretProps);
+        MULTI_VALUE_PREFIXES = Collections.emptySet();
+    }
+
+    @Override
+    public boolean isEnabled(String scheme) {
+        return "kubernetes-events".equals(scheme);
+    }
+
+    @Override
+    public String buildUri(String scheme, Map<String, Object> properties, boolean encode) throws URISyntaxException {
+        String syntax = scheme + BASE;
+        String uri = syntax;
+
+        Map<String, Object> copy = new HashMap<>(properties);
+
+        uri = buildPathParameter(syntax, uri, "masterUrl", null, true, copy);
+        uri = buildQueryParameters(uri, copy, encode);
+        return uri;
+    }
+
+    @Override
+    public Set<String> propertyNames() {
+        return PROPERTY_NAMES;
+    }
+
+    @Override
+    public Set<String> secretPropertyNames() {
+        return SECRET_PROPERTY_NAMES;
+    }
+
+    @Override
+    public Set<String> multiValuePrefixes() {
+        return MULTI_VALUE_PREFIXES;
+    }
+
+    @Override
+    public boolean isLenientProperties() {
+        return false;
+    }
+}
+
diff --git a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/component.properties b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/component.properties
index e278c7e4af2..29cadf34721 100644
--- a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/component.properties
+++ b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/component.properties
@@ -1,5 +1,5 @@
 # Generated by camel build tools - do NOT edit this file!
-components=kubernetes-config-maps kubernetes-custom-resources kubernetes-deployments kubernetes-hpa kubernetes-job kubernetes-namespaces kubernetes-nodes kubernetes-persistent-volumes kubernetes-persistent-volumes-claims kubernetes-pods kubernetes-replication-controllers kubernetes-resources-quota kubernetes-secrets kubernetes-service-accounts kubernetes-services openshift-build-configs openshift-builds openshift-deploymentconfigs
+components=kubernetes-config-maps kubernetes-custom-resources kubernetes-deployments kubernetes-events kubernetes-hpa kubernetes-job kubernetes-namespaces kubernetes-nodes kubernetes-persistent-volumes kubernetes-persistent-volumes-claims kubernetes-pods kubernetes-replication-controllers kubernetes-resources-quota kubernetes-secrets kubernetes-service-accounts kubernetes-services openshift-build-configs openshift-builds openshift-deploymentconfigs
 groupId=org.apache.camel
 artifactId=camel-kubernetes
 version=3.20.0-SNAPSHOT
diff --git a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/component/kubernetes-events b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/component/kubernetes-events
new file mode 100644
index 00000000000..f987e53412c
--- /dev/null
+++ b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/component/kubernetes-events
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.kubernetes.events.KubernetesEventsComponent
diff --git a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/configurer/kubernetes-events-component b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/configurer/kubernetes-events-component
new file mode 100644
index 00000000000..9757c6c4b29
--- /dev/null
+++ b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/configurer/kubernetes-events-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.kubernetes.events.KubernetesEventsComponentConfigurer
diff --git a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/configurer/kubernetes-events-endpoint b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/configurer/kubernetes-events-endpoint
new file mode 100644
index 00000000000..0069a5877bd
--- /dev/null
+++ b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/configurer/kubernetes-events-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.kubernetes.events.KubernetesEventsEndpointConfigurer
diff --git a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/urifactory/kubernetes-events-endpoint b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/urifactory/kubernetes-events-endpoint
new file mode 100644
index 00000000000..cb9fbd21561
--- /dev/null
+++ b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/urifactory/kubernetes-events-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.kubernetes.events.KubernetesEventsEndpointUriFactory
diff --git a/components/camel-kubernetes/src/generated/resources/org/apache/camel/component/kubernetes/events/kubernetes-events.json b/components/camel-kubernetes/src/generated/resources/org/apache/camel/component/kubernetes/events/kubernetes-events.json
new file mode 100644
index 00000000000..3a0c2ce2f67
--- /dev/null
+++ b/components/camel-kubernetes/src/generated/resources/org/apache/camel/component/kubernetes/events/kubernetes-events.json
@@ -0,0 +1,82 @@
+{
+  "component": {
+    "kind": "component",
+    "name": "kubernetes-events",
+    "title": "Kubernetes Event",
+    "description": "Perform operations on Kubernetes Events and get notified on Events changes.",
+    "deprecated": false,
+    "firstVersion": "3.20.0",
+    "label": "container,cloud,paas",
+    "javaType": "org.apache.camel.component.kubernetes.events.KubernetesEventsComponent",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-kubernetes",
+    "version": "3.20.0-SNAPSHOT",
+    "scheme": "kubernetes-events",
+    "extendsScheme": "",
+    "syntax": "kubernetes-events:masterUrl",
+    "async": false,
+    "api": false,
+    "consumerOnly": false,
+    "producerOnly": false,
+    "lenientProperties": false
+  },
+  "componentProperties": {
+    "kubernetesClient": { "kind": "property", "displayName": "Kubernetes Client", "group": "common", "label": "", "required": false, "type": "object", "javaType": "io.fabric8.kubernetes.client.KubernetesClient", "deprecated": false, "autowired": true, "secret": false, "description": "To use an existing kubernetes client." },
+    "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a me [...]
+    "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during star [...]
+    "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
+  },
+  "headers": {
+    "CamelKubernetesOperation": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Producer operation", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_OPERATION" },
+    "CamelKubernetesNamespaceName": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The namespace name", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_NAMESPACE_NAME" },
+    "CamelKubernetesEventsLabels": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The event labels", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENTS_LABELS" },
+    "CamelKubernetesEventTime": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "server time", "description": "The event time in ISO-8601 extended offset date-time format, such as '2011-12-03T10:15:3001:00'.", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_TIME" },
+    "CamelKubernetesEventAction": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "io.fabric8.kubernetes.client.Watcher.Action", "enum": [ "ADDED", "MODIFIED", "DELETED", "ERROR", "BOOKMARK" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Action watched by the consumer", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_ACTION" },
+    "CamelKubernetesEventType": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The event type", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_TYPE" },
+    "CamelKubernetesEventReason": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The event reason", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_REASON" },
+    "CamelKubernetesEventNote": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The event note", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_NOTE" },
+    "CamelKubernetesEventRegarding": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "io.fabric8.kubernetes.api.model.ObjectReference", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The event regarding", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_REGARDING" },
+    "CamelKubernetesEventRelated": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "io.fabric8.kubernetes.api.model.ObjectReference", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The event related", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_RELATED" },
+    "CamelKubernetesEventReportingController": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The event reporting controller", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_REPORTING_CONTROLLER" },
+    "CamelKubernetesEventReportingInstance": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The event reporting instance", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_REPORTING_INSTANCE" },
+    "CamelKubernetesEventName": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The event name", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_NAME" },
+    "CamelKubernetesEventTimestamp": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Timestamp of the action watched by the consumer", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_TIMESTAMP" }
+  },
+  "properties": {
+    "masterUrl": { "kind": "path", "displayName": "Master Url", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "Kubernetes Master url" },
+    "apiVersion": { "kind": "parameter", "displayName": "Api Version", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Kubernetes API Version to use" },
+    "dnsDomain": { "kind": "parameter", "displayName": "Dns Domain", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The dns domain, used for ServiceCall EIP" },
+    "kubernetesClient": { "kind": "parameter", "displayName": "Kubernetes Client", "group": "common", "label": "", "required": false, "type": "object", "javaType": "io.fabric8.kubernetes.client.KubernetesClient", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "Default KubernetesClient to use if provided" },
+    "portName": { "kind": "parameter", "displayName": "Port Name", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The port name, used for ServiceCall EIP" },
+    "portProtocol": { "kind": "parameter", "displayName": "Port Protocol", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "tcp", "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The port protocol, used for ServiceCall EIP" },
+    "crdGroup": { "kind": "parameter", "displayName": "Crd Group", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer CRD Resource Group we would like to watch" },
+    "crdName": { "kind": "parameter", "displayName": "Crd Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer CRD Resource name we would like to watch" },
+    "crdPlural": { "kind": "parameter", "displayName": "Crd Plural", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer CRD Resource Plural we would like to watch" },
+    "crdScope": { "kind": "parameter", "displayName": "Crd Scope", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer CRD Resource Scope we would like to watch" },
+    "crdVersion": { "kind": "parameter", "displayName": "Crd Version", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer CRD Resource Version we would like to watch" },
+    "labelKey": { "kind": "parameter", "displayName": "Label Key", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer Label key when watching at some resources" },
+    "labelValue": { "kind": "parameter", "displayName": "Label Value", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer Label value when watching at some resources" },
+    "namespace": { "kind": "parameter", "displayName": "Namespace", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The namespace" },
+    "poolSize": { "kind": "parameter", "displayName": "Pool Size", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer pool size" },
+    "resourceName": { "kind": "parameter", "displayName": "Resource Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer Resource Name we would like to watch" },
+    "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now [...]
+    "exceptionHandler": { "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the con [...]
+    "exchangePattern": { "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut", "InOptionalOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
+    "operation": { "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "Producer operation to do on Kubernetes" },
+    "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may other [...]
+    "connectionTimeout": { "kind": "parameter", "displayName": "Connection Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "Connection timeout in milliseconds to use when making requests to the Kubernetes API server." },
+    "caCertData": { "kind": "parameter", "displayName": "Ca Cert Data", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The CA Cert Data" },
+    "caCertFile": { "kind": "parameter", "displayName": "Ca Cert File", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The CA Cert File" },
+    "clientCertData": { "kind": "parameter", "displayName": "Client Cert Data", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Client Cert Data" },
+    "clientCertFile": { "kind": "parameter", "displayName": "Client Cert File", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Client Cert File" },
+    "clientKeyAlgo": { "kind": "parameter", "displayName": "Client Key Algo", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Key Algorithm used by the client" },
+    "clientKeyData": { "kind": "parameter", "displayName": "Client Key Data", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Client Key data" },
+    "clientKeyFile": { "kind": "parameter", "displayName": "Client Key File", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Client Key file" },
+    "clientKeyPassphrase": { "kind": "parameter", "displayName": "Client Key Passphrase", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Client Key Passphrase" },
+    "oauthToken": { "kind": "parameter", "displayName": "Oauth Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Auth Token" },
+    "password": { "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "Password to connect to Kubernetes" },
+    "trustCerts": { "kind": "parameter", "displayName": "Trust Certs", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "Define if the certs we used are trusted anyway or not" },
+    "username": { "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "Username to connect to Kubernetes" }
+  }
+}
diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-events-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-events-component.adoc
new file mode 100644
index 00000000000..bb7e364dbdb
--- /dev/null
+++ b/components/camel-kubernetes/src/main/docs/kubernetes-events-component.adoc
@@ -0,0 +1,187 @@
+= Kubernetes Event Component
+:doctitle: Kubernetes Event
+:shortname: kubernetes-events
+:artifactid: camel-kubernetes
+:description: Perform operations on Kubernetes Events and get notified on Events changes.
+:since: 3.20
+:supportlevel: Preview
+:component-header: Both producer and consumer are supported
+//Manually maintained attributes
+:group: Kubernetes
+:camel-spring-boot-name: kubernetes
+
+*Since Camel {since}*
+
+*{component-header}*
+
+The Kubernetes Event component is one of xref:kubernetes-summary.adoc[Kubernetes Components] which
+provides a producer to execute Kubernetes Event operations and a consumer to consume events related to Event objects.
+
+
+// component-configure options: START
+
+// component-configure options: END
+
+// component options: START
+include::partial$component-configure-options.adoc[]
+include::partial$component-endpoint-options.adoc[]
+// component options: END
+
+// endpoint options: START
+
+// endpoint options: END
+
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
+
+== Supported producer operation
+
+- listEvents
+- listEventsByLabels
+- getEvent
+- createEvent
+- replaceEvent
+- deleteEvent
+
+== Kubernetes Events Producer Examples
+
+- listEvents: this operation lists the events
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:list").
+    to("kubernetes-events:///?kubernetesClient=#kubernetesClient&operation=listEvents").
+    to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation returns a list of events from your cluster. The type of the events is `io.fabric8.kubernetes.api.model.events.v1.Event`.
+
+To indicate from which namespace, the events are expected, it is possible to set the message header `CamelKubernetesNamespaceName`. By default, the events of all namespaces are returned.
+
+- listEventsByLabels: this operation lists the events selected by labels
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:listByLabels").process(new Processor() {
+
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                Map<String, String> labels = new HashMap<>();
+                labels.put("key1", "value1");
+                labels.put("key2", "value2");
+                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENTS_LABELS, labels);
+            }
+        });
+    to("kubernetes-events:///?kubernetesClient=#kubernetesClient&operation=listEventsByLabels").
+    to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation returns a list of events from your cluster that occurred in any namespaces, using a label selector (in the example above only expect events which have the label "key1" set to "value1" and the label "key2" set to "value2"). The type of the events is `io.fabric8.kubernetes.api.model.events.v1.Event`.
+
+This operation expects the message header `CamelKubernetesEventsLabels` to be set to a `Map<String, String>` where the key-value pairs represent the expected label names and values.
+
+- getEvent: this operation gives a specific event
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:get").process(new Processor() {
+
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_NAME, "event1");
+            }
+        });
+    to("kubernetes-events:///?kubernetesClient=#kubernetesClient&operation=getEvent").
+    to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation returns the event matching the criteria from your cluster. The type of the event is `io.fabric8.kubernetes.api.model.events.v1.Event`.
+
+This operation expects two message headers which are `CamelKubernetesNamespaceName` and `CamelKubernetesEventName`, the first one needs to be set to the name of the target namespace and second one needs to be set to the target name of event.
+
+If no matching event could be found, `null` is returned.
+
+- createEvent: this operation creates a new event
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:get").process(new Processor() {
+
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "default");
+                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_NAME, "test1");
+                Map<String, String> labels = new HashMap<>();
+                labels.put("this", "rocks");
+                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENTS_LABELS, labels);
+                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION_PRODUCER, "Some Action");
+                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_TYPE, "Normal");
+                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_REASON, "Some Reason");
+                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_REPORTING_CONTROLLER, "Some-Reporting-Controller");
+                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_REPORTING_INSTANCE, "Some-Reporting-Instance");
+            }
+        });
+    to("kubernetes-events:///?kubernetesClient=#kubernetesClient&operation=createEvent").
+    to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation publishes a new event in your cluster. An event can be created in two ways either from message headers or directly from an `io.fabric8.kubernetes.api.model.events.v1.EventBuilder`.
+
+Whatever the way used to create the event:
+
+* The operation expects two message headers which are `CamelKubernetesNamespaceName` and `CamelKubernetesEventName`, to set respectively the name of namespace and the name of the produced event.
+* The operation supports the message header `CamelKubernetesEventsLabels` to set the labels to the produced event.
+
+The message headers that can be used to create an event are `CamelKubernetesEventTime`, `CamelKubernetesEventAction`, `CamelKubernetesEventType`, `CamelKubernetesEventReason`, `CamelKubernetesEventNote`,`CamelKubernetesEventRegarding`, `CamelKubernetesEventRelated`, `CamelKubernetesEventReportingController` and `CamelKubernetesEventReportingInstance`.
+
+In case the supported message headers are not enough for a specific use case, it is still possible to set the message body with an object of type `io.fabric8.kubernetes.api.model.events.v1.EventBuilder` representing a prefilled builder to use when creating the event. Please note that the labels, name of event and name of namespace are always set from the message headers, even when the builder is provided.
+
+- replaceEvent: this operation replaces an existing event
+
+The behavior is exactly the same as `createEvent`, only the name of the operation is different.
+
+- deleteEvent: this operation deletes an existing event.
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:get").process(new Processor() {
+
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "default");
+                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_NAME, "test1");
+            }
+        });
+    to("kubernetes-events:///?kubernetesClient=#kubernetesClient&operation=deleteEvent").
+    to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation removes an existing event from your cluster. It returns a `boolean` to indicate whether the operation was successful or not.
+
+This operation expects two message headers which are `CamelKubernetesNamespaceName` and `CamelKubernetesEventName`, the first one needs to be set to the name of the target namespace and second one needs to be set to the target name of event.
+
+== Kubernetes Events Consumer Example
+
+[source,java]
+--------------------------------------------------------------------------------
+fromF("kubernetes-events://%s?oauthToken=%s", host, authToken)
+    .setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, constant("default"))
+    .setHeader(KubernetesConstants.KUBERNETES_EVENT_NAME, constant("test"))
+    .process(new KubernertesProcessor()).to("mock:result");
+
+    public class KubernertesProcessor implements Processor {
+        @Override
+        public void process(Exchange exchange) throws Exception {
+            Message in = exchange.getIn();
+            Event cm = exchange.getIn().getBody(Event.class);
+            log.info("Got event with event name: " + cm.getMetadata().getName() + " and action " + in.getHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION));
+        }
+    }
+--------------------------------------------------------------------------------
+
+This consumer returns a message per event received on the namespace "default" for the event "test". It also set the action (`io.fabric8.kubernetes.client.Watcher.Action`) in the message header `CamelKubernetesEventAction` and the timestamp (`long`) in the message header `CamelKubernetesEventTimestamp`.
+
+
+include::spring-boot:partial$starter.adoc[]
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java
index 340c930e795..9a53bb5ca2d 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java
@@ -23,6 +23,7 @@ public final class KubernetesConstants {
     public static final String SCHEME_CONFIG_MAPS = "kubernetes-config-maps";
     public static final String SCHEME_CUSTOM_RESOURCES = "kubernetes-custom-resources";
     public static final String SCHEME_DEPLOYMENTS = "kubernetes-deployments";
+    public static final String SCHEME_EVENTS = "kubernetes-events";
     public static final String SCHEME_HPA = "kubernetes-hpa";
     public static final String SCHEME_JOB = "kubernetes-job";
     public static final String SCHEME_NAMESPACES = "kubernetes-namespaces";
@@ -46,7 +47,7 @@ public final class KubernetesConstants {
                       SCHEME_CONFIG_MAPS, SCHEME_CUSTOM_RESOURCES, SCHEME_DEPLOYMENTS,
                       SCHEME_HPA, SCHEME_JOB, SCHEME_NAMESPACES, SCHEME_PERSISTENT_VOLUMES_CLAIMS, SCHEME_PODS,
                       SCHEME_REPLICATION_CONTROLLERS, SCHEME_RESOURCES_QUOTA, SCHEME_SECRETS, SCHEME_SERVICE_ACCOUNTS,
-                      SCHEME_SERVICES, SCHEME_BUILD_CONFIG, SCHEME_BUILDS, SCHEME_DEPLOYMENT_CONFIGS })
+                      SCHEME_SERVICES, SCHEME_BUILD_CONFIG, SCHEME_BUILDS, SCHEME_DEPLOYMENT_CONFIGS, SCHEME_EVENTS })
     public static final String KUBERNETES_NAMESPACE_NAME = "CamelKubernetesNamespaceName";
     @Metadata(label = "producer", description = "The namespace labels", javaType = "Map<String, String>",
               applicableFor = SCHEME_NAMESPACES)
@@ -73,6 +74,35 @@ public final class KubernetesConstants {
               description = "The number of replicas for a replication controller during the Scale operation",
               javaType = "Integer", applicableFor = SCHEME_REPLICATION_CONTROLLERS)
     public static final String KUBERNETES_REPLICATION_CONTROLLER_REPLICAS = "CamelKubernetesReplicationControllerReplicas";
+    @Metadata(label = "producer", description = "The event labels", javaType = "Map<String, String>",
+              applicableFor = SCHEME_EVENTS)
+    public static final String KUBERNETES_EVENTS_LABELS = "CamelKubernetesEventsLabels";
+    @Metadata(label = "producer",
+              description = "The event time in ISO-8601 extended offset date-time format, such as '2011-12-03T10:15:30+01:00'.",
+              javaType = "String", defaultValue = "server time", applicableFor = SCHEME_EVENTS)
+    public static final String KUBERNETES_EVENT_TIME = "CamelKubernetesEventTime";
+    @Metadata(label = "producer", description = "The event action", javaType = "String", applicableFor = SCHEME_EVENTS)
+    public static final String KUBERNETES_EVENT_ACTION_PRODUCER = "CamelKubernetesEventAction";
+    @Metadata(label = "producer", description = "The event type", javaType = "String", applicableFor = SCHEME_EVENTS)
+    public static final String KUBERNETES_EVENT_TYPE = "CamelKubernetesEventType";
+    @Metadata(label = "producer", description = "The event reason", javaType = "String", applicableFor = SCHEME_EVENTS)
+    public static final String KUBERNETES_EVENT_REASON = "CamelKubernetesEventReason";
+    @Metadata(label = "producer", description = "The event note", javaType = "String", applicableFor = SCHEME_EVENTS)
+    public static final String KUBERNETES_EVENT_NOTE = "CamelKubernetesEventNote";
+    @Metadata(label = "producer", description = "The event regarding",
+              javaType = "io.fabric8.kubernetes.api.model.ObjectReference", applicableFor = SCHEME_EVENTS)
+    public static final String KUBERNETES_EVENT_REGARDING = "CamelKubernetesEventRegarding";
+    @Metadata(label = "producer", description = "The event related",
+              javaType = "io.fabric8.kubernetes.api.model.ObjectReference", applicableFor = SCHEME_EVENTS)
+    public static final String KUBERNETES_EVENT_RELATED = "CamelKubernetesEventRelated";
+    @Metadata(label = "producer", description = "The event reporting controller", javaType = "String",
+              applicableFor = SCHEME_EVENTS)
+    public static final String KUBERNETES_EVENT_REPORTING_CONTROLLER = "CamelKubernetesEventReportingController";
+    @Metadata(label = "producer", description = "The event reporting instance", javaType = "String",
+              applicableFor = SCHEME_EVENTS)
+    public static final String KUBERNETES_EVENT_REPORTING_INSTANCE = "CamelKubernetesEventReportingInstance";
+    @Metadata(label = "producer", description = "The event name", javaType = "String", applicableFor = SCHEME_EVENTS)
+    public static final String KUBERNETES_EVENT_NAME = "CamelKubernetesEventName";
     @Metadata(label = "producer", description = "The pod labels", javaType = "Map<String, String>", applicableFor = SCHEME_PODS)
     public static final String KUBERNETES_PODS_LABELS = "CamelKubernetesPodsLabels";
     @Metadata(label = "producer", description = "The pod name", javaType = "String", applicableFor = SCHEME_PODS)
@@ -218,12 +248,12 @@ public final class KubernetesConstants {
               javaType = "io.fabric8.kubernetes.client.Watcher.Action",
               applicableFor = {
                       SCHEME_CONFIG_MAPS, SCHEME_DEPLOYMENTS, SCHEME_HPA, SCHEME_NAMESPACES, SCHEME_NODES, SCHEME_PODS,
-                      SCHEME_REPLICATION_CONTROLLERS, SCHEME_SERVICES, SCHEME_DEPLOYMENT_CONFIGS })
+                      SCHEME_REPLICATION_CONTROLLERS, SCHEME_SERVICES, SCHEME_DEPLOYMENT_CONFIGS, SCHEME_EVENTS })
     public static final String KUBERNETES_EVENT_ACTION = "CamelKubernetesEventAction";
     @Metadata(label = "consumer", description = "Timestamp of the action watched by the consumer", javaType = "long",
               applicableFor = {
                       SCHEME_CONFIG_MAPS, SCHEME_DEPLOYMENTS, SCHEME_HPA, SCHEME_NAMESPACES, SCHEME_NODES, SCHEME_PODS,
-                      SCHEME_REPLICATION_CONTROLLERS, SCHEME_SERVICES, SCHEME_DEPLOYMENT_CONFIGS })
+                      SCHEME_REPLICATION_CONTROLLERS, SCHEME_SERVICES, SCHEME_DEPLOYMENT_CONFIGS, SCHEME_EVENTS })
     public static final String KUBERNETES_EVENT_TIMESTAMP = "CamelKubernetesEventTimestamp";
 
     private KubernetesConstants() {
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesOperations.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesOperations.java
index 91d046c3af3..06d6e1851ac 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesOperations.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesOperations.java
@@ -121,6 +121,14 @@ public final class KubernetesOperations {
     public static final String DELETE_CONFIGMAP_OPERATION = "deleteConfigMap";
     public static final String REPLACE_CONFIGMAP_OPERATION = "replaceConfigMap";
 
+    // Events
+    public static final String LIST_EVENTS_OPERATION = "listEvents";
+    public static final String LIST_EVENTS_BY_LABELS_OPERATION = "listEventsByLabels";
+    public static final String GET_EVENT_OPERATION = "getEvent";
+    public static final String CREATE_EVENT_OPERATION = "createEvent";
+    public static final String DELETE_EVENT_OPERATION = "deleteEvent";
+    public static final String REPLACE_EVENT_OPERATION = "replaceEvent";
+
     // Builds
     public static final String LIST_BUILD = "listBuilds";
     public static final String LIST_BUILD_BY_LABELS_OPERATION = "listBuildsByLabels";
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsConsumer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsConsumer.java
index ba2a3e997a6..a7bb255514f 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsConsumer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsConsumer.java
@@ -31,7 +31,6 @@ import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesHelper;
-import org.apache.camel.component.kubernetes.consumer.common.ConfigMapEvent;
 import org.apache.camel.support.DefaultConsumer;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
@@ -108,10 +107,9 @@ public class KubernetesConfigMapsConsumer extends DefaultConsumer {
 
                 @Override
                 public void eventReceived(io.fabric8.kubernetes.client.Watcher.Action action, ConfigMap resource) {
-                    ConfigMapEvent de = new ConfigMapEvent(action, resource);
                     Exchange exchange = createExchange(false);
-                    exchange.getIn().setBody(de.getConfigMap());
-                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, de.getAction());
+                    exchange.getIn().setBody(resource);
+                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, action);
                     exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_TIMESTAMP, System.currentTimeMillis());
                     try {
                         processor.process(exchange);
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/ConfigMapEvent.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/ConfigMapEvent.java
deleted file mode 100644
index d225219a76d..00000000000
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/ConfigMapEvent.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.kubernetes.consumer.common;
-
-import io.fabric8.kubernetes.api.model.ConfigMap;
-import io.fabric8.kubernetes.client.Watcher.Action;
-
-public class ConfigMapEvent {
-    private io.fabric8.kubernetes.client.Watcher.Action action;
-
-    private ConfigMap configMap;
-
-    public ConfigMapEvent(Action action, ConfigMap configMap) {
-        this.action = action;
-        this.configMap = configMap;
-    }
-
-    public io.fabric8.kubernetes.client.Watcher.Action getAction() {
-        return action;
-    }
-
-    public void setAction(io.fabric8.kubernetes.client.Watcher.Action action) {
-        this.action = action;
-    }
-
-    public ConfigMap getConfigMap() {
-        return configMap;
-    }
-
-    public void setConfigMap(ConfigMap configMap) {
-        this.configMap = configMap;
-    }
-}
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/DeploymentEvent.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/DeploymentEvent.java
deleted file mode 100644
index 5b45efa6ed7..00000000000
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/DeploymentEvent.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.kubernetes.consumer.common;
-
-import io.fabric8.kubernetes.api.model.apps.Deployment;
-import io.fabric8.kubernetes.client.Watcher.Action;
-
-public class DeploymentEvent {
-    private io.fabric8.kubernetes.client.Watcher.Action action;
-
-    private Deployment deployment;
-
-    public DeploymentEvent(Action action, Deployment deployment) {
-        this.action = action;
-        this.deployment = deployment;
-    }
-
-    public io.fabric8.kubernetes.client.Watcher.Action getAction() {
-        return action;
-    }
-
-    public void setAction(io.fabric8.kubernetes.client.Watcher.Action action) {
-        this.action = action;
-    }
-
-    public Deployment getDeployment() {
-        return deployment;
-    }
-
-    public void setNode(Deployment deployment) {
-        this.deployment = deployment;
-    }
-}
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/HPAEvent.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/HPAEvent.java
deleted file mode 100644
index 0145bdcba65..00000000000
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/HPAEvent.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.kubernetes.consumer.common;
-
-import io.fabric8.kubernetes.api.model.autoscaling.v1.HorizontalPodAutoscaler;
-import io.fabric8.kubernetes.client.Watcher.Action;
-
-public class HPAEvent {
-    private io.fabric8.kubernetes.client.Watcher.Action action;
-
-    private HorizontalPodAutoscaler hpa;
-
-    public HPAEvent(Action action, HorizontalPodAutoscaler hpa) {
-        this.action = action;
-        this.hpa = hpa;
-    }
-
-    public io.fabric8.kubernetes.client.Watcher.Action getAction() {
-        return action;
-    }
-
-    public void setAction(io.fabric8.kubernetes.client.Watcher.Action action) {
-        this.action = action;
-    }
-
-    public HorizontalPodAutoscaler getHpa() {
-        return hpa;
-    }
-
-    public void setHpa(HorizontalPodAutoscaler hpa) {
-        this.hpa = hpa;
-    }
-
-}
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/NamespaceEvent.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/NamespaceEvent.java
deleted file mode 100644
index e60dedb3687..00000000000
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/NamespaceEvent.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.kubernetes.consumer.common;
-
-import io.fabric8.kubernetes.api.model.Namespace;
-import io.fabric8.kubernetes.client.Watcher.Action;
-
-public class NamespaceEvent {
-    private io.fabric8.kubernetes.client.Watcher.Action action;
-
-    private Namespace namespace;
-
-    public NamespaceEvent(Action action, Namespace namespace) {
-        this.action = action;
-        this.namespace = namespace;
-    }
-
-    public io.fabric8.kubernetes.client.Watcher.Action getAction() {
-        return action;
-    }
-
-    public void setAction(io.fabric8.kubernetes.client.Watcher.Action action) {
-        this.action = action;
-    }
-
-    public Namespace getNamespace() {
-        return namespace;
-    }
-
-    public void setNamespace(Namespace namespace) {
-        this.namespace = namespace;
-    }
-}
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/NodeEvent.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/NodeEvent.java
deleted file mode 100644
index 832ee33bf4b..00000000000
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/NodeEvent.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.kubernetes.consumer.common;
-
-import io.fabric8.kubernetes.api.model.Node;
-import io.fabric8.kubernetes.client.Watcher.Action;
-
-public class NodeEvent {
-    private io.fabric8.kubernetes.client.Watcher.Action action;
-
-    private Node node;
-
-    public NodeEvent(Action action, Node node) {
-        this.action = action;
-        this.node = node;
-    }
-
-    public io.fabric8.kubernetes.client.Watcher.Action getAction() {
-        return action;
-    }
-
-    public void setAction(io.fabric8.kubernetes.client.Watcher.Action action) {
-        this.action = action;
-    }
-
-    public Node getNode() {
-        return node;
-    }
-
-    public void setNode(Node node) {
-        this.node = node;
-    }
-}
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/ReplicationControllerEvent.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/ReplicationControllerEvent.java
deleted file mode 100644
index eff8a2742e6..00000000000
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/ReplicationControllerEvent.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.kubernetes.consumer.common;
-
-import io.fabric8.kubernetes.api.model.ReplicationController;
-import io.fabric8.kubernetes.client.Watcher.Action;
-
-public class ReplicationControllerEvent {
-    private io.fabric8.kubernetes.client.Watcher.Action action;
-
-    private ReplicationController replicationController;
-
-    public ReplicationControllerEvent(Action action, ReplicationController rc) {
-        this.action = action;
-        this.replicationController = rc;
-    }
-
-    public io.fabric8.kubernetes.client.Watcher.Action getAction() {
-        return action;
-    }
-
-    public void setAction(io.fabric8.kubernetes.client.Watcher.Action action) {
-        this.action = action;
-    }
-
-    public ReplicationController getReplicationController() {
-        return replicationController;
-    }
-
-    public void setReplicationController(ReplicationController replicationController) {
-        this.replicationController = replicationController;
-    }
-}
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/ServiceEvent.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/ServiceEvent.java
deleted file mode 100644
index cafe27590e4..00000000000
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/ServiceEvent.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.kubernetes.consumer.common;
-
-import io.fabric8.kubernetes.api.model.Service;
-import io.fabric8.kubernetes.client.Watcher.Action;
-
-public class ServiceEvent {
-    private io.fabric8.kubernetes.client.Watcher.Action action;
-
-    private Service service;
-
-    public ServiceEvent(Action action, Service service) {
-        this.action = action;
-        this.service = service;
-    }
-
-    public io.fabric8.kubernetes.client.Watcher.Action getAction() {
-        return action;
-    }
-
-    public void setAction(io.fabric8.kubernetes.client.Watcher.Action action) {
-        this.action = action;
-    }
-
-    public Service getService() {
-        return service;
-    }
-
-    public void setService(Service service) {
-        this.service = service;
-    }
-}
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/deployments/KubernetesDeploymentsConsumer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/deployments/KubernetesDeploymentsConsumer.java
index a39318c2704..247fbd488cb 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/deployments/KubernetesDeploymentsConsumer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/deployments/KubernetesDeploymentsConsumer.java
@@ -30,7 +30,6 @@ import org.apache.camel.Processor;
 import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesHelper;
-import org.apache.camel.component.kubernetes.consumer.common.DeploymentEvent;
 import org.apache.camel.support.DefaultConsumer;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
@@ -101,10 +100,9 @@ public class KubernetesDeploymentsConsumer extends DefaultConsumer {
 
                 @Override
                 public void eventReceived(io.fabric8.kubernetes.client.Watcher.Action action, Deployment resource) {
-                    DeploymentEvent de = new DeploymentEvent(action, resource);
                     Exchange exchange = createExchange(false);
-                    exchange.getIn().setBody(de.getDeployment());
-                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, de.getAction());
+                    exchange.getIn().setBody(resource);
+                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, action);
                     exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_TIMESTAMP, System.currentTimeMillis());
                     try {
                         processor.process(exchange);
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/PodEvent.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/events/KubernetesEventsComponent.java
similarity index 53%
rename from components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/PodEvent.java
rename to components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/events/KubernetesEventsComponent.java
index c5c2d443224..55949ad4259 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/PodEvent.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/events/KubernetesEventsComponent.java
@@ -14,34 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.kubernetes.consumer.common;
+package org.apache.camel.component.kubernetes.events;
 
-import io.fabric8.kubernetes.api.model.Pod;
-import io.fabric8.kubernetes.client.Watcher.Action;
+import org.apache.camel.component.kubernetes.AbstractKubernetesComponent;
+import org.apache.camel.component.kubernetes.KubernetesConfiguration;
+import org.apache.camel.spi.annotations.Component;
 
-public class PodEvent {
-    private io.fabric8.kubernetes.client.Watcher.Action action;
+@Component("kubernetes-events")
+public class KubernetesEventsComponent extends AbstractKubernetesComponent {
 
-    private Pod pod;
-
-    public PodEvent(Action action, Pod pod) {
-        this.action = action;
-        this.pod = pod;
-    }
-
-    public io.fabric8.kubernetes.client.Watcher.Action getAction() {
-        return action;
-    }
-
-    public void setAction(io.fabric8.kubernetes.client.Watcher.Action action) {
-        this.action = action;
-    }
-
-    public Pod getPod() {
-        return pod;
-    }
-
-    public void setPod(Pod pod) {
-        this.pod = pod;
+    @Override
+    protected KubernetesEventsEndpoint doCreateEndpoint(String uri, String remaining, KubernetesConfiguration config) {
+        return new KubernetesEventsEndpoint(uri, this, config);
     }
 }
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsConsumer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/events/KubernetesEventsConsumer.java
similarity index 73%
copy from components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsConsumer.java
copy to components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/events/KubernetesEventsConsumer.java
index ba2a3e997a6..5cb017280ef 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsConsumer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/events/KubernetesEventsConsumer.java
@@ -14,12 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.kubernetes.config_maps;
+package org.apache.camel.component.kubernetes.events;
 
 import java.util.concurrent.ExecutorService;
 
-import io.fabric8.kubernetes.api.model.ConfigMap;
-import io.fabric8.kubernetes.api.model.ConfigMapList;
+import io.fabric8.kubernetes.api.model.events.v1.Event;
+import io.fabric8.kubernetes.api.model.events.v1.EventList;
 import io.fabric8.kubernetes.client.Watch;
 import io.fabric8.kubernetes.client.Watcher;
 import io.fabric8.kubernetes.client.WatcherException;
@@ -31,21 +31,20 @@ import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesHelper;
-import org.apache.camel.component.kubernetes.consumer.common.ConfigMapEvent;
 import org.apache.camel.support.DefaultConsumer;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class KubernetesConfigMapsConsumer extends DefaultConsumer {
+public class KubernetesEventsConsumer extends DefaultConsumer {
 
-    private static final Logger LOG = LoggerFactory.getLogger(KubernetesConfigMapsConsumer.class);
+    private static final Logger LOG = LoggerFactory.getLogger(KubernetesEventsConsumer.class);
 
     private final Processor processor;
     private ExecutorService executor;
-    private ConfigMapsConsumerTask configMapWatcher;
+    private EventsConsumerTask eventWatcher;
 
-    public KubernetesConfigMapsConsumer(AbstractKubernetesEndpoint endpoint, Processor processor) {
+    public KubernetesEventsConsumer(AbstractKubernetesEndpoint endpoint, Processor processor) {
         super(endpoint, processor);
         this.processor = processor;
     }
@@ -60,17 +59,17 @@ public class KubernetesConfigMapsConsumer extends DefaultConsumer {
         super.doStart();
         executor = getEndpoint().createExecutor();
 
-        configMapWatcher = new ConfigMapsConsumerTask();
-        executor.submit(configMapWatcher);
+        eventWatcher = new EventsConsumerTask();
+        executor.submit(eventWatcher);
     }
 
     @Override
     protected void doStop() throws Exception {
         super.doStop();
 
-        LOG.debug("Stopping Kubernetes ConfigMap Consumer");
+        LOG.debug("Stopping Kubernetes Event Consumer");
         if (executor != null) {
-            KubernetesHelper.close(configMapWatcher, configMapWatcher::getWatch);
+            KubernetesHelper.close(eventWatcher, eventWatcher::getWatch);
 
             if (getEndpoint() != null && getEndpoint().getCamelContext() != null) {
                 getEndpoint().getCamelContext().getExecutorServiceManager().shutdownNow(executor);
@@ -81,37 +80,36 @@ public class KubernetesConfigMapsConsumer extends DefaultConsumer {
         executor = null;
     }
 
-    class ConfigMapsConsumerTask implements Runnable {
+    class EventsConsumerTask implements Runnable {
 
         private Watch watch;
 
         @Override
         public void run() {
 
-            FilterWatchListDeletable<ConfigMap, ConfigMapList, Resource<ConfigMap>> w = null;
+            FilterWatchListDeletable<Event, EventList, Resource<Event>> w = null;
             if (ObjectHelper.isNotEmpty(getEndpoint().getKubernetesConfiguration().getLabelKey())
                     && ObjectHelper.isNotEmpty(getEndpoint().getKubernetesConfiguration().getLabelValue())) {
-                w = getEndpoint().getKubernetesClient().configMaps().withLabel(
+                w = getEndpoint().getKubernetesClient().events().v1().events().withLabel(
                         getEndpoint().getKubernetesConfiguration().getLabelKey(),
                         getEndpoint().getKubernetesConfiguration().getLabelValue());
             }
             if (ObjectHelper.isNotEmpty(getEndpoint().getKubernetesConfiguration().getResourceName())) {
-                Resource<ConfigMap> configMapResource = getEndpoint()
-                        .getKubernetesClient().configMaps()
+                Resource<Event> eventResource = getEndpoint()
+                        .getKubernetesClient().events().v1().events()
                         .withName(getEndpoint().getKubernetesConfiguration().getResourceName());
-                w = (FilterWatchListDeletable<ConfigMap, ConfigMapList, Resource<ConfigMap>>) configMapResource;
+                w = (FilterWatchListDeletable<Event, EventList, Resource<Event>>) eventResource;
             }
             if (w == null) {
                 throw new RuntimeCamelException("Consumer label key or consumer resource name need to be set.");
             }
-            watch = w.watch(new Watcher<ConfigMap>() {
+            watch = w.watch(new Watcher<>() {
 
                 @Override
-                public void eventReceived(io.fabric8.kubernetes.client.Watcher.Action action, ConfigMap resource) {
-                    ConfigMapEvent de = new ConfigMapEvent(action, resource);
+                public void eventReceived(Action action, Event resource) {
                     Exchange exchange = createExchange(false);
-                    exchange.getIn().setBody(de.getConfigMap());
-                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, de.getAction());
+                    exchange.getIn().setBody(resource);
+                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, action);
                     exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_TIMESTAMP, System.currentTimeMillis());
                     try {
                         processor.process(exchange);
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/events/KubernetesEventsEndpoint.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/events/KubernetesEventsEndpoint.java
new file mode 100644
index 00000000000..e5a3b2fd3e3
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/events/KubernetesEventsEndpoint.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.kubernetes.events;
+
+import org.apache.camel.Category;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint;
+import org.apache.camel.component.kubernetes.KubernetesConfiguration;
+import org.apache.camel.component.kubernetes.KubernetesConstants;
+import org.apache.camel.spi.UriEndpoint;
+
+import static org.apache.camel.component.kubernetes.KubernetesConstants.SCHEME_EVENTS;
+
+/**
+ * Perform operations on Kubernetes Events and get notified on Events changes.
+ */
+@UriEndpoint(firstVersion = "3.20.0", scheme = SCHEME_EVENTS, title = "Kubernetes Event",
+             syntax = "kubernetes-events:masterUrl",
+             category = { Category.CONTAINER, Category.CLOUD, Category.PAAS }, headersClass = KubernetesConstants.class)
+public class KubernetesEventsEndpoint extends AbstractKubernetesEndpoint {
+
+    public KubernetesEventsEndpoint(String uri, KubernetesEventsComponent component, KubernetesConfiguration config) {
+        super(uri, component, config);
+    }
+
+    @Override
+    public Producer createProducer() throws Exception {
+        return new KubernetesEventsProducer(this);
+    }
+
+    @Override
+    public Consumer createConsumer(Processor processor) throws Exception {
+        Consumer consumer = new KubernetesEventsConsumer(this, processor);
+        configureConsumer(consumer);
+        return consumer;
+
+    }
+
+}
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/events/KubernetesEventsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/events/KubernetesEventsProducer.java
new file mode 100644
index 00000000000..3d21e33576c
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/events/KubernetesEventsProducer.java
@@ -0,0 +1,207 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.kubernetes.events;
+
+import java.time.OffsetDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
+import io.fabric8.kubernetes.api.model.MicroTimeBuilder;
+import io.fabric8.kubernetes.api.model.ObjectReference;
+import io.fabric8.kubernetes.api.model.StatusDetails;
+import io.fabric8.kubernetes.api.model.events.v1.Event;
+import io.fabric8.kubernetes.api.model.events.v1.EventBuilder;
+import io.fabric8.kubernetes.api.model.events.v1.EventList;
+import io.fabric8.kubernetes.client.dsl.Resource;
+import org.apache.camel.Exchange;
+import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint;
+import org.apache.camel.component.kubernetes.KubernetesConstants;
+import org.apache.camel.component.kubernetes.KubernetesHelper;
+import org.apache.camel.component.kubernetes.KubernetesOperations;
+import org.apache.camel.support.DefaultProducer;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.apache.camel.component.kubernetes.KubernetesHelper.prepareOutboundMessage;
+
+public class KubernetesEventsProducer extends DefaultProducer {
+
+    private static final Logger LOG = LoggerFactory.getLogger(KubernetesEventsProducer.class);
+
+    public KubernetesEventsProducer(AbstractKubernetesEndpoint endpoint) {
+        super(endpoint);
+    }
+
+    @Override
+    public AbstractKubernetesEndpoint getEndpoint() {
+        return (AbstractKubernetesEndpoint) super.getEndpoint();
+    }
+
+    @Override
+    public void process(Exchange exchange) throws Exception {
+        String operation = KubernetesHelper.extractOperation(getEndpoint(), exchange);
+
+        switch (operation) {
+
+            case KubernetesOperations.LIST_EVENTS_OPERATION:
+                doList(exchange);
+                break;
+
+            case KubernetesOperations.LIST_EVENTS_BY_LABELS_OPERATION:
+                doListEventsByLabel(exchange);
+                break;
+
+            case KubernetesOperations.GET_EVENT_OPERATION:
+                doGetEvent(exchange);
+                break;
+
+            case KubernetesOperations.CREATE_EVENT_OPERATION:
+                doCreateEvent(exchange);
+                break;
+
+            case KubernetesOperations.REPLACE_EVENT_OPERATION:
+                doReplaceEvent(exchange);
+                break;
+
+            case KubernetesOperations.DELETE_EVENT_OPERATION:
+                doDeleteEvent(exchange);
+                break;
+
+            default:
+                throw new IllegalArgumentException("Unsupported operation " + operation);
+        }
+    }
+
+    protected void doList(Exchange exchange) {
+        EventList eventList;
+        String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        if (ObjectHelper.isNotEmpty(namespaceName)) {
+            eventList = getEndpoint().getKubernetesClient().events().v1().events().inNamespace(namespaceName).list();
+        } else {
+            eventList = getEndpoint().getKubernetesClient().events().v1().events().inAnyNamespace().list();
+        }
+        prepareOutboundMessage(exchange, eventList.getItems());
+    }
+
+    protected void doListEventsByLabel(Exchange exchange) {
+        Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_EVENTS_LABELS, Map.class);
+        if (ObjectHelper.isEmpty(labels)) {
+            LOG.error("Get events by labels require specify a labels set");
+            throw new IllegalArgumentException("Get events by labels require specify a labels set");
+        }
+
+        EventList eventList = getEndpoint().getKubernetesClient()
+                .events()
+                .v1()
+                .events()
+                .inAnyNamespace()
+                .withLabels(labels)
+                .list();
+
+        prepareOutboundMessage(exchange, eventList.getItems());
+    }
+
+    protected void doGetEvent(Exchange exchange) {
+        String eventName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_EVENT_NAME, String.class);
+        String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        if (ObjectHelper.isEmpty(eventName)) {
+            LOG.error("Get a specific event require specify a event name");
+            throw new IllegalArgumentException("Get a specific event require specify a event name");
+        }
+        if (ObjectHelper.isEmpty(namespaceName)) {
+            LOG.error("Get a specific event require specify a namespace name");
+            throw new IllegalArgumentException("Get a specific event require specify a namespace name");
+        }
+        Event event = getEndpoint().getKubernetesClient().events().v1().events().inNamespace(namespaceName).withName(eventName)
+                .get();
+
+        prepareOutboundMessage(exchange, event);
+    }
+
+    protected void doReplaceEvent(Exchange exchange) {
+        doCreateOrUpdateEvent(exchange, "Replace", Resource::replace);
+    }
+
+    protected void doCreateEvent(Exchange exchange) {
+        doCreateOrUpdateEvent(exchange, "Create", Resource::create);
+    }
+
+    private void doCreateOrUpdateEvent(Exchange exchange, String operationName, Function<Resource<Event>, Event> operation) {
+        String eventName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_EVENT_NAME, String.class);
+        String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        if (ObjectHelper.isEmpty(eventName)) {
+            LOG.error("{} a specific event require specify a event name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific event require specify a event name", operationName));
+        }
+        if (ObjectHelper.isEmpty(namespaceName)) {
+            LOG.error("{} a specific event require specify a namespace name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific event require specify a namespace name", operationName));
+        }
+        Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_EVENTS_LABELS, Map.class);
+        EventBuilder builder = exchange.getIn().getBody(EventBuilder.class);
+        if (builder == null) {
+            builder = new EventBuilder()
+                    .withEventTime(new MicroTimeBuilder().withTime(
+                            exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_EVENT_TIME,
+                                    () -> OffsetDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME), String.class))
+                            .build())
+                    .withAction(exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION_PRODUCER, String.class))
+                    .withType(exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_EVENT_TYPE, String.class))
+                    .withReason(exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_EVENT_REASON, String.class))
+                    .withNote(exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_EVENT_NOTE, String.class))
+                    .withReportingController(
+                            exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_EVENT_REPORTING_CONTROLLER, String.class))
+                    .withReportingInstance(
+                            exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_EVENT_REPORTING_INSTANCE, String.class))
+                    .withRegarding(
+                            exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_EVENT_REGARDING, ObjectReference.class))
+                    .withRelated(
+                            exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_EVENT_RELATED, ObjectReference.class));
+        }
+        Event eventCreating = builder.withNewMetadata().withName(eventName).withLabels(labels).endMetadata()
+                .build();
+        Event event = operation.apply(
+                getEndpoint().getKubernetesClient().events().v1().events().inNamespace(namespaceName).resource(eventCreating));
+
+        prepareOutboundMessage(exchange, event);
+    }
+
+    protected void doDeleteEvent(Exchange exchange) {
+        String eventName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_EVENT_NAME, String.class);
+        String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        if (ObjectHelper.isEmpty(eventName)) {
+            LOG.error("Delete a specific event require specify a event name");
+            throw new IllegalArgumentException("Delete a specific event require specify a event name");
+        }
+        if (ObjectHelper.isEmpty(namespaceName)) {
+            LOG.error("Delete a specific event require specify a namespace name");
+            throw new IllegalArgumentException("Delete a specific event require specify a namespace name");
+        }
+
+        List<StatusDetails> statusDetails
+                = getEndpoint().getKubernetesClient().events().v1().events().inNamespace(namespaceName).withName(eventName)
+                        .delete();
+        boolean eventDeleted = ObjectHelper.isNotEmpty(statusDetails);
+
+        prepareOutboundMessage(exchange, eventDeleted);
+    }
+}
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/hpa/KubernetesHPAConsumer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/hpa/KubernetesHPAConsumer.java
index 73a7f2e58e2..53ba9b36953 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/hpa/KubernetesHPAConsumer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/hpa/KubernetesHPAConsumer.java
@@ -30,7 +30,6 @@ import org.apache.camel.Processor;
 import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesHelper;
-import org.apache.camel.component.kubernetes.consumer.common.HPAEvent;
 import org.apache.camel.support.DefaultConsumer;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
@@ -105,10 +104,9 @@ public class KubernetesHPAConsumer extends DefaultConsumer {
                 @Override
                 public void eventReceived(
                         io.fabric8.kubernetes.client.Watcher.Action action, HorizontalPodAutoscaler resource) {
-                    HPAEvent hpae = new HPAEvent(action, resource);
                     Exchange exchange = createExchange(false);
-                    exchange.getIn().setBody(hpae.getHpa());
-                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, hpae.getAction());
+                    exchange.getIn().setBody(resource);
+                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, action);
                     exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_TIMESTAMP, System.currentTimeMillis());
                     try {
                         processor.process(exchange);
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/namespaces/KubernetesNamespacesConsumer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/namespaces/KubernetesNamespacesConsumer.java
index e8b09160811..768ee1b1e1d 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/namespaces/KubernetesNamespacesConsumer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/namespaces/KubernetesNamespacesConsumer.java
@@ -30,7 +30,6 @@ import org.apache.camel.Processor;
 import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesHelper;
-import org.apache.camel.component.kubernetes.consumer.common.NamespaceEvent;
 import org.apache.camel.support.DefaultConsumer;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
@@ -95,10 +94,9 @@ public class KubernetesNamespacesConsumer extends DefaultConsumer {
 
                 @Override
                 public void eventReceived(io.fabric8.kubernetes.client.Watcher.Action action, Namespace resource) {
-                    NamespaceEvent ne = new NamespaceEvent(action, resource);
                     Exchange exchange = createExchange(false);
-                    exchange.getIn().setBody(ne.getNamespace());
-                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, ne.getAction());
+                    exchange.getIn().setBody(resource);
+                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, action);
                     exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_TIMESTAMP, System.currentTimeMillis());
                     try {
                         processor.process(exchange);
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/nodes/KubernetesNodesConsumer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/nodes/KubernetesNodesConsumer.java
index 17814fc398f..e5fe5a4daef 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/nodes/KubernetesNodesConsumer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/nodes/KubernetesNodesConsumer.java
@@ -30,7 +30,6 @@ import org.apache.camel.Processor;
 import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesHelper;
-import org.apache.camel.component.kubernetes.consumer.common.NodeEvent;
 import org.apache.camel.support.DefaultConsumer;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
@@ -99,10 +98,9 @@ public class KubernetesNodesConsumer extends DefaultConsumer {
 
                 @Override
                 public void eventReceived(io.fabric8.kubernetes.client.Watcher.Action action, Node resource) {
-                    NodeEvent ne = new NodeEvent(action, resource);
                     Exchange exchange = createExchange(false);
-                    exchange.getIn().setBody(ne.getNode());
-                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, ne.getAction());
+                    exchange.getIn().setBody(resource);
+                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, action);
                     exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_TIMESTAMP, System.currentTimeMillis());
                     try {
                         processor.process(exchange);
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/pods/KubernetesPodsConsumer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/pods/KubernetesPodsConsumer.java
index 3d494ffd14f..74acf903f53 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/pods/KubernetesPodsConsumer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/pods/KubernetesPodsConsumer.java
@@ -30,7 +30,6 @@ import org.apache.camel.Processor;
 import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesHelper;
-import org.apache.camel.component.kubernetes.consumer.common.PodEvent;
 import org.apache.camel.support.DefaultConsumer;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
@@ -102,10 +101,9 @@ public class KubernetesPodsConsumer extends DefaultConsumer {
 
                 @Override
                 public void eventReceived(io.fabric8.kubernetes.client.Watcher.Action action, Pod resource) {
-                    PodEvent pe = new PodEvent(action, resource);
                     Exchange exchange = createExchange(false);
-                    exchange.getIn().setBody(pe.getPod());
-                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, pe.getAction());
+                    exchange.getIn().setBody(resource);
+                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, action);
                     exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_TIMESTAMP, System.currentTimeMillis());
                     try {
                         processor.process(exchange);
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/replication_controllers/KubernetesReplicationControllersConsumer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/replication_controllers/KubernetesReplicationControllersConsumer.java
index 6ad2e76058f..c6bc153a924 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/replication_controllers/KubernetesReplicationControllersConsumer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/replication_controllers/KubernetesReplicationControllersConsumer.java
@@ -30,7 +30,6 @@ import org.apache.camel.Processor;
 import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesHelper;
-import org.apache.camel.component.kubernetes.consumer.common.ReplicationControllerEvent;
 import org.apache.camel.support.DefaultConsumer;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
@@ -103,10 +102,9 @@ public class KubernetesReplicationControllersConsumer extends DefaultConsumer {
 
                 @Override
                 public void eventReceived(io.fabric8.kubernetes.client.Watcher.Action action, ReplicationController resource) {
-                    ReplicationControllerEvent rce = new ReplicationControllerEvent(action, resource);
                     Exchange exchange = createExchange(false);
-                    exchange.getIn().setBody(rce.getReplicationController());
-                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, rce.getAction());
+                    exchange.getIn().setBody(resource);
+                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, action);
                     exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_TIMESTAMP, System.currentTimeMillis());
                     try {
                         processor.process(exchange);
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/services/KubernetesServicesConsumer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/services/KubernetesServicesConsumer.java
index 32e60a48ef4..c6ae8759024 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/services/KubernetesServicesConsumer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/services/KubernetesServicesConsumer.java
@@ -30,7 +30,6 @@ import org.apache.camel.Processor;
 import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesHelper;
-import org.apache.camel.component.kubernetes.consumer.common.ServiceEvent;
 import org.apache.camel.support.DefaultConsumer;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
@@ -102,10 +101,9 @@ public class KubernetesServicesConsumer extends DefaultConsumer {
 
                 @Override
                 public void eventReceived(io.fabric8.kubernetes.client.Watcher.Action action, Service resource) {
-                    ServiceEvent se = new ServiceEvent(action, resource);
                     Exchange exchange = createExchange(false);
-                    exchange.getIn().setBody(se.getService());
-                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, se.getAction());
+                    exchange.getIn().setBody(resource);
+                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, action);
                     exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_TIMESTAMP, System.currentTimeMillis());
                     try {
                         processor.process(exchange);
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesEventsConsumerIT.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesEventsConsumerIT.java
new file mode 100644
index 00000000000..1b710dd159e
--- /dev/null
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesEventsConsumerIT.java
@@ -0,0 +1,229 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.kubernetes.consumer.integration;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import io.fabric8.kubernetes.api.model.MicroTimeBuilder;
+import io.fabric8.kubernetes.api.model.ObjectReferenceBuilder;
+import io.fabric8.kubernetes.api.model.events.v1.Event;
+import io.fabric8.kubernetes.api.model.events.v1.EventBuilder;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.kubernetes.KubernetesConstants;
+import org.apache.camel.component.kubernetes.KubernetesTestSupport;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.condition.EnabledIfSystemProperties;
+import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+@EnabledIfSystemProperties({
+        @EnabledIfSystemProperty(named = "kubernetes.test.auth", matches = ".*", disabledReason = "Requires kubernetes"),
+        @EnabledIfSystemProperty(named = "kubernetes.test.host", matches = ".*", disabledReason = "Requires kubernetes"),
+        @EnabledIfSystemProperty(named = "kubernetes.test.host.k8s", matches = "true", disabledReason = "Requires kubernetes"),
+})
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+public class KubernetesEventsConsumerIT extends KubernetesTestSupport {
+
+    @EndpointInject("mock:result")
+    protected MockEndpoint mockResultEndpoint;
+
+    private void setupFullEventWithHeaders(Exchange exchange) {
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "default");
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_NAME, "test");
+        Map<String, String> labels = new HashMap<>();
+        labels.put("this", "rocks");
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENTS_LABELS, labels);
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_TIME, "2022-10-10T17:30:47.986439Z");
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION_PRODUCER, "Some Action");
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_TYPE, "Warning");
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_REASON, "Some Reason");
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_NOTE, "Some Note");
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_REGARDING,
+                new ObjectReferenceBuilder().withName("Some Regarding").build());
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_RELATED,
+                new ObjectReferenceBuilder().withName("Some Related").build());
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_REPORTING_CONTROLLER, "Some-Reporting-Controller");
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_REPORTING_INSTANCE, "Some-Reporting-Instance");
+
+    }
+
+    @Test
+    @Order(1)
+    void createFullEventWithHeaders() throws Exception {
+        mockResultEndpoint.expectedMessageCount(1);
+        mockResultEndpoint.expectedHeaderValuesReceivedInAnyOrder(KubernetesConstants.KUBERNETES_EVENT_ACTION, "ADDED");
+        Exchange ex = template.request("direct:createEvent", this::setupFullEventWithHeaders);
+
+        assertNotNull(ex);
+        assertNotNull(ex.getMessage());
+        assertNotNull(ex.getMessage().getBody());
+
+        Event evt = ex.getMessage().getBody(Event.class);
+        assertEquals("test", evt.getMetadata().getName());
+        assertEquals(Map.of("this", "rocks"), evt.getMetadata().getLabels());
+        assertEquals("default", evt.getMetadata().getNamespace());
+        assertEquals(new MicroTimeBuilder().withTime("2022-10-10T17:30:47.986439Z").build(), evt.getEventTime());
+        assertEquals("Some Action", evt.getAction());
+        assertEquals("Warning", evt.getType());
+        assertEquals("Some Reason", evt.getReason());
+        assertEquals("Some Note", evt.getNote());
+        assertEquals("Some Regarding", evt.getRegarding().getName());
+        assertEquals("Some Related", evt.getRelated().getName());
+        assertEquals("Some-Reporting-Controller", evt.getReportingController());
+        assertEquals("Some-Reporting-Instance", evt.getReportingInstance());
+
+        mockResultEndpoint.assertIsSatisfied();
+    }
+
+    private void setupMinimalEventWithHeaders(Exchange exchange) {
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "default");
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_NAME, "test1");
+        Map<String, String> labels = new HashMap<>();
+        labels.put("this", "rocks");
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENTS_LABELS, labels);
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION_PRODUCER, "Some Action");
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_TYPE, "Normal");
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_REASON, "Some Reason");
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_REPORTING_CONTROLLER, "Some-Reporting-Controller");
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_REPORTING_INSTANCE, "Some-Reporting-Instance");
+
+    }
+
+    @Test
+    @Order(2)
+    void createMinimalEventWithHeaders() throws Exception {
+        mockResultEndpoint.expectedMessageCount(1);
+        mockResultEndpoint.expectedHeaderValuesReceivedInAnyOrder(KubernetesConstants.KUBERNETES_EVENT_ACTION, "ADDED");
+        Exchange ex = template.request("direct:createEvent", this::setupMinimalEventWithHeaders);
+
+        assertNotNull(ex);
+        assertNotNull(ex.getMessage());
+        assertNotNull(ex.getMessage().getBody());
+
+        Event evt = ex.getMessage().getBody(Event.class);
+        assertEquals("test1", evt.getMetadata().getName());
+        assertEquals(Map.of("this", "rocks"), evt.getMetadata().getLabels());
+        assertEquals("default", evt.getMetadata().getNamespace());
+        assertNotNull(evt.getEventTime());
+        assertEquals("Some Action", evt.getAction());
+        assertEquals("Normal", evt.getType());
+        assertEquals("Some Reason", evt.getReason());
+        assertEquals("Some-Reporting-Controller", evt.getReportingController());
+        assertEquals("Some-Reporting-Instance", evt.getReportingInstance());
+
+        mockResultEndpoint.assertIsSatisfied();
+    }
+
+    private void setupMinimalEventWithBuilder(Exchange exchange) {
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "default");
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_NAME, "test2");
+        Map<String, String> labels = new HashMap<>();
+        labels.put("this", "rocks");
+        exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENTS_LABELS, labels);
+        exchange.getIn().setBody(
+                new EventBuilder()
+                        .withAction("Some Action")
+                        .withType("Normal")
+                        .withReason("Some Reason")
+                        .withReportingController("Some-Reporting-Controller")
+                        .withReportingInstance("Some-Reporting-Instance")
+                        .withEventTime(new MicroTimeBuilder().withTime("2022-10-10T19:33:47.986439Z").build()));
+    }
+
+    @Test
+    @Order(3)
+    void createMinimalEventWithBuilder() throws Exception {
+        mockResultEndpoint.expectedMessageCount(1);
+        mockResultEndpoint.expectedHeaderValuesReceivedInAnyOrder(KubernetesConstants.KUBERNETES_EVENT_ACTION, "ADDED");
+        Exchange ex = template.request("direct:createEvent", this::setupMinimalEventWithBuilder);
+
+        assertNotNull(ex);
+        assertNotNull(ex.getMessage());
+        assertNotNull(ex.getMessage().getBody());
+
+        Event evt = ex.getMessage().getBody(Event.class);
+        assertEquals("test2", evt.getMetadata().getName());
+        assertEquals(Map.of("this", "rocks"), evt.getMetadata().getLabels());
+        assertEquals("default", evt.getMetadata().getNamespace());
+        assertNotNull(evt.getEventTime());
+        assertEquals("Some Action", evt.getAction());
+        assertEquals("Normal", evt.getType());
+        assertEquals("Some Reason", evt.getReason());
+        assertEquals("Some-Reporting-Controller", evt.getReportingController());
+        assertEquals("Some-Reporting-Instance", evt.getReportingInstance());
+
+        mockResultEndpoint.assertIsSatisfied();
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = { "test", "test1", "test2" })
+    @Order(4)
+    void deleteEvent(String eventName) throws Exception {
+        mockResultEndpoint.expectedMessageCount(1);
+        mockResultEndpoint.expectedHeaderValuesReceivedInAnyOrder(KubernetesConstants.KUBERNETES_EVENT_ACTION, "DELETED");
+        Exchange ex = template.request("direct:deleteEvent", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "default");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_NAME, eventName);
+        });
+
+        boolean eventDeleted = ex.getMessage().getBody(Boolean.class);
+
+        assertTrue(eventDeleted);
+
+        mockResultEndpoint.assertIsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:createEvent").toF("kubernetes-events://%s?oauthToken=%s&operation=createEvent", host, authToken);
+                from("direct:deleteEvent").toF("kubernetes-events://%s?oauthToken=%s&operation=deleteEvent", host, authToken);
+                fromF("kubernetes-events://%s?oauthToken=%s&namespace=default&labelKey=this&labelValue=rocks", host, authToken)
+                        .process(new KubernetesProcessor())
+                        .to(mockResultEndpoint);
+            }
+        };
+    }
+
+    public class KubernetesProcessor implements Processor {
+        @Override
+        public void process(Exchange exchange) {
+            Message in = exchange.getIn();
+            Event event = exchange.getIn().getBody(Event.class);
+            log.info("Got event with event name: " + event.getMetadata().getName() + " and action "
+                     + in.getHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION));
+        }
+    }
+}
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesEventsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesEventsProducerTest.java
new file mode 100644
index 00000000000..047462d2ef6
--- /dev/null
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesEventsProducerTest.java
@@ -0,0 +1,180 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.kubernetes.producer;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import io.fabric8.kubernetes.api.model.events.v1.Event;
+import io.fabric8.kubernetes.api.model.events.v1.EventBuilder;
+import io.fabric8.kubernetes.api.model.events.v1.EventListBuilder;
+import io.fabric8.kubernetes.client.KubernetesClient;
+import io.fabric8.kubernetes.client.NamespacedKubernetesClient;
+import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient;
+import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.kubernetes.KubernetesConstants;
+import org.apache.camel.component.kubernetes.KubernetesTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+@EnableKubernetesMockClient
+public class KubernetesEventsProducerTest extends KubernetesTestSupport {
+
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
+
+    @BindToRegistry("kubernetesClient")
+    public KubernetesClient getClient() {
+        return client;
+    }
+
+    @Test
+    void listTest() {
+        server.expect().withPath("/apis/events.k8s.io/v1/events")
+                .andReturn(200, new EventListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build()).once();
+        server.expect().withPath("/apis/events.k8s.io/v1/namespaces/test/events")
+                .andReturn(200, new EventListBuilder().addNewItem().and().addNewItem().and().build()).once();
+        List<?> result = template.requestBody("direct:list", "", List.class);
+        assertEquals(3, result.size());
+
+        Exchange ex = template.request("direct:list",
+                exchange -> exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test"));
+        List<?> resultNamespace = ex.getMessage().getBody(List.class);
+
+        assertEquals(2, resultNamespace.size());
+    }
+
+    @Test
+    void listByLabelsTest() throws Exception {
+        server.expect().withPath("/apis/events.k8s.io/v1/events?labelSelector=" + toUrlEncoded("key1=value1,key2=value2"))
+                .andReturn(200, new EventListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build()).once();
+        Exchange ex = template.request("direct:listByLabels", exchange -> {
+            Map<String, String> labels = new HashMap<>();
+            labels.put("key1", "value1");
+            labels.put("key2", "value2");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENTS_LABELS, labels);
+        });
+
+        List<?> result = ex.getMessage().getBody(List.class);
+
+        assertEquals(3, result.size());
+    }
+
+    @Test
+    void getEventTest() {
+        Event event1 = new EventBuilder().withNewMetadata().withName("event1").withNamespace("test").and().build();
+        Event event2 = new EventBuilder().withNewMetadata().withName("event2").withNamespace("ns1").and().build();
+
+        server.expect().withPath("/apis/events.k8s.io/v1/namespaces/test/events/event1").andReturn(200, event1).once();
+        server.expect().withPath("/apis/events.k8s.io/v1/namespaces/ns1/events/event2").andReturn(200, event2).once();
+        Exchange ex = template.request("direct:get", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_NAME, "event1");
+        });
+
+        Event result = ex.getMessage().getBody(Event.class);
+
+        assertEquals("event1", result.getMetadata().getName());
+    }
+
+    @Test
+    void createEvent() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        String reason = "SomeReason";
+        Event event1 = new EventBuilder().withNewMetadata().withName("event1").withNamespace("test").withLabels(labels).and()
+                .withReason(reason).build();
+        server.expect().post().withPath("/apis/events.k8s.io/v1/namespaces/test/events").andReturn(200, event1).once();
+
+        Exchange ex = template.request("direct:create", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENTS_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_NAME, "event1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_REASON, reason);
+        });
+
+        Event result = ex.getMessage().getBody(Event.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("event1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals(reason, result.getReason());
+    }
+
+    @Test
+    void replaceEvent() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        String reason = "SomeReason";
+        Event event1 = new EventBuilder().withNewMetadata().withName("event1").withNamespace("test").withLabels(labels).and()
+                .withReason(reason).build();
+        server.expect().get().withPath("/apis/events.k8s.io/v1/namespaces/test/events/event1")
+                .andReturn(200,
+                        new EventBuilder().withNewMetadata().withName("event1").withNamespace("test").endMetadata().build())
+                .once();
+        server.expect().put().withPath("/apis/events.k8s.io/v1/namespaces/test/events/event1").andReturn(200, event1).once();
+
+        Exchange ex = template.request("direct:replace", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENTS_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_NAME, "event1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_REASON, reason);
+        });
+
+        Event result = ex.getMessage().getBody(Event.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("event1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals(reason, result.getReason());
+    }
+
+    @Test
+    void deleteEvent() {
+        Event event1 = new EventBuilder().withNewMetadata().withName("event1").withNamespace("test").and().build();
+        server.expect().withPath("/apis/events.k8s.io/v1/namespaces/test/events/event1").andReturn(200, event1).once();
+
+        Exchange ex = template.request("direct:delete", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_NAME, "event1");
+        });
+
+        boolean eventDeleted = ex.getMessage().getBody(Boolean.class);
+
+        assertTrue(eventDeleted);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:list").to("kubernetes-events:///?kubernetesClient=#kubernetesClient&operation=listEvents");
+                from("direct:listByLabels")
+                        .to("kubernetes-events:///?kubernetesClient=#kubernetesClient&operation=listEventsByLabels");
+                from("direct:get").to("kubernetes-events:///?kubernetesClient=#kubernetesClient&operation=getEvent");
+                from("direct:create").to("kubernetes-events:///?kubernetesClient=#kubernetesClient&operation=createEvent");
+                from("direct:replace").to("kubernetes-events:///?kubernetesClient=#kubernetesClient&operation=replaceEvent");
+                from("direct:delete").to("kubernetes-events:///?kubernetesClient=#kubernetesClient&operation=deleteEvent");
+            }
+        };
+    }
+}