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

nfilotto pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 52eec382051 CAMEL-16909: camel-kubernetes - Event support (#8512)
52eec382051 is described below

commit 52eec3820515d7afbfcb30d70f64aeb060833747
Author: Nicolas Filotto <essob...@users.noreply.github.com>
AuthorDate: Tue Oct 11 14:22:02 2022 +0200

    CAMEL-16909: camel-kubernetes - Event support (#8512)
    
    ## Motivation
    
    The events are not yet supported by the camel-kubernetes component and we 
would like to add its support.
    
    ## Modifications:
    
    * Add a new component called `kubernetes-events` based on other components 
of the same type
    * Remove all classes from the package 
`org.apache.camel.component.kubernetes.consumer.common` as they are useless 
(not directly related to the initial issue)
---
 .../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");
+            }
+        };
+    }
+}


Reply via email to