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

[camel] branch main updated: CAMEL-17438: camel-kubernetes - Add replace operation to producers (#8495)

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 08f86889639 CAMEL-17438: camel-kubernetes - Add replace operation to producers (#8495)
08f86889639 is described below

commit 08f868896393029e381eb75c0e7a117a7ea6abe1
Author: Nicolas Filotto <es...@users.noreply.github.com>
AuthorDate: Fri Oct 7 17:15:35 2022 +0200

    CAMEL-17438: camel-kubernetes - Add replace operation to producers (#8495)
    
    ## Motivation
    
    We would like to be able to replace an existing resource type and for this, we would need to add the replace operation to all existing producers that support it.
    
    ## Modifications:
    
    * Fix warnings and deprecations
    * Improve the code coverage by adding tests to validate the behavior of mainly create operations
    * Add replace operation to producers
---
 .../docs/kubernetes-config-maps-component.adoc     |   1 +
 .../kubernetes-custom-resources-component.adoc     |   1 +
 .../docs/kubernetes-deployments-component.adoc     |   1 +
 .../src/main/docs/kubernetes-hpa-component.adoc    |   1 +
 .../src/main/docs/kubernetes-job-component.adoc    |   1 +
 .../main/docs/kubernetes-namespaces-component.adoc |   1 +
 .../src/main/docs/kubernetes-nodes-component.adoc  |   1 +
 ...rnetes-persistent-volumes-claims-component.adoc |   1 +
 .../src/main/docs/kubernetes-pods-component.adoc   |   1 +
 ...bernetes-replication-controllers-component.adoc |   1 +
 .../docs/kubernetes-resources-quota-component.adoc |   1 +
 .../main/docs/kubernetes-secrets-component.adoc    |   1 +
 .../kubernetes-service-accounts-component.adoc     |   1 +
 .../openshift-deploymentconfigs-component.adoc     |   1 +
 .../component/kubernetes/KubernetesHelper.java     |   6 +-
 .../component/kubernetes/KubernetesOperations.java |  15 +++
 .../cloud/KubernetesClientServiceDiscovery.java    |   4 +-
 .../lock/impl/ConfigMapLeaseResourceManager.java   |  11 +-
 .../lock/impl/NativeLeaseResourceManager.java      |  15 +--
 .../config_maps/KubernetesConfigMapsProducer.java  |  37 +++++--
 .../KubernetesCustomResourcesProducer.java         |  23 +++-
 .../deployments/KubernetesDeploymentsProducer.java |  39 +++++--
 .../kubernetes/hpa/KubernetesHPAProducer.java      |  41 +++++---
 .../kubernetes/job/KubernetesJobProducer.java      |  35 +++++--
 .../namespaces/KubernetesNamespacesProducer.java   |  22 +++-
 .../kubernetes/nodes/KubernetesNodesProducer.java  |  29 ++++--
 .../KubernetesPersistentVolumesProducer.java       |   3 +-
 .../KubernetesPersistentVolumesClaimsProducer.java |  43 ++++++--
 .../kubernetes/pods/KubernetesPodsProducer.java    |  34 ++++--
 .../properties/BasePropertiesFunction.java         |  11 +-
 .../KubernetesReplicationControllersProducer.java  |  44 +++++---
 .../KubernetesResourcesQuotaProducer.java          |  39 +++++--
 .../secrets/KubernetesSecretsProducer.java         |  34 ++++--
 .../KubernetesServiceAccountsProducer.java         |  35 +++++--
 .../services/KubernetesServicesProducer.java       |  42 +++++---
 .../OpenshiftBuildConfigsProducer.java             |   8 +-
 .../openshift/builds/OpenshiftBuildsProducer.java  |   5 +-
 .../OpenshiftDeploymentConfigsProducer.java        |  37 +++++--
 .../apache/camel/component/KubernetesServer.java   | 111 --------------------
 .../apache/camel/component/OpenShiftServer.java    | 105 -------------------
 .../kubernetes/KubernetesTestSupport.java          |   3 +-
 .../KubernetesConfigMapsConsumerIT.java            |  35 ++++++-
 .../KubernetesCustomResourcesConsumerIT.java       |  31 +++---
 .../KubernetesNamespacesConsumerIT.java            |  16 +--
 .../integration/KubernetesNodesConsumerIT.java     |   2 +-
 .../integration/KubernetesPodsConsumerIT.java      |   4 +-
 ...KubernetesReplicationControllersConsumerIT.java |  13 +--
 .../integration/KubernetesServicesConsumerIT.java  |   9 +-
 .../producer/KubernetesConfigMapsProducerTest.java |  76 +++++++++++---
 .../KubernetesCustomResourcesProducerTest.java     |  69 +++++++-----
 .../KubernetesDeploymentsProducerTest.java         |  81 +++++++++++---
 .../producer/KubernetesHPAProducerTest.java        | 116 +++++++++++++++------
 .../producer/KubernetesJobProducerTest.java        |  96 +++++++++++++++--
 .../producer/KubernetesNamespacesProducerTest.java |  61 +++++++++--
 .../producer/KubernetesNodesProducerTest.java      |  47 +++++++--
 ...ernetesPersistentVolumesClaimsProducerTest.java |  81 ++++++++++++--
 .../KubernetesPersistentVolumesProducerTest.java   |  21 ++--
 .../producer/KubernetesPodsProducerTest.java       |  81 +++++++++++---
 ...bernetesReplicationControllersProducerTest.java |  86 ++++++++++++---
 .../KubernetesResourcesQuotaProducerTest.java      |  76 ++++++++++++--
 .../producer/KubernetesSecretsProducerTest.java    |  58 +++++++++--
 .../KubernetesServiceAccountsProducerTest.java     |  63 ++++++++---
 .../producer/KubernetesServicesProducerTest.java   |  80 ++++++++++++--
 .../ConfigMapMountPropertiesFunctionTest.java      |  29 +++---
 .../ConfigMapPropertiesFunctionRouteTest.java      |   4 +-
 .../ConfigMapPropertiesFunctionTest.java           |   9 +-
 .../SecretMountPropertiesFunctionTest.java         |  29 +++---
 .../SecretPropertiesFunctionRouteTest.java         |   6 +-
 .../properties/SecretPropertiesFunctionTest.java   |   9 +-
 .../OpenshiftBuildConfigsProducerTest.java         |  21 ++--
 .../producer/OpenshiftBuildsProducerTest.java      |  39 +++----
 .../OpenshiftDeploymentConfigsProducerTest.java    |  89 +++++++++++++---
 72 files changed, 1540 insertions(+), 742 deletions(-)

diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-config-maps-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-config-maps-component.adoc
index 0355489f600..dfe5a6cd862 100644
--- a/components/camel-kubernetes/src/main/docs/kubernetes-config-maps-component.adoc
+++ b/components/camel-kubernetes/src/main/docs/kubernetes-config-maps-component.adoc
@@ -41,6 +41,7 @@ include::partial$component-endpoint-headers.adoc[]
 - listConfigMapsByLabels
 - getConfigMap
 - createConfigMap
+- replaceConfigMap
 - deleteConfigMap
 
 == Kubernetes ConfigMaps Producer Examples
diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-custom-resources-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-custom-resources-component.adoc
index 6c1d0341be5..22b225168c4 100644
--- a/components/camel-kubernetes/src/main/docs/kubernetes-custom-resources-component.adoc
+++ b/components/camel-kubernetes/src/main/docs/kubernetes-custom-resources-component.adoc
@@ -42,6 +42,7 @@ include::partial$component-endpoint-headers.adoc[]
 - getCustomResource
 - deleteCustomResource
 - createCustomResource
+- replaceCustomResource
 
 
 include::spring-boot:partial$starter.adoc[]
diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-deployments-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-deployments-component.adoc
index bd2cd9d5ede..9f14288262c 100644
--- a/components/camel-kubernetes/src/main/docs/kubernetes-deployments-component.adoc
+++ b/components/camel-kubernetes/src/main/docs/kubernetes-deployments-component.adoc
@@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[]
 - listDeploymentsByLabels
 - getDeployment
 - createDeployment
+- replaceDeployment
 - deleteDeployment
 - scaleDeployment
 
diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-hpa-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-hpa-component.adoc
index eb4a8a72c50..7a72504ff96 100644
--- a/components/camel-kubernetes/src/main/docs/kubernetes-hpa-component.adoc
+++ b/components/camel-kubernetes/src/main/docs/kubernetes-hpa-component.adoc
@@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[]
 - listHPAByLabels
 - getHPA
 - createHPA
+- replaceHPA
 - deleteHPA
 
 == Kubernetes HPA Producer Examples
diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-job-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-job-component.adoc
index 497631937e0..e1b5eb02303 100644
--- a/components/camel-kubernetes/src/main/docs/kubernetes-job-component.adoc
+++ b/components/camel-kubernetes/src/main/docs/kubernetes-job-component.adoc
@@ -41,6 +41,7 @@ include::partial$component-endpoint-headers.adoc[]
 - listJobByLabels
 - getJob
 - createJob
+- replaceJob
 - deleteJob
 
 == Kubernetes Job Producer Examples
diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-namespaces-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-namespaces-component.adoc
index bf95acf029b..be43674e7bb 100644
--- a/components/camel-kubernetes/src/main/docs/kubernetes-namespaces-component.adoc
+++ b/components/camel-kubernetes/src/main/docs/kubernetes-namespaces-component.adoc
@@ -41,6 +41,7 @@ include::partial$component-endpoint-headers.adoc[]
 - listNamespacesByLabels
 - getNamespace
 - createNamespace
+- replaceNamespace
 - deleteNamespace
 
 == Kubernetes Namespaces Producer Examples
diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-nodes-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-nodes-component.adoc
index 1f87d1e7a0e..2f9088bab5d 100644
--- a/components/camel-kubernetes/src/main/docs/kubernetes-nodes-component.adoc
+++ b/components/camel-kubernetes/src/main/docs/kubernetes-nodes-component.adoc
@@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[]
 - listNodesByLabels
 - getNode
 - createNode
+- replaceNode
 - deleteNode
 
 
diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-persistent-volumes-claims-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-persistent-volumes-claims-component.adoc
index 742279f8193..05436922d2c 100644
--- a/components/camel-kubernetes/src/main/docs/kubernetes-persistent-volumes-claims-component.adoc
+++ b/components/camel-kubernetes/src/main/docs/kubernetes-persistent-volumes-claims-component.adoc
@@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[]
 - listPersistentVolumesClaimsByLabels
 - getPersistentVolumeClaim
 - createPersistentVolumeClaim
+- replacePersistentVolumeClaim
 - deletePersistentVolumeClaim
 
 == Kubernetes Persistent Volume Claims Producer Examples
diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-pods-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-pods-component.adoc
index b399b71ccb7..4b02b7556a1 100644
--- a/components/camel-kubernetes/src/main/docs/kubernetes-pods-component.adoc
+++ b/components/camel-kubernetes/src/main/docs/kubernetes-pods-component.adoc
@@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[]
 - listPodsByLabels
 - getPod
 - createPod
+- replacePod
 - deletePod
 
 == Kubernetes Pods Producer Examples
diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-replication-controllers-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-replication-controllers-component.adoc
index d686cd1ff59..971aba653fe 100644
--- a/components/camel-kubernetes/src/main/docs/kubernetes-replication-controllers-component.adoc
+++ b/components/camel-kubernetes/src/main/docs/kubernetes-replication-controllers-component.adoc
@@ -41,6 +41,7 @@ include::partial$component-endpoint-headers.adoc[]
 - listReplicationControllersByLabels
 - getReplicationController
 - createReplicationController
+- replaceReplicationController
 - deleteReplicationController
 - scaleReplicationController
 
diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-resources-quota-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-resources-quota-component.adoc
index 0da55299cc4..f51e999a22e 100644
--- a/components/camel-kubernetes/src/main/docs/kubernetes-resources-quota-component.adoc
+++ b/components/camel-kubernetes/src/main/docs/kubernetes-resources-quota-component.adoc
@@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[]
 - listResourcesQuotaByLabels
 - getResourcesQuota
 - createResourcesQuota
+- replaceResourceQuota
 - deleteResourcesQuota
 
 == Kubernetes Resource Quota Producer Examples
diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-secrets-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-secrets-component.adoc
index 36f4e96d9b2..d87ae2735d8 100644
--- a/components/camel-kubernetes/src/main/docs/kubernetes-secrets-component.adoc
+++ b/components/camel-kubernetes/src/main/docs/kubernetes-secrets-component.adoc
@@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[]
 - listSecretsByLabels
 - getSecret
 - createSecret
+- replaceSecret
 - deleteSecret
 
 == Kubernetes Secrets Producer Examples
diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-service-accounts-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-service-accounts-component.adoc
index 4d1175c2358..e51998f05cc 100644
--- a/components/camel-kubernetes/src/main/docs/kubernetes-service-accounts-component.adoc
+++ b/components/camel-kubernetes/src/main/docs/kubernetes-service-accounts-component.adoc
@@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[]
 - listServiceAccountsByLabels
 - getServiceAccount
 - createServiceAccount
+- replaceServiceAccount
 - deleteServiceAccount
 
 == Kubernetes ServiceAccounts Produce Examples
diff --git a/components/camel-kubernetes/src/main/docs/openshift-deploymentconfigs-component.adoc b/components/camel-kubernetes/src/main/docs/openshift-deploymentconfigs-component.adoc
index 14b404ac808..a853b9f78c1 100644
--- a/components/camel-kubernetes/src/main/docs/openshift-deploymentconfigs-component.adoc
+++ b/components/camel-kubernetes/src/main/docs/openshift-deploymentconfigs-component.adoc
@@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[]
 - listDeploymentsConfigsByLabels
 - getDeploymentConfig
 - createDeploymentConfig
+- replaceDeploymentConfig
 - deleteDeploymentConfig
 - scaleDeploymentConfig
 
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesHelper.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesHelper.java
index 6fc390b0143..10fc54863d0 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesHelper.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesHelper.java
@@ -20,8 +20,8 @@ import java.util.function.Supplier;
 
 import io.fabric8.kubernetes.client.Config;
 import io.fabric8.kubernetes.client.ConfigBuilder;
-import io.fabric8.kubernetes.client.DefaultKubernetesClient;
 import io.fabric8.kubernetes.client.KubernetesClient;
+import io.fabric8.kubernetes.client.KubernetesClientBuilder;
 import io.fabric8.kubernetes.client.Watch;
 import org.apache.camel.Exchange;
 import org.apache.camel.support.MessageHelper;
@@ -46,7 +46,7 @@ public final class KubernetesHelper {
             return createKubernetesClient(configuration);
         } else {
             LOG.info("Creating default kubernetes client without applying configuration");
-            return new DefaultKubernetesClient();
+            return new KubernetesClientBuilder().build();
         }
     }
 
@@ -76,7 +76,7 @@ public final class KubernetesHelper {
         ObjectHelper.ifNotEmpty(configuration.getNamespace(), builder::withNamespace);
 
         Config conf = builder.build();
-        return new DefaultKubernetesClient(conf);
+        return new KubernetesClientBuilder().withConfig(conf).build();
     }
 
     public static void close(Runnable runnable, Supplier<Watch> watchGetter) {
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 c9b2fbecc56..91d046c3af3 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
@@ -23,6 +23,7 @@ public final class KubernetesOperations {
     public static final String LIST_NAMESPACE_BY_LABELS_OPERATION = "listNamespacesByLabels";
     public static final String GET_NAMESPACE_OPERATION = "getNamespace";
     public static final String CREATE_NAMESPACE_OPERATION = "createNamespace";
+    public static final String REPLACE_NAMESPACE_OPERATION = "replaceNamespace";
     public static final String DELETE_NAMESPACE_OPERATION = "deleteNamespace";
 
     // Services
@@ -30,6 +31,7 @@ public final class KubernetesOperations {
     public static final String LIST_SERVICES_BY_LABELS_OPERATION = "listServicesByLabels";
     public static final String GET_SERVICE_OPERATION = "getService";
     public static final String CREATE_SERVICE_OPERATION = "createService";
+    public static final String REPLACE_SERVICE_OPERATION = "replaceService";
     public static final String DELETE_SERVICE_OPERATION = "deleteService";
 
     // Replication Controllers
@@ -37,6 +39,7 @@ public final class KubernetesOperations {
     public static final String LIST_REPLICATION_CONTROLLERS_BY_LABELS_OPERATION = "listReplicationControllersByLabels";
     public static final String GET_REPLICATION_CONTROLLER_OPERATION = "getReplicationController";
     public static final String CREATE_REPLICATION_CONTROLLER_OPERATION = "createReplicationController";
+    public static final String REPLACE_REPLICATION_CONTROLLER_OPERATION = "replaceReplicationController";
     public static final String DELETE_REPLICATION_CONTROLLER_OPERATION = "deleteReplicationController";
     public static final String SCALE_REPLICATION_CONTROLLER_OPERATION = "scaleReplicationController";
 
@@ -45,6 +48,7 @@ public final class KubernetesOperations {
     public static final String LIST_PODS_BY_LABELS_OPERATION = "listPodsByLabels";
     public static final String GET_POD_OPERATION = "getPod";
     public static final String CREATE_POD_OPERATION = "createPod";
+    public static final String REPLACE_POD_OPERATION = "replacePod";
     public static final String DELETE_POD_OPERATION = "deletePod";
 
     // Persistent Volumes
@@ -57,6 +61,7 @@ public final class KubernetesOperations {
     public static final String LIST_PERSISTENT_VOLUMES_CLAIMS_BY_LABELS_OPERATION = "listPersistentVolumesClaimsByLabels";
     public static final String GET_PERSISTENT_VOLUME_CLAIM_OPERATION = "getPersistentVolumeClaim";
     public static final String CREATE_PERSISTENT_VOLUME_CLAIM_OPERATION = "createPersistentVolumeClaim";
+    public static final String REPLACE_PERSISTENT_VOLUME_CLAIM_OPERATION = "replacePersistentVolumeClaim";
     public static final String DELETE_PERSISTENT_VOLUME_CLAIM_OPERATION = "deletePersistentVolumeClaim";
 
     // Secrets
@@ -64,6 +69,7 @@ public final class KubernetesOperations {
     public static final String LIST_SECRETS_BY_LABELS_OPERATION = "listSecretsByLabels";
     public static final String GET_SECRET_OPERATION = "getSecret";
     public static final String CREATE_SECRET_OPERATION = "createSecret";
+    public static final String REPLACE_SECRET_OPERATION = "replaceSecret";
     public static final String DELETE_SECRET_OPERATION = "deleteSecret";
 
     // Resources quota
@@ -71,6 +77,7 @@ public final class KubernetesOperations {
     public static final String LIST_RESOURCES_QUOTA_BY_LABELS_OPERATION = "listResourcesQuotaByLabels";
     public static final String GET_RESOURCE_QUOTA_OPERATION = "getResourceQuota";
     public static final String CREATE_RESOURCE_QUOTA_OPERATION = "createResourceQuota";
+    public static final String REPLACE_RESOURCE_QUOTA_OPERATION = "replaceResourceQuota";
     public static final String DELETE_RESOURCE_QUOTA_OPERATION = "deleteResourceQuota";
 
     // Service Accounts
@@ -78,6 +85,7 @@ public final class KubernetesOperations {
     public static final String LIST_SERVICE_ACCOUNTS_BY_LABELS_OPERATION = "listServiceAccountsByLabels";
     public static final String GET_SERVICE_ACCOUNT_OPERATION = "getServiceAccount";
     public static final String CREATE_SERVICE_ACCOUNT_OPERATION = "createServiceAccount";
+    public static final String REPLACE_SERVICE_ACCOUNT_OPERATION = "replaceServiceAccount";
     public static final String DELETE_SERVICE_ACCOUNT_OPERATION = "deleteServiceAccount";
 
     // Nodes
@@ -85,6 +93,7 @@ public final class KubernetesOperations {
     public static final String LIST_NODES_BY_LABELS_OPERATION = "listNodesByLabels";
     public static final String GET_NODE_OPERATION = "getNode";
     public static final String CREATE_NODE_OPERATION = "createNode";
+    public static final String REPLACE_NODE_OPERATION = "replaceNode";
     public static final String DELETE_NODE_OPERATION = "deleteNode";
 
     // HPA
@@ -92,6 +101,7 @@ public final class KubernetesOperations {
     public static final String LIST_HPA_BY_LABELS_OPERATION = "listHPAByLabels";
     public static final String GET_HPA_OPERATION = "getHPA";
     public static final String CREATE_HPA_OPERATION = "createHPA";
+    public static final String REPLACE_HPA_OPERATION = "replaceHPA";
     public static final String DELETE_HPA_OPERATION = "deleteHPA";
 
     // Deployments
@@ -100,6 +110,7 @@ public final class KubernetesOperations {
     public static final String GET_DEPLOYMENT = "getDeployment";
     public static final String DELETE_DEPLOYMENT = "deleteDeployment";
     public static final String CREATE_DEPLOYMENT = "createDeployment";
+    public static final String REPLACE_DEPLOYMENT = "replaceDeployment";
     public static final String SCALE_DEPLOYMENT = "scaleDeployment";
 
     // Config Maps
@@ -108,6 +119,7 @@ public final class KubernetesOperations {
     public static final String GET_CONFIGMAP_OPERATION = "getConfigMap";
     public static final String CREATE_CONFIGMAP_OPERATION = "createConfigMap";
     public static final String DELETE_CONFIGMAP_OPERATION = "deleteConfigMap";
+    public static final String REPLACE_CONFIGMAP_OPERATION = "replaceConfigMap";
 
     // Builds
     public static final String LIST_BUILD = "listBuilds";
@@ -124,6 +136,7 @@ public final class KubernetesOperations {
     public static final String LIST_JOB_BY_LABELS_OPERATION = "listJobByLabels";
     public static final String GET_JOB_OPERATION = "getJob";
     public static final String CREATE_JOB_OPERATION = "createJob";
+    public static final String REPLACE_JOB_OPERATION = "replaceJob";
     public static final String DELETE_JOB_OPERATION = "deleteJob";
 
     // Custom Resources
@@ -132,6 +145,7 @@ public final class KubernetesOperations {
     public static final String GET_CUSTOMRESOURCE = "getCustomResource";
     public static final String DELETE_CUSTOMRESOURCE = "deleteCustomResource";
     public static final String CREATE_CUSTOMRESOURCE = "createCustomResource";
+    public static final String REPLACE_CUSTOMRESOURCE = "replaceCustomResource";
 
     // Deployment Configs
     public static final String LIST_DEPLOYMENT_CONFIGS = "listDeploymentConfigs";
@@ -139,6 +153,7 @@ public final class KubernetesOperations {
     public static final String GET_DEPLOYMENT_CONFIG = "getDeploymentConfig";
     public static final String DELETE_DEPLOYMENT_CONFIG = "deleteDeploymentConfig";
     public static final String CREATE_DEPLOYMENT_CONFIG = "createDeploymentConfig";
+    public static final String REPLACE_DEPLOYMENT_CONFIG = "replaceDeploymentConfig";
     public static final String SCALE_DEPLOYMENT_CONFIG = "scaleDeploymentConfig";
 
     private KubernetesOperations() {
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cloud/KubernetesClientServiceDiscovery.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cloud/KubernetesClientServiceDiscovery.java
index 3406bf3f468..3d51d4ba826 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cloud/KubernetesClientServiceDiscovery.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cloud/KubernetesClientServiceDiscovery.java
@@ -24,8 +24,8 @@ import io.fabric8.kubernetes.api.model.EndpointPort;
 import io.fabric8.kubernetes.api.model.EndpointSubset;
 import io.fabric8.kubernetes.api.model.Endpoints;
 import io.fabric8.kubernetes.client.ConfigBuilder;
-import io.fabric8.kubernetes.client.DefaultKubernetesClient;
 import io.fabric8.kubernetes.client.KubernetesClient;
+import io.fabric8.kubernetes.client.KubernetesClientBuilder;
 import org.apache.camel.cloud.ServiceDefinition;
 import org.apache.camel.component.kubernetes.KubernetesConfiguration;
 import org.apache.camel.impl.cloud.DefaultServiceDefinition;
@@ -122,7 +122,7 @@ public class KubernetesClientServiceDiscovery extends KubernetesServiceDiscovery
         ObjectHelper.ifNotEmpty(configuration.getClientKeyPassphrase(), builder::withClientKeyPassphrase);
         ObjectHelper.ifNotEmpty(configuration.getTrustCerts(), builder::withTrustCerts);
 
-        client = new DefaultKubernetesClient(builder.build());
+        client = new KubernetesClientBuilder().withConfig(builder.build()).build();
     }
 
     private boolean hasUsernameAndPassword(KubernetesConfiguration configuration) {
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cluster/lock/impl/ConfigMapLeaseResourceManager.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cluster/lock/impl/ConfigMapLeaseResourceManager.java
index cf8062727ba..0c8b8f5da1e 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cluster/lock/impl/ConfigMapLeaseResourceManager.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cluster/lock/impl/ConfigMapLeaseResourceManager.java
@@ -55,8 +55,8 @@ public class ConfigMapLeaseResourceManager implements KubernetesLeaseResourceMan
         ConfigMap updatedConfigMap = getConfigMapWithoutLeader(leaseResource, group);
         return client.configMaps()
                 .inNamespace(leaseResource.getMetadata().getNamespace())
-                .withName(leaseResource.getMetadata().getName())
-                .lockResourceVersion(leaseResource.getMetadata().getResourceVersion()).replace(updatedConfigMap);
+                .resource(updatedConfigMap)
+                .lockResourceVersion(leaseResource.getMetadata().getResourceVersion()).replace();
     }
 
     @Override
@@ -64,8 +64,8 @@ public class ConfigMapLeaseResourceManager implements KubernetesLeaseResourceMan
         ConfigMap updatedConfigMap = getConfigMapWithNewLeader(leaseResource, newLeaderInfo);
         return client.configMaps()
                 .inNamespace(leaseResource.getMetadata().getNamespace())
-                .withName(leaseResource.getMetadata().getName())
-                .lockResourceVersion(leaseResource.getMetadata().getResourceVersion()).replace(updatedConfigMap);
+                .resource(updatedConfigMap)
+                .lockResourceVersion(leaseResource.getMetadata().getResourceVersion()).replace();
     }
 
     @Override
@@ -81,7 +81,8 @@ public class ConfigMapLeaseResourceManager implements KubernetesLeaseResourceMan
 
         return client.configMaps()
                 .inNamespace(namespace)
-                .create(newConfigMap);
+                .resource(newConfigMap)
+                .create();
     }
 
     @Override
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cluster/lock/impl/NativeLeaseResourceManager.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cluster/lock/impl/NativeLeaseResourceManager.java
index 9a9976ea7b9..8d46d742a2d 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cluster/lock/impl/NativeLeaseResourceManager.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cluster/lock/impl/NativeLeaseResourceManager.java
@@ -45,8 +45,8 @@ public class NativeLeaseResourceManager implements KubernetesLeaseResourceManage
         Lease updatedLease = getLeaseWithoutLeader(leaseResource);
         return client.leases()
                 .inNamespace(leaseResource.getMetadata().getNamespace())
-                .withName(leaseResource.getMetadata().getName())
-                .lockResourceVersion(leaseResource.getMetadata().getResourceVersion()).replace(updatedLease);
+                .resource(updatedLease)
+                .lockResourceVersion(leaseResource.getMetadata().getResourceVersion()).replace();
     }
 
     @Override
@@ -54,8 +54,8 @@ public class NativeLeaseResourceManager implements KubernetesLeaseResourceManage
         Lease updatedLease = getLeaseWithNewLeader(leaseResource, newLeaderInfo);
         return client.leases()
                 .inNamespace(leaseResource.getMetadata().getNamespace())
-                .withName(leaseResource.getMetadata().getName())
-                .lockResourceVersion(leaseResource.getMetadata().getResourceVersion()).replace(updatedLease);
+                .resource(updatedLease)
+                .lockResourceVersion(leaseResource.getMetadata().getResourceVersion()).replace();
     }
 
     @Override
@@ -69,8 +69,8 @@ public class NativeLeaseResourceManager implements KubernetesLeaseResourceManage
                     .build();
             return client.leases()
                     .inNamespace(leaseResource.getMetadata().getNamespace())
-                    .withName(leaseResource.getMetadata().getName())
-                    .lockResourceVersion(leaseResource.getMetadata().getResourceVersion()).replace(updatedLease);
+                    .resource(updatedLease)
+                    .lockResourceVersion(leaseResource.getMetadata().getResourceVersion()).replace();
         }
         return leaseResource;
     }
@@ -92,7 +92,8 @@ public class NativeLeaseResourceManager implements KubernetesLeaseResourceManage
 
         return client.leases()
                 .inNamespace(namespace)
-                .create(newLease);
+                .resource(newLease)
+                .create();
     }
 
     private static Lease getLeaseWithNewLeader(Lease lease, LeaderInfo leaderInfo) {
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsProducer.java
index fef5dcf0b69..263fe6a1d4d 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsProducer.java
@@ -19,11 +19,13 @@ package org.apache.camel.component.kubernetes.config_maps;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import io.fabric8.kubernetes.api.model.ConfigMap;
 import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
 import io.fabric8.kubernetes.api.model.ConfigMapList;
 import io.fabric8.kubernetes.api.model.StatusDetails;
+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;
@@ -71,6 +73,10 @@ public class KubernetesConfigMapsProducer extends DefaultProducer {
                 doCreateConfigMap(exchange);
                 break;
 
+            case KubernetesOperations.REPLACE_CONFIGMAP_OPERATION:
+                doReplaceConfigMap(exchange);
+                break;
+
             case KubernetesOperations.DELETE_CONFIGMAP_OPERATION:
                 doDeleteConfigMap(exchange);
                 break;
@@ -98,13 +104,13 @@ public class KubernetesConfigMapsProducer extends DefaultProducer {
     }
 
     protected void doGetConfigMap(Exchange exchange) {
-        ConfigMap configMap = null;
         String cfMapName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         if (ObjectHelper.isEmpty(cfMapName)) {
             LOG.error("Get a specific ConfigMap require specify a ConfigMap name");
             throw new IllegalArgumentException("Get a specific ConfigMap require specify a ConfigMap name");
         }
+        ConfigMap configMap;
         if (namespaceName != null) {
             configMap = getEndpoint().getKubernetesClient().configMaps().inNamespace(namespaceName).withName(cfMapName).get();
         } else {
@@ -114,28 +120,41 @@ public class KubernetesConfigMapsProducer extends DefaultProducer {
         prepareOutboundMessage(exchange, configMap);
     }
 
+    protected void doReplaceConfigMap(Exchange exchange) {
+        doCreateOrUpdateConfigMap(exchange, "Replace", Resource::replace);
+    }
+
     protected void doCreateConfigMap(Exchange exchange) {
-        ConfigMap configMap = null;
+        doCreateOrUpdateConfigMap(exchange, "Create", Resource::create);
+    }
+
+    private void doCreateOrUpdateConfigMap(
+            Exchange exchange, String operationName, Function<Resource<ConfigMap>, ConfigMap> operation) {
         String cfMapName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         HashMap<String, String> configMapData
                 = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_DATA, HashMap.class);
         if (ObjectHelper.isEmpty(cfMapName)) {
-            LOG.error("Create a specific configMap require specify a configMap name");
-            throw new IllegalArgumentException("Create a specific configMap require specify a configMap name");
+            LOG.error("{} a specific configMap require specify a configMap name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific configMap require specify a configMap name", operationName));
         }
         if (ObjectHelper.isEmpty(namespaceName)) {
-            LOG.error("Create a specific configMap require specify a namespace name");
-            throw new IllegalArgumentException("Create a specific configMap require specify a namespace name");
+            LOG.error("{} a specific configMap require specify a namespace name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific configMap require specify a namespace name", operationName));
         }
         if (ObjectHelper.isEmpty(configMapData)) {
-            LOG.error("Create a specific configMap require specify a data map");
-            throw new IllegalArgumentException("Create a specific configMap require specify a data map");
+            LOG.error("{} a specific configMap require specify a data map", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific configMap require specify a data map", operationName));
         }
         Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CONFIGMAPS_LABELS, Map.class);
         ConfigMap cfMapCreating = new ConfigMapBuilder().withNewMetadata().withName(cfMapName).withLabels(labels).endMetadata()
                 .withData(configMapData).build();
-        configMap = getEndpoint().getKubernetesClient().configMaps().inNamespace(namespaceName).create(cfMapCreating);
+        ConfigMap configMap
+                = operation.apply(
+                        getEndpoint().getKubernetesClient().configMaps().inNamespace(namespaceName).resource(cfMapCreating));
 
         prepareOutboundMessage(exchange, configMap);
     }
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/customresources/KubernetesCustomResourcesProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/customresources/KubernetesCustomResourcesProducer.java
index d8ffad1da96..cf0d35dbfe0 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/customresources/KubernetesCustomResourcesProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/customresources/KubernetesCustomResourcesProducer.java
@@ -16,14 +16,15 @@
  */
 package org.apache.camel.component.kubernetes.customresources;
 
-import java.io.IOException;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import io.fabric8.kubernetes.api.model.GenericKubernetesResource;
 import io.fabric8.kubernetes.api.model.GenericKubernetesResourceList;
 import io.fabric8.kubernetes.api.model.StatusDetails;
 import io.fabric8.kubernetes.client.KubernetesClientException;
+import io.fabric8.kubernetes.client.dsl.Resource;
 import io.fabric8.kubernetes.client.dsl.base.CustomResourceDefinitionContext;
 import io.fabric8.kubernetes.client.utils.Serialization;
 import org.apache.camel.Exchange;
@@ -90,6 +91,10 @@ public class KubernetesCustomResourcesProducer extends DefaultProducer {
                 doCreate(exchange, namespace);
                 break;
 
+            case KubernetesOperations.REPLACE_CUSTOMRESOURCE:
+                doReplace(exchange, namespace);
+                break;
+
             default:
                 throw new IllegalArgumentException("Unsupported operation " + operation);
         }
@@ -182,14 +187,24 @@ public class KubernetesCustomResourcesProducer extends DefaultProducer {
 
     }
 
-    protected void doCreate(Exchange exchange, String namespaceName) throws IOException {
+    protected void doReplace(Exchange exchange, String namespaceName) {
+        doCreateOrReplace(exchange, namespaceName, Resource::replace);
+    }
+
+    protected void doCreate(Exchange exchange, String namespaceName) {
+        doCreateOrReplace(exchange, namespaceName, Resource::create);
+    }
+
+    private void doCreateOrReplace(
+            Exchange exchange, String namespaceName,
+            Function<Resource<GenericKubernetesResource>, GenericKubernetesResource> operation) {
         String customResourceInstance = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CRD_INSTANCE, String.class);
         GenericKubernetesResource customResource = new GenericKubernetesResource();
         try {
-            customResource = getEndpoint().getKubernetesClient()
+            customResource = operation.apply(getEndpoint().getKubernetesClient()
                     .genericKubernetesResources(getCRDContext(exchange.getIn()))
                     .inNamespace(namespaceName)
-                    .create(Serialization.unmarshal(customResourceInstance, GenericKubernetesResource.class));
+                    .resource(Serialization.unmarshal(customResourceInstance, GenericKubernetesResource.class)));
         } catch (KubernetesClientException e) {
             if (e.getCode() == 409) {
                 LOG.info("Custom resource instance already exists", e);
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/deployments/KubernetesDeploymentsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/deployments/KubernetesDeploymentsProducer.java
index 43be88eb6ab..f42792c91d5 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/deployments/KubernetesDeploymentsProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/deployments/KubernetesDeploymentsProducer.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.kubernetes.deployments;
 
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import io.fabric8.kubernetes.api.model.StatusDetails;
 import io.fabric8.kubernetes.api.model.apps.Deployment;
@@ -25,6 +26,7 @@ import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;
 import io.fabric8.kubernetes.api.model.apps.DeploymentList;
 import io.fabric8.kubernetes.api.model.apps.DeploymentSpec;
 import io.fabric8.kubernetes.client.dsl.MixedOperation;
+import io.fabric8.kubernetes.client.dsl.Resource;
 import io.fabric8.kubernetes.client.dsl.RollableScalableResource;
 import org.apache.camel.Exchange;
 import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint;
@@ -77,6 +79,10 @@ public class KubernetesDeploymentsProducer extends DefaultProducer {
                 doCreateDeployment(exchange);
                 break;
 
+            case KubernetesOperations.REPLACE_DEPLOYMENT:
+                doReplaceDeployment(exchange);
+                break;
+
             case KubernetesOperations.SCALE_DEPLOYMENT:
                 doScaleDeployment(exchange);
                 break;
@@ -104,13 +110,12 @@ public class KubernetesDeploymentsProducer extends DefaultProducer {
     }
 
     protected void doGetDeployment(Exchange exchange) {
-        Deployment deployment = null;
         String deploymentName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_NAME, String.class);
         if (ObjectHelper.isEmpty(deploymentName)) {
             LOG.error("Get a specific Deployment require specify a Deployment name");
             throw new IllegalArgumentException("Get a specific Deployment require specify a Deployment name");
         }
-        deployment = getEndpoint().getKubernetesClient().apps().deployments().withName(deploymentName).get();
+        Deployment deployment = getEndpoint().getKubernetesClient().apps().deployments().withName(deploymentName).get();
 
         prepareOutboundMessage(exchange, deployment);
     }
@@ -134,29 +139,41 @@ public class KubernetesDeploymentsProducer extends DefaultProducer {
         prepareOutboundMessage(exchange, deploymentDeleted);
     }
 
+    protected void doReplaceDeployment(Exchange exchange) {
+        doCreateOrUpdateDeployment(exchange, "Replace", Resource::replace);
+    }
+
     protected void doCreateDeployment(Exchange exchange) {
-        Deployment deployment = null;
+        doCreateOrUpdateDeployment(exchange, "Create", Resource::create);
+    }
+
+    private void doCreateOrUpdateDeployment(
+            Exchange exchange, String operationName, Function<Resource<Deployment>, Deployment> operation) {
         String deploymentName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         DeploymentSpec deSpec
                 = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_SPEC, DeploymentSpec.class);
         if (ObjectHelper.isEmpty(deploymentName)) {
-            LOG.error("Create a specific Deployment require specify a Deployment name");
-            throw new IllegalArgumentException("Create a specific Deployment require specify a pod name");
+            LOG.error("{} a specific Deployment require specify a Deployment name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific Deployment require specify a pod name", operationName));
         }
         if (ObjectHelper.isEmpty(namespaceName)) {
-            LOG.error("Create a specific Deployment require specify a namespace name");
-            throw new IllegalArgumentException("Create a specific Deployment require specify a namespace name");
+            LOG.error("{} a specific Deployment require specify a namespace name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific Deployment require specify a namespace name", operationName));
         }
         if (ObjectHelper.isEmpty(deSpec)) {
-            LOG.error("Create a specific Deployment require specify a Deployment spec bean");
-            throw new IllegalArgumentException("Create a specific Deployment require specify a Deployment spec bean");
+            LOG.error("{} a specific Deployment require specify a Deployment spec bean", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific Deployment require specify a Deployment spec bean", operationName));
         }
         Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_DEPLOYMENTS_LABELS, Map.class);
         Deployment deploymentCreating = new DeploymentBuilder().withNewMetadata().withName(deploymentName).withLabels(labels)
                 .endMetadata().withSpec(deSpec).build();
-        deployment = getEndpoint().getKubernetesClient().apps().deployments().inNamespace(namespaceName)
-                .create(deploymentCreating);
+        Deployment deployment
+                = operation.apply(getEndpoint().getKubernetesClient().apps().deployments().inNamespace(namespaceName)
+                        .resource(deploymentCreating));
 
         prepareOutboundMessage(exchange, deployment);
     }
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/hpa/KubernetesHPAProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/hpa/KubernetesHPAProducer.java
index 03a91a16004..3b7dfbe69ff 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/hpa/KubernetesHPAProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/hpa/KubernetesHPAProducer.java
@@ -18,12 +18,14 @@ package org.apache.camel.component.kubernetes.hpa;
 
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import io.fabric8.kubernetes.api.model.StatusDetails;
 import io.fabric8.kubernetes.api.model.autoscaling.v1.HorizontalPodAutoscaler;
 import io.fabric8.kubernetes.api.model.autoscaling.v1.HorizontalPodAutoscalerBuilder;
 import io.fabric8.kubernetes.api.model.autoscaling.v1.HorizontalPodAutoscalerList;
 import io.fabric8.kubernetes.api.model.autoscaling.v1.HorizontalPodAutoscalerSpec;
+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;
@@ -71,6 +73,10 @@ public class KubernetesHPAProducer extends DefaultProducer {
                 doCreateHPA(exchange);
                 break;
 
+            case KubernetesOperations.REPLACE_HPA_OPERATION:
+                doReplaceHPA(exchange);
+                break;
+
             case KubernetesOperations.DELETE_HPA_OPERATION:
                 doDeleteHPA(exchange);
                 break;
@@ -106,7 +112,6 @@ public class KubernetesHPAProducer extends DefaultProducer {
     }
 
     protected void doGetHPA(Exchange exchange) {
-        HorizontalPodAutoscaler hpa = null;
         String podName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_HPA_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         if (ObjectHelper.isEmpty(podName)) {
@@ -117,35 +122,47 @@ public class KubernetesHPAProducer extends DefaultProducer {
             LOG.error("Get a specific hpa require specify a namespace name");
             throw new IllegalArgumentException("Get a specific hpa require specify a namespace name");
         }
-        hpa = getEndpoint().getKubernetesClient().autoscaling().v1().horizontalPodAutoscalers().inNamespace(namespaceName)
-                .withName(podName).get();
+        HorizontalPodAutoscaler hpa
+                = getEndpoint().getKubernetesClient().autoscaling().v1().horizontalPodAutoscalers().inNamespace(namespaceName)
+                        .withName(podName).get();
 
         prepareOutboundMessage(exchange, hpa);
     }
 
+    protected void doReplaceHPA(Exchange exchange) {
+        doCreateOrUpdateHPA(exchange, "Replace", Resource::replace);
+    }
+
     protected void doCreateHPA(Exchange exchange) {
-        HorizontalPodAutoscaler hpa = null;
+        doCreateOrUpdateHPA(exchange, "Create", Resource::create);
+    }
+
+    private void doCreateOrUpdateHPA(
+            Exchange exchange, String operationName,
+            Function<Resource<HorizontalPodAutoscaler>, HorizontalPodAutoscaler> operation) {
         String hpaName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_HPA_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         HorizontalPodAutoscalerSpec hpaSpec
                 = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_HPA_SPEC, HorizontalPodAutoscalerSpec.class);
         if (ObjectHelper.isEmpty(hpaName)) {
-            LOG.error("Create a specific hpa require specify a hpa name");
-            throw new IllegalArgumentException("Create a specific hpa require specify a hpa name");
+            LOG.error("{} a specific hpa require specify a hpa name", operationName);
+            throw new IllegalArgumentException(operationName + " a specific hpa require specify a hpa name");
         }
         if (ObjectHelper.isEmpty(namespaceName)) {
-            LOG.error("Create a specific hpa require specify a namespace name");
-            throw new IllegalArgumentException("Create a specific hpa require specify a namespace name");
+            LOG.error("{} a specific hpa require specify a namespace name", operationName);
+            throw new IllegalArgumentException(operationName + " a specific hpa require specify a namespace name");
         }
         if (ObjectHelper.isEmpty(hpaSpec)) {
-            LOG.error("Create a specific hpa require specify a hpa spec bean");
-            throw new IllegalArgumentException("Create a specific hpa require specify a hpa spec bean");
+            LOG.error("{} a specific hpa require specify a hpa spec bean", operationName);
+            throw new IllegalArgumentException(operationName + " a specific hpa require specify a hpa spec bean");
         }
         Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_HPA_LABELS, Map.class);
         HorizontalPodAutoscaler hpaCreating = new HorizontalPodAutoscalerBuilder().withNewMetadata().withName(hpaName)
                 .withLabels(labels).endMetadata().withSpec(hpaSpec).build();
-        hpa = getEndpoint().getKubernetesClient().autoscaling().v1().horizontalPodAutoscalers().inNamespace(namespaceName)
-                .create(hpaCreating);
+        HorizontalPodAutoscaler hpa
+                = operation.apply(getEndpoint().getKubernetesClient().autoscaling().v1().horizontalPodAutoscalers()
+                        .inNamespace(namespaceName)
+                        .resource(hpaCreating));
 
         prepareOutboundMessage(exchange, hpa);
     }
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/job/KubernetesJobProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/job/KubernetesJobProducer.java
index ba3cc282365..611e3dc2567 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/job/KubernetesJobProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/job/KubernetesJobProducer.java
@@ -17,12 +17,14 @@
 package org.apache.camel.component.kubernetes.job;
 
 import java.util.Map;
+import java.util.function.Function;
 
 import io.fabric8.kubernetes.api.model.batch.v1.Job;
 import io.fabric8.kubernetes.api.model.batch.v1.JobBuilder;
 import io.fabric8.kubernetes.api.model.batch.v1.JobList;
 import io.fabric8.kubernetes.api.model.batch.v1.JobSpec;
 import io.fabric8.kubernetes.client.dsl.MixedOperation;
+import io.fabric8.kubernetes.client.dsl.Resource;
 import io.fabric8.kubernetes.client.dsl.ScalableResource;
 import org.apache.camel.Exchange;
 import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint;
@@ -77,6 +79,10 @@ public class KubernetesJobProducer extends DefaultProducer {
                 doCreateJob(exchange);
                 break;
 
+            case KubernetesOperations.REPLACE_JOB_OPERATION:
+                doReplaceJob(exchange);
+                break;
+
             case KubernetesOperations.DELETE_JOB_OPERATION:
                 doDeleteJob(exchange);
                 break;
@@ -107,7 +113,6 @@ public class KubernetesJobProducer extends DefaultProducer {
     }
 
     protected void doGetJob(Exchange exchange) {
-        Job job = null;
         String jobName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_JOB_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         if (ObjectHelper.isEmpty(jobName)) {
@@ -118,32 +123,42 @@ public class KubernetesJobProducer extends DefaultProducer {
             LOG.error("Get a specific job require specify a namespace name");
             throw new IllegalArgumentException("Get a specific job require specify a namespace name");
         }
-        job = getEndpoint().getKubernetesClient().batch().v1().jobs().inNamespace(namespaceName).withName(jobName).get();
+        Job job = getEndpoint().getKubernetesClient().batch().v1().jobs().inNamespace(namespaceName).withName(jobName).get();
 
         prepareOutboundMessage(exchange, job);
     }
 
+    protected void doReplaceJob(Exchange exchange) {
+        doCreateOrUpdateJob(exchange, "Replace", Resource::replace);
+    }
+
     protected void doCreateJob(Exchange exchange) {
-        Job job = null;
+        doCreateOrUpdateJob(exchange, "Create", Resource::create);
+    }
+
+    private void doCreateOrUpdateJob(Exchange exchange, String operationName, Function<Resource<Job>, Job> operation) {
         String jobName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_JOB_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         JobSpec jobSpec = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_JOB_SPEC, JobSpec.class);
         if (ObjectHelper.isEmpty(jobName)) {
-            LOG.error("Create a specific job require specify a job name");
-            throw new IllegalArgumentException("Create a specific job require specify a job name");
+            LOG.error("{} a specific job require specify a job name", operationName);
+            throw new IllegalArgumentException(String.format("%s a specific job require specify a job name", operationName));
         }
         if (ObjectHelper.isEmpty(namespaceName)) {
-            LOG.error("Create a specific job require specify a namespace name");
-            throw new IllegalArgumentException("Create a specific job require specify a namespace name");
+            LOG.error("{} a specific job require specify a namespace name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific job require specify a namespace name", operationName));
         }
         if (ObjectHelper.isEmpty(jobSpec)) {
-            LOG.error("Create a specific job require specify a hpa spec bean");
-            throw new IllegalArgumentException("Create a specific job require specify a hpa spec bean");
+            LOG.error("{} a specific job require specify a hpa spec bean", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific job require specify a hpa spec bean", operationName));
         }
         Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_JOB_LABELS, Map.class);
         Job jobCreating = new JobBuilder().withNewMetadata().withName(jobName).withLabels(labels).endMetadata()
                 .withSpec(jobSpec).build();
-        job = getEndpoint().getKubernetesClient().batch().v1().jobs().inNamespace(namespaceName).create(jobCreating);
+        Job job = operation.apply(
+                getEndpoint().getKubernetesClient().batch().v1().jobs().inNamespace(namespaceName).resource(jobCreating));
 
         prepareOutboundMessage(exchange, job);
     }
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/namespaces/KubernetesNamespacesProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/namespaces/KubernetesNamespacesProducer.java
index 9f20bf928ce..71c8ee2c270 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/namespaces/KubernetesNamespacesProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/namespaces/KubernetesNamespacesProducer.java
@@ -18,11 +18,13 @@ package org.apache.camel.component.kubernetes.namespaces;
 
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import io.fabric8.kubernetes.api.model.Namespace;
 import io.fabric8.kubernetes.api.model.NamespaceBuilder;
 import io.fabric8.kubernetes.api.model.NamespaceList;
 import io.fabric8.kubernetes.api.model.StatusDetails;
+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;
@@ -70,6 +72,10 @@ public class KubernetesNamespacesProducer extends DefaultProducer {
                 doCreateNamespace(exchange);
                 break;
 
+            case KubernetesOperations.REPLACE_NAMESPACE_OPERATION:
+                doReplaceNamespace(exchange);
+                break;
+
             case KubernetesOperations.DELETE_NAMESPACE_OPERATION:
                 doDeleteNamespace(exchange);
                 break;
@@ -108,16 +114,26 @@ public class KubernetesNamespacesProducer extends DefaultProducer {
         prepareOutboundMessage(exchange, namespace);
     }
 
+    protected void doReplaceNamespace(Exchange exchange) {
+        doCreateOrUpdateNamespace(exchange, "Replace", Resource::replace);
+    }
+
     protected void doCreateNamespace(Exchange exchange) {
+        doCreateOrUpdateNamespace(exchange, "Create", Resource::create);
+    }
+
+    private void doCreateOrUpdateNamespace(
+            Exchange exchange, String operationName, Function<Resource<Namespace>, Namespace> operation) {
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         if (ObjectHelper.isEmpty(namespaceName)) {
-            LOG.error("Create a specific namespace require specify a namespace name");
-            throw new IllegalArgumentException("Create a specific namespace require specify a namespace name");
+            LOG.error("{} a specific namespace require specify a namespace name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific namespace require specify a namespace name", operationName));
         }
         Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_LABELS, Map.class);
         Namespace ns
                 = new NamespaceBuilder().withNewMetadata().withName(namespaceName).withLabels(labels).endMetadata().build();
-        Namespace namespace = getEndpoint().getKubernetesClient().namespaces().create(ns);
+        Namespace namespace = operation.apply(getEndpoint().getKubernetesClient().namespaces().resource(ns));
 
         prepareOutboundMessage(exchange, namespace);
     }
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/nodes/KubernetesNodesProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/nodes/KubernetesNodesProducer.java
index 7bc1a8cdf4b..edf44ad6309 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/nodes/KubernetesNodesProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/nodes/KubernetesNodesProducer.java
@@ -18,12 +18,14 @@ package org.apache.camel.component.kubernetes.nodes;
 
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import io.fabric8.kubernetes.api.model.Node;
 import io.fabric8.kubernetes.api.model.NodeBuilder;
 import io.fabric8.kubernetes.api.model.NodeList;
 import io.fabric8.kubernetes.api.model.NodeSpec;
 import io.fabric8.kubernetes.api.model.StatusDetails;
+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;
@@ -71,6 +73,10 @@ public class KubernetesNodesProducer extends DefaultProducer {
                 doCreateNode(exchange);
                 break;
 
+            case KubernetesOperations.REPLACE_NODE_OPERATION:
+                doReplaceNode(exchange);
+                break;
+
             case KubernetesOperations.DELETE_NODE_OPERATION:
                 doDeleteNode(exchange);
                 break;
@@ -97,33 +103,40 @@ public class KubernetesNodesProducer extends DefaultProducer {
     }
 
     protected void doGetNode(Exchange exchange) {
-        Node node = null;
         String pvName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NODE_NAME, String.class);
         if (ObjectHelper.isEmpty(pvName)) {
             LOG.error("Get a specific Node require specify a Node name");
             throw new IllegalArgumentException("Get a specific Node require specify a Node name");
         }
-        node = getEndpoint().getKubernetesClient().nodes().withName(pvName).get();
+        Node node = getEndpoint().getKubernetesClient().nodes().withName(pvName).get();
 
         prepareOutboundMessage(exchange, node);
     }
 
+    protected void doReplaceNode(Exchange exchange) {
+        doCreateOrUpdateNode(exchange, "Replace", Resource::replace);
+    }
+
     protected void doCreateNode(Exchange exchange) {
-        Node node = null;
+        doCreateOrUpdateNode(exchange, "Create", Resource::create);
+    }
+
+    private void doCreateOrUpdateNode(Exchange exchange, String operationName, Function<Resource<Node>, Node> operation) {
         String nodeName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NODE_NAME, String.class);
         NodeSpec nodeSpec = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NODE_SPEC, NodeSpec.class);
         if (ObjectHelper.isEmpty(nodeName)) {
-            LOG.error("Create a specific node require specify a node name");
-            throw new IllegalArgumentException("Create a specific node require specify a node name");
+            LOG.error("{} a specific node require specify a node name", operationName);
+            throw new IllegalArgumentException(String.format("%s a specific node require specify a node name", operationName));
         }
         if (ObjectHelper.isEmpty(nodeSpec)) {
-            LOG.error("Create a specific node require specify a node spec bean");
-            throw new IllegalArgumentException("Create a specific node require specify a node spec bean");
+            LOG.error("{} a specific node require specify a node spec bean", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific node require specify a node spec bean", operationName));
         }
         Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_PODS_LABELS, Map.class);
         Node nodeCreating = new NodeBuilder().withNewMetadata().withName(nodeName).withLabels(labels).endMetadata()
                 .withSpec(nodeSpec).build();
-        node = getEndpoint().getKubernetesClient().nodes().create(nodeCreating);
+        Node node = operation.apply(getEndpoint().getKubernetesClient().nodes().resource(nodeCreating));
 
         prepareOutboundMessage(exchange, node);
     }
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/persistent_volumes/KubernetesPersistentVolumesProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/persistent_volumes/KubernetesPersistentVolumesProducer.java
index b5b0ccd657e..bea1242e268 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/persistent_volumes/KubernetesPersistentVolumesProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/persistent_volumes/KubernetesPersistentVolumesProducer.java
@@ -83,13 +83,12 @@ public class KubernetesPersistentVolumesProducer extends DefaultProducer {
     }
 
     protected void doGetPersistentVolume(Exchange exchange) {
-        PersistentVolume pv = null;
         String pvName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUME_NAME, String.class);
         if (ObjectHelper.isEmpty(pvName)) {
             LOG.error("Get a specific Persistent Volume require specify a Persistent Volume name");
             throw new IllegalArgumentException("Get a specific Persistent Volume require specify a Persistent Volume name");
         }
-        pv = getEndpoint().getKubernetesClient().persistentVolumes().withName(pvName).get();
+        PersistentVolume pv = getEndpoint().getKubernetesClient().persistentVolumes().withName(pvName).get();
 
         prepareOutboundMessage(exchange, pv);
     }
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/persistent_volumes_claims/KubernetesPersistentVolumesClaimsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/persistent_volumes_claims/KubernetesPersistentVolumesClaimsProducer.java
index 76b11115d82..52ee4f6ecd8 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/persistent_volumes_claims/KubernetesPersistentVolumesClaimsProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/persistent_volumes_claims/KubernetesPersistentVolumesClaimsProducer.java
@@ -18,12 +18,14 @@ package org.apache.camel.component.kubernetes.persistent_volumes_claims;
 
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import io.fabric8.kubernetes.api.model.PersistentVolumeClaim;
 import io.fabric8.kubernetes.api.model.PersistentVolumeClaimBuilder;
 import io.fabric8.kubernetes.api.model.PersistentVolumeClaimList;
 import io.fabric8.kubernetes.api.model.PersistentVolumeClaimSpec;
 import io.fabric8.kubernetes.api.model.StatusDetails;
+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;
@@ -71,6 +73,10 @@ public class KubernetesPersistentVolumesClaimsProducer extends DefaultProducer {
                 doCreatePersistentVolumeClaim(exchange);
                 break;
 
+            case KubernetesOperations.REPLACE_PERSISTENT_VOLUME_CLAIM_OPERATION:
+                doReplacePersistentVolumeClaim(exchange);
+                break;
+
             case KubernetesOperations.DELETE_PERSISTENT_VOLUME_CLAIM_OPERATION:
                 doDeletePersistentVolumeClaim(exchange);
                 break;
@@ -87,10 +93,10 @@ public class KubernetesPersistentVolumesClaimsProducer extends DefaultProducer {
     }
 
     protected void doListPersistentVolumesClaimsByLabels(Exchange exchange) {
-        PersistentVolumeClaimList pvcList = null;
         Map<String, String> labels
                 = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUMES_CLAIMS_LABELS, Map.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        PersistentVolumeClaimList pvcList;
         if (!ObjectHelper.isEmpty(namespaceName)) {
             pvcList = getEndpoint()
                     .getKubernetesClient()
@@ -111,7 +117,6 @@ public class KubernetesPersistentVolumesClaimsProducer extends DefaultProducer {
     }
 
     protected void doGetPersistentVolumeClaim(Exchange exchange) {
-        PersistentVolumeClaim pvc = null;
         String pvcName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUME_CLAIM_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         if (ObjectHelper.isEmpty(pvcName)) {
@@ -123,36 +128,52 @@ public class KubernetesPersistentVolumesClaimsProducer extends DefaultProducer {
             LOG.error("Get a specific Persistent Volume Claim require specify a namespace name");
             throw new IllegalArgumentException("Get a specific Persistent Volume Claim require specify a namespace name");
         }
-        pvc = getEndpoint().getKubernetesClient().persistentVolumeClaims().inNamespace(namespaceName).withName(pvcName).get();
+        PersistentVolumeClaim pvc = getEndpoint().getKubernetesClient().persistentVolumeClaims().inNamespace(namespaceName)
+                .withName(pvcName).get();
 
         prepareOutboundMessage(exchange, pvc);
     }
 
+    protected void doReplacePersistentVolumeClaim(Exchange exchange) {
+        doCreateOrUpdatePersistentVolumeClaim(exchange, "Replace", Resource::replace);
+    }
+
     protected void doCreatePersistentVolumeClaim(Exchange exchange) {
-        PersistentVolumeClaim pvc = null;
+        doCreateOrUpdatePersistentVolumeClaim(exchange, "Create", Resource::create);
+    }
+
+    private void doCreateOrUpdatePersistentVolumeClaim(
+            Exchange exchange, String operationName,
+            Function<Resource<PersistentVolumeClaim>, PersistentVolumeClaim> operation) {
         String pvcName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUME_CLAIM_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         PersistentVolumeClaimSpec pvcSpec = exchange.getIn()
                 .getHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUME_CLAIM_SPEC, PersistentVolumeClaimSpec.class);
         if (ObjectHelper.isEmpty(pvcName)) {
-            LOG.error("Create a specific Persistent Volume Claim require specify a Persistent Volume Claim name");
+            LOG.error("{} a specific Persistent Volume Claim require specify a Persistent Volume Claim name", operationName);
             throw new IllegalArgumentException(
-                    "Create a specific Persistent Volume Claim require specify a Persistent Volume Claim name");
+                    String.format("%s a specific Persistent Volume Claim require specify a Persistent Volume Claim name",
+                            operationName));
         }
         if (ObjectHelper.isEmpty(namespaceName)) {
-            LOG.error("Create a specific Persistent Volume Claim require specify a namespace name");
-            throw new IllegalArgumentException("Create a specific Persistent Volume Claim require specify a namespace name");
+            LOG.error("{} a specific Persistent Volume Claim require specify a namespace name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific Persistent Volume Claim require specify a namespace name", operationName));
         }
         if (ObjectHelper.isEmpty(pvcSpec)) {
-            LOG.error("Create a specific Persistent Volume Claim require specify a Persistent Volume Claim spec bean");
+            LOG.error("{} a specific Persistent Volume Claim require specify a Persistent Volume Claim spec bean",
+                    operationName);
             throw new IllegalArgumentException(
-                    "Create a specific Persistent Volume Claim require specify a Persistent Volume Claim spec bean");
+                    String.format("%s a specific Persistent Volume Claim require specify a Persistent Volume Claim spec bean",
+                            operationName));
         }
         Map<String, String> labels
                 = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUMES_CLAIMS_LABELS, Map.class);
         PersistentVolumeClaim pvcCreating = new PersistentVolumeClaimBuilder().withNewMetadata().withName(pvcName)
                 .withLabels(labels).endMetadata().withSpec(pvcSpec).build();
-        pvc = getEndpoint().getKubernetesClient().persistentVolumeClaims().inNamespace(namespaceName).create(pvcCreating);
+        PersistentVolumeClaim pvc
+                = operation.apply(getEndpoint().getKubernetesClient().persistentVolumeClaims().inNamespace(namespaceName)
+                        .resource(pvcCreating));
 
         prepareOutboundMessage(exchange, pvc);
     }
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/pods/KubernetesPodsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/pods/KubernetesPodsProducer.java
index f71eef26546..f8cc95ae2a7 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/pods/KubernetesPodsProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/pods/KubernetesPodsProducer.java
@@ -18,12 +18,14 @@ package org.apache.camel.component.kubernetes.pods;
 
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import io.fabric8.kubernetes.api.model.Pod;
 import io.fabric8.kubernetes.api.model.PodBuilder;
 import io.fabric8.kubernetes.api.model.PodList;
 import io.fabric8.kubernetes.api.model.PodSpec;
 import io.fabric8.kubernetes.api.model.StatusDetails;
+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;
@@ -71,6 +73,10 @@ public class KubernetesPodsProducer extends DefaultProducer {
                 doCreatePod(exchange);
                 break;
 
+            case KubernetesOperations.REPLACE_POD_OPERATION:
+                doReplacePod(exchange);
+                break;
+
             case KubernetesOperations.DELETE_POD_OPERATION:
                 doDeletePod(exchange);
                 break;
@@ -108,7 +114,6 @@ public class KubernetesPodsProducer extends DefaultProducer {
     }
 
     protected void doGetPod(Exchange exchange) {
-        Pod pod = null;
         String podName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_POD_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         if (ObjectHelper.isEmpty(podName)) {
@@ -119,32 +124,41 @@ public class KubernetesPodsProducer extends DefaultProducer {
             LOG.error("Get a specific pod require specify a namespace name");
             throw new IllegalArgumentException("Get a specific pod require specify a namespace name");
         }
-        pod = getEndpoint().getKubernetesClient().pods().inNamespace(namespaceName).withName(podName).get();
+        Pod pod = getEndpoint().getKubernetesClient().pods().inNamespace(namespaceName).withName(podName).get();
 
         prepareOutboundMessage(exchange, pod);
     }
 
+    protected void doReplacePod(Exchange exchange) {
+        doCreateOrUpdatePod(exchange, "Replace", Resource::replace);
+    }
+
     protected void doCreatePod(Exchange exchange) {
-        Pod pod = null;
+        doCreateOrUpdatePod(exchange, "Create", Resource::create);
+    }
+
+    private void doCreateOrUpdatePod(Exchange exchange, String operationName, Function<Resource<Pod>, Pod> operation) {
         String podName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_POD_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         PodSpec podSpec = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_POD_SPEC, PodSpec.class);
         if (ObjectHelper.isEmpty(podName)) {
-            LOG.error("Create a specific pod require specify a pod name");
-            throw new IllegalArgumentException("Create a specific pod require specify a pod name");
+            LOG.error("{} a specific pod require specify a pod name", operationName);
+            throw new IllegalArgumentException(String.format("%s a specific pod require specify a pod name", operationName));
         }
         if (ObjectHelper.isEmpty(namespaceName)) {
-            LOG.error("Create a specific pod require specify a namespace name");
-            throw new IllegalArgumentException("Create a specific pod require specify a namespace name");
+            LOG.error("{} a specific pod require specify a namespace name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific pod require specify a namespace name", operationName));
         }
         if (ObjectHelper.isEmpty(podSpec)) {
-            LOG.error("Create a specific pod require specify a pod spec bean");
-            throw new IllegalArgumentException("Create a specific pod require specify a pod spec bean");
+            LOG.error("{} a specific pod require specify a pod spec bean", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific pod require specify a pod spec bean", operationName));
         }
         Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_PODS_LABELS, Map.class);
         Pod podCreating = new PodBuilder().withNewMetadata().withName(podName).withLabels(labels).endMetadata()
                 .withSpec(podSpec).build();
-        pod = getEndpoint().getKubernetesClient().pods().inNamespace(namespaceName).create(podCreating);
+        Pod pod = operation.apply(getEndpoint().getKubernetesClient().pods().inNamespace(namespaceName).resource(podCreating));
 
         prepareOutboundMessage(exchange, pod);
     }
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BasePropertiesFunction.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BasePropertiesFunction.java
index c084fc785d2..d2a313354e1 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BasePropertiesFunction.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BasePropertiesFunction.java
@@ -25,8 +25,8 @@ import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import io.fabric8.kubernetes.client.ConfigBuilder;
-import io.fabric8.kubernetes.client.DefaultKubernetesClient;
 import io.fabric8.kubernetes.client.KubernetesClient;
+import io.fabric8.kubernetes.client.KubernetesClientBuilder;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.ExtendedCamelContext;
@@ -70,8 +70,7 @@ abstract class BasePropertiesFunction extends ServiceSupport implements Properti
     private String mountPathSecrets;
 
     @Override
-    @SuppressWarnings("unchecked")
-    protected void doInit() throws Exception {
+    protected void doInit() {
         ObjectHelper.notNull(camelContext, "CamelContext");
         if (localMode == null) {
             localMode = "true"
@@ -82,7 +81,7 @@ abstract class BasePropertiesFunction extends ServiceSupport implements Properti
         }
     }
 
-    protected void doInitKubernetesClient() throws Exception {
+    protected void doInitKubernetesClient() {
         if (clientEnabled == null) {
             clientEnabled = "true"
                     .equalsIgnoreCase(camelContext.getPropertiesComponent().resolveProperty(CLIENT_ENABLED).orElse("true"));
@@ -130,7 +129,7 @@ abstract class BasePropertiesFunction extends ServiceSupport implements Properti
                         properties.remove(e.getKey());
                     }
                 }
-                client = new DefaultKubernetesClient(config.build());
+                client = new KubernetesClientBuilder().withConfig(config.build()).build();
                 LOG.info("Auto-configuration KubernetesClient summary");
                 for (var entry : properties.entrySet()) {
                     String k = entry.getKey().toString();
@@ -150,7 +149,7 @@ abstract class BasePropertiesFunction extends ServiceSupport implements Properti
                 }
             } else {
                 // create a default client to use
-                client = new DefaultKubernetesClient();
+                client = new KubernetesClientBuilder().build();
                 LOG.debug("Created default KubernetesClient (auto-configured by itself)");
             }
             // add to registry so the client can be reused
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/replication_controllers/KubernetesReplicationControllersProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/replication_controllers/KubernetesReplicationControllersProducer.java
index 11050a7fa38..f6f839f8522 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/replication_controllers/KubernetesReplicationControllersProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/replication_controllers/KubernetesReplicationControllersProducer.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.kubernetes.replication_controllers;
 
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import io.fabric8.kubernetes.api.model.ReplicationController;
 import io.fabric8.kubernetes.api.model.ReplicationControllerBuilder;
@@ -25,6 +26,7 @@ import io.fabric8.kubernetes.api.model.ReplicationControllerList;
 import io.fabric8.kubernetes.api.model.ReplicationControllerSpec;
 import io.fabric8.kubernetes.api.model.StatusDetails;
 import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;
+import io.fabric8.kubernetes.client.dsl.Resource;
 import io.fabric8.kubernetes.client.dsl.RollableScalableResource;
 import org.apache.camel.Exchange;
 import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint;
@@ -73,6 +75,10 @@ public class KubernetesReplicationControllersProducer extends DefaultProducer {
                 doCreateReplicationController(exchange);
                 break;
 
+            case KubernetesOperations.REPLACE_REPLICATION_CONTROLLER_OPERATION:
+                doReplaceReplicationController(exchange);
+                break;
+
             case KubernetesOperations.DELETE_REPLICATION_CONTROLLER_OPERATION:
                 doDeleteReplicationController(exchange);
                 break;
@@ -87,8 +93,8 @@ public class KubernetesReplicationControllersProducer extends DefaultProducer {
     }
 
     protected void doList(Exchange exchange) {
-        ReplicationControllerList rcList = null;
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        ReplicationControllerList rcList;
         if (!ObjectHelper.isEmpty(namespaceName)) {
             rcList = getEndpoint().getKubernetesClient().replicationControllers().inNamespace(namespaceName).list();
         } else {
@@ -99,10 +105,10 @@ public class KubernetesReplicationControllersProducer extends DefaultProducer {
     }
 
     protected void doListReplicationControllersByLabels(Exchange exchange) {
-        ReplicationControllerList rcList = null;
         Map<String, String> labels
                 = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLERS_LABELS, Map.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        ReplicationControllerList rcList;
         if (!ObjectHelper.isEmpty(namespaceName)) {
 
             NonNamespaceOperation<ReplicationController, ReplicationControllerList, RollableScalableResource<ReplicationController>> replicationControllers
@@ -123,7 +129,6 @@ public class KubernetesReplicationControllersProducer extends DefaultProducer {
     }
 
     protected void doGetReplicationController(Exchange exchange) {
-        ReplicationController rc = null;
         String rcName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLER_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         if (ObjectHelper.isEmpty(rcName)) {
@@ -135,36 +140,51 @@ public class KubernetesReplicationControllersProducer extends DefaultProducer {
             LOG.error("Get a specific replication controller require specify a namespace name");
             throw new IllegalArgumentException("Get a specific replication controller require specify a namespace name");
         }
-        rc = getEndpoint().getKubernetesClient().replicationControllers().inNamespace(namespaceName).withName(rcName).get();
+        ReplicationController rc = getEndpoint().getKubernetesClient().replicationControllers().inNamespace(namespaceName)
+                .withName(rcName).get();
 
         prepareOutboundMessage(exchange, rc);
     }
 
+    protected void doReplaceReplicationController(Exchange exchange) {
+        doCreateOrUpdateReplicationController(exchange, "Replace", Resource::replace);
+    }
+
     protected void doCreateReplicationController(Exchange exchange) {
-        ReplicationController rc = null;
+        doCreateOrUpdateReplicationController(exchange, "Create", Resource::create);
+    }
+
+    private void doCreateOrUpdateReplicationController(
+            Exchange exchange, String operationName,
+            Function<Resource<ReplicationController>, ReplicationController> operation) {
         String rcName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLER_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         ReplicationControllerSpec rcSpec = exchange.getIn()
                 .getHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLER_SPEC, ReplicationControllerSpec.class);
         if (ObjectHelper.isEmpty(rcName)) {
-            LOG.error("Create a specific replication controller require specify a replication controller name");
+            LOG.error("{} a specific replication controller require specify a replication controller name", operationName);
             throw new IllegalArgumentException(
-                    "Create a specific replication controller require specify a replication controller name");
+                    String.format("%s a specific replication controller require specify a replication controller name",
+                            operationName));
         }
         if (ObjectHelper.isEmpty(namespaceName)) {
-            LOG.error("Create a specific replication controller require specify a namespace name");
-            throw new IllegalArgumentException("Create a specific replication controller require specify a namespace name");
+            LOG.error("{} a specific replication controller require specify a namespace name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific replication controller require specify a namespace name", operationName));
         }
         if (ObjectHelper.isEmpty(rcSpec)) {
-            LOG.error("Create a specific replication controller require specify a replication controller spec bean");
+            LOG.error("{} a specific replication controller require specify a replication controller spec bean", operationName);
             throw new IllegalArgumentException(
-                    "Create a specific replication controller require specify a replication controller spec bean");
+                    String.format("%s a specific replication controller require specify a replication controller spec bean",
+                            operationName));
         }
         Map<String, String> labels
                 = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLERS_LABELS, Map.class);
         ReplicationController rcCreating = new ReplicationControllerBuilder().withNewMetadata().withName(rcName)
                 .withLabels(labels).endMetadata().withSpec(rcSpec).build();
-        rc = getEndpoint().getKubernetesClient().replicationControllers().inNamespace(namespaceName).create(rcCreating);
+        ReplicationController rc
+                = operation.apply(getEndpoint().getKubernetesClient().replicationControllers().inNamespace(namespaceName)
+                        .resource(rcCreating));
 
         prepareOutboundMessage(exchange, rc);
     }
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/resources_quota/KubernetesResourcesQuotaProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/resources_quota/KubernetesResourcesQuotaProducer.java
index 34549c0b9c4..2318340552f 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/resources_quota/KubernetesResourcesQuotaProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/resources_quota/KubernetesResourcesQuotaProducer.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.kubernetes.resources_quota;
 
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import io.fabric8.kubernetes.api.model.ResourceQuota;
 import io.fabric8.kubernetes.api.model.ResourceQuotaBuilder;
@@ -74,6 +75,10 @@ public class KubernetesResourcesQuotaProducer extends DefaultProducer {
                 doCreateResourceQuota(exchange);
                 break;
 
+            case KubernetesOperations.REPLACE_RESOURCE_QUOTA_OPERATION:
+                doReplaceResourceQuota(exchange);
+                break;
+
             case KubernetesOperations.DELETE_RESOURCE_QUOTA_OPERATION:
                 doDeleteResourceQuota(exchange);
                 break;
@@ -90,10 +95,10 @@ public class KubernetesResourcesQuotaProducer extends DefaultProducer {
     }
 
     protected void doListResourceQuotasByLabels(Exchange exchange) {
-        ResourceQuotaList resList = null;
         Map<String, String> labels
                 = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_RESOURCES_QUOTA_LABELS, Map.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        ResourceQuotaList resList;
         if (!ObjectHelper.isEmpty(namespaceName)) {
             NonNamespaceOperation<ResourceQuota, ResourceQuotaList, Resource<ResourceQuota>> resQuota
                     = getEndpoint().getKubernetesClient().resourceQuotas().inNamespace(namespaceName);
@@ -114,7 +119,6 @@ public class KubernetesResourcesQuotaProducer extends DefaultProducer {
     }
 
     protected void doGetResourceQuota(Exchange exchange) {
-        ResourceQuota rq = null;
         String rqName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_RESOURCES_QUOTA_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         if (ObjectHelper.isEmpty(rqName)) {
@@ -125,34 +129,47 @@ public class KubernetesResourcesQuotaProducer extends DefaultProducer {
             LOG.error("Get a specific Resource Quota require specify a namespace name");
             throw new IllegalArgumentException("Get a specific Resource Quota require specify a namespace name");
         }
-        rq = getEndpoint().getKubernetesClient().resourceQuotas().inNamespace(namespaceName).withName(rqName).get();
+        ResourceQuota rq
+                = getEndpoint().getKubernetesClient().resourceQuotas().inNamespace(namespaceName).withName(rqName).get();
 
         prepareOutboundMessage(exchange, rq);
     }
 
+    protected void doReplaceResourceQuota(Exchange exchange) {
+        doCreateOrUpdateResourceQuota(exchange, "Replace", Resource::replace);
+    }
+
     protected void doCreateResourceQuota(Exchange exchange) {
-        ResourceQuota rq = null;
+        doCreateOrUpdateResourceQuota(exchange, "Create", Resource::create);
+    }
+
+    private void doCreateOrUpdateResourceQuota(
+            Exchange exchange, String operationName, Function<Resource<ResourceQuota>, ResourceQuota> operation) {
         String rqName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_RESOURCES_QUOTA_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         ResourceQuotaSpec rqSpec
                 = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_RESOURCE_QUOTA_SPEC, ResourceQuotaSpec.class);
         if (ObjectHelper.isEmpty(rqName)) {
-            LOG.error("Create a specific resource quota require specify a resource quota name");
-            throw new IllegalArgumentException("Create a specific resource quota require specify a resource quota name");
+            LOG.error("{} a specific resource quota require specify a resource quota name", operationName);
+            throw new IllegalArgumentException(
+                    operationName + " a specific resource quota require specify a resource quota name");
         }
         if (ObjectHelper.isEmpty(namespaceName)) {
-            LOG.error("Create a specific resource quota require specify a namespace name");
-            throw new IllegalArgumentException("Create a specific resource quota require specify a namespace name");
+            LOG.error("{} a specific resource quota require specify a namespace name", operationName);
+            throw new IllegalArgumentException(operationName + " a specific resource quota require specify a namespace name");
         }
         if (ObjectHelper.isEmpty(rqSpec)) {
-            LOG.error("Create a specific resource quota require specify a resource quota spec bean");
-            throw new IllegalArgumentException("Create a specific resource quota require specify a resource quota spec bean");
+            LOG.error("{} a specific resource quota require specify a resource quota spec bean", operationName);
+            throw new IllegalArgumentException(
+                    operationName + " a specific resource quota require specify a resource quota spec bean");
         }
         Map<String, String> labels
                 = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_RESOURCES_QUOTA_LABELS, Map.class);
         ResourceQuota rqCreating = new ResourceQuotaBuilder().withNewMetadata().withName(rqName).withLabels(labels)
                 .endMetadata().withSpec(rqSpec).build();
-        rq = getEndpoint().getKubernetesClient().resourceQuotas().inNamespace(namespaceName).create(rqCreating);
+        ResourceQuota rq
+                = operation.apply(
+                        getEndpoint().getKubernetesClient().resourceQuotas().inNamespace(namespaceName).resource(rqCreating));
 
         prepareOutboundMessage(exchange, rq);
     }
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/KubernetesSecretsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/KubernetesSecretsProducer.java
index bbc27d0874c..003ec056451 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/KubernetesSecretsProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/KubernetesSecretsProducer.java
@@ -18,10 +18,12 @@ package org.apache.camel.component.kubernetes.secrets;
 
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import io.fabric8.kubernetes.api.model.Secret;
 import io.fabric8.kubernetes.api.model.SecretList;
 import io.fabric8.kubernetes.api.model.StatusDetails;
+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;
@@ -69,6 +71,10 @@ public class KubernetesSecretsProducer extends DefaultProducer {
                 doCreateSecret(exchange);
                 break;
 
+            case KubernetesOperations.REPLACE_SECRET_OPERATION:
+                doReplaceSecret(exchange);
+                break;
+
             case KubernetesOperations.DELETE_SECRET_OPERATION:
                 doDeleteSecret(exchange);
                 break;
@@ -84,9 +90,9 @@ public class KubernetesSecretsProducer extends DefaultProducer {
     }
 
     protected void doListSecretsByLabels(Exchange exchange) {
-        SecretList secretsList = null;
         Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SECRETS_LABELS, Map.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        SecretList secretsList;
         if (!ObjectHelper.isEmpty(namespaceName)) {
             secretsList = getEndpoint()
                     .getKubernetesClient()
@@ -106,7 +112,6 @@ public class KubernetesSecretsProducer extends DefaultProducer {
     }
 
     protected void doGetSecret(Exchange exchange) {
-        Secret secret = null;
         String secretName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SECRET_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         if (ObjectHelper.isEmpty(secretName)) {
@@ -117,24 +122,35 @@ public class KubernetesSecretsProducer extends DefaultProducer {
             LOG.error("Get a specific Secret require specify a namespace name");
             throw new IllegalArgumentException("Get a specific Secret require specify a namespace name");
         }
-        secret = getEndpoint().getKubernetesClient().secrets().inNamespace(namespaceName).withName(secretName).get();
+        Secret secret = getEndpoint().getKubernetesClient().secrets().inNamespace(namespaceName).withName(secretName).get();
 
         prepareOutboundMessage(exchange, secret);
     }
 
+    protected void doReplaceSecret(Exchange exchange) {
+        doCreateOrUpdateSecret(exchange, "Replace", Resource::replace);
+    }
+
     protected void doCreateSecret(Exchange exchange) {
-        Secret secret = null;
+        doCreateOrUpdateSecret(exchange, "Create", Resource::create);
+    }
+
+    private void doCreateOrUpdateSecret(Exchange exchange, String operationName, Function<Resource<Secret>, Secret> operation) {
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         Secret secretToCreate = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SECRET, Secret.class);
         if (ObjectHelper.isEmpty(namespaceName)) {
-            LOG.error("Create a specific secret require specify a namespace name");
-            throw new IllegalArgumentException("Create a specific secret require specify a namespace name");
+            LOG.error("{} a specific secret require specify a namespace name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific secret require specify a namespace name", operationName));
         }
         if (ObjectHelper.isEmpty(secretToCreate)) {
-            LOG.error("Create a specific secret require specify a secret bean");
-            throw new IllegalArgumentException("Create a specific secret require specify a secret bean");
+            LOG.error("{} a specific secret require specify a secret bean", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific secret require specify a secret bean", operationName));
         }
-        secret = getEndpoint().getKubernetesClient().secrets().inNamespace(namespaceName).create(secretToCreate);
+        Secret secret
+                = operation.apply(
+                        getEndpoint().getKubernetesClient().secrets().inNamespace(namespaceName).resource(secretToCreate));
 
         prepareOutboundMessage(exchange, secret);
     }
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/service_accounts/KubernetesServiceAccountsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/service_accounts/KubernetesServiceAccountsProducer.java
index d1677c9cec8..1fffa9d0627 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/service_accounts/KubernetesServiceAccountsProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/service_accounts/KubernetesServiceAccountsProducer.java
@@ -18,10 +18,12 @@ package org.apache.camel.component.kubernetes.service_accounts;
 
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import io.fabric8.kubernetes.api.model.ServiceAccount;
 import io.fabric8.kubernetes.api.model.ServiceAccountList;
 import io.fabric8.kubernetes.api.model.StatusDetails;
+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;
@@ -69,6 +71,10 @@ public class KubernetesServiceAccountsProducer extends DefaultProducer {
                 doCreateServiceAccount(exchange);
                 break;
 
+            case KubernetesOperations.REPLACE_SERVICE_ACCOUNT_OPERATION:
+                doReplaceServiceAccount(exchange);
+                break;
+
             case KubernetesOperations.DELETE_SERVICE_ACCOUNT_OPERATION:
                 doDeleteServiceAccount(exchange);
                 break;
@@ -84,10 +90,10 @@ public class KubernetesServiceAccountsProducer extends DefaultProducer {
     }
 
     protected void doListServiceAccountsByLabels(Exchange exchange) {
-        ServiceAccountList saList = null;
         Map<String, String> labels
                 = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SERVICE_ACCOUNTS_LABELS, Map.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        ServiceAccountList saList;
         if (!ObjectHelper.isEmpty(namespaceName)) {
             saList = getEndpoint()
                     .getKubernetesClient()
@@ -108,7 +114,6 @@ public class KubernetesServiceAccountsProducer extends DefaultProducer {
     }
 
     protected void doGetServiceAccount(Exchange exchange) {
-        ServiceAccount sa = null;
         String saName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SERVICE_ACCOUNT_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         if (ObjectHelper.isEmpty(saName)) {
@@ -119,25 +124,37 @@ public class KubernetesServiceAccountsProducer extends DefaultProducer {
             LOG.error("Get a specific Service Account require specify a namespace name");
             throw new IllegalArgumentException("Get a specific Service Account require specify a namespace name");
         }
-        sa = getEndpoint().getKubernetesClient().serviceAccounts().inNamespace(namespaceName).withName(saName).get();
+        ServiceAccount sa
+                = getEndpoint().getKubernetesClient().serviceAccounts().inNamespace(namespaceName).withName(saName).get();
 
         prepareOutboundMessage(exchange, sa);
     }
 
+    protected void doReplaceServiceAccount(Exchange exchange) {
+        doCreateOrUpdateServiceAccount(exchange, "Replace", Resource::replace);
+    }
+
     protected void doCreateServiceAccount(Exchange exchange) {
-        ServiceAccount sa = null;
+        doCreateOrUpdateServiceAccount(exchange, "Create", Resource::create);
+    }
+
+    private void doCreateOrUpdateServiceAccount(
+            Exchange exchange, String operationName, Function<Resource<ServiceAccount>, ServiceAccount> operation) {
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         ServiceAccount saToCreate
                 = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SERVICE_ACCOUNT, ServiceAccount.class);
         if (ObjectHelper.isEmpty(namespaceName)) {
-            LOG.error("Create a specific Service Account require specify a namespace name");
-            throw new IllegalArgumentException("Create a specific Service Account require specify a namespace name");
+            LOG.error("{} a specific Service Account require specify a namespace name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific Service Account require specify a namespace name", operationName));
         }
         if (ObjectHelper.isEmpty(saToCreate)) {
-            LOG.error("Create a specific Service Account require specify a Service Account bean");
-            throw new IllegalArgumentException("Create a specific Service Account require specify a Service Account bean");
+            LOG.error("{} a specific Service Account require specify a Service Account bean", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific Service Account require specify a Service Account bean", operationName));
         }
-        sa = getEndpoint().getKubernetesClient().serviceAccounts().inNamespace(namespaceName).create(saToCreate);
+        ServiceAccount sa = operation.apply(getEndpoint().getKubernetesClient().serviceAccounts().inNamespace(namespaceName)
+                .resource(saToCreate));
 
         prepareOutboundMessage(exchange, sa);
     }
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/services/KubernetesServicesProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/services/KubernetesServicesProducer.java
index 2df1c1d29fb..2383e5c9014 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/services/KubernetesServicesProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/services/KubernetesServicesProducer.java
@@ -18,12 +18,14 @@ package org.apache.camel.component.kubernetes.services;
 
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import io.fabric8.kubernetes.api.model.Service;
 import io.fabric8.kubernetes.api.model.ServiceBuilder;
 import io.fabric8.kubernetes.api.model.ServiceList;
 import io.fabric8.kubernetes.api.model.ServiceSpec;
 import io.fabric8.kubernetes.api.model.StatusDetails;
+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;
@@ -71,6 +73,10 @@ public class KubernetesServicesProducer extends DefaultProducer {
                 doCreateService(exchange);
                 break;
 
+            case KubernetesOperations.REPLACE_SERVICE_OPERATION:
+                doReplaceService(exchange);
+                break;
+
             case KubernetesOperations.DELETE_SERVICE_OPERATION:
                 doDeleteService(exchange);
                 break;
@@ -81,8 +87,8 @@ public class KubernetesServicesProducer extends DefaultProducer {
     }
 
     protected void doList(Exchange exchange) {
-        ServiceList servicesList = null;
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        ServiceList servicesList;
         if (!ObjectHelper.isEmpty(namespaceName)) {
             servicesList = getEndpoint().getKubernetesClient().services().inNamespace(namespaceName).list();
         } else {
@@ -92,9 +98,9 @@ public class KubernetesServicesProducer extends DefaultProducer {
     }
 
     protected void doListServiceByLabels(Exchange exchange) {
-        ServiceList servicesList = null;
         Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SERVICE_LABELS, Map.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        ServiceList servicesList;
         if (!ObjectHelper.isEmpty(namespaceName)) {
             servicesList = getEndpoint()
                     .getKubernetesClient()
@@ -115,7 +121,6 @@ public class KubernetesServicesProducer extends DefaultProducer {
     }
 
     protected void doGetService(Exchange exchange) {
-        Service service = null;
         String serviceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SERVICE_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         if (ObjectHelper.isEmpty(serviceName)) {
@@ -126,32 +131,45 @@ public class KubernetesServicesProducer extends DefaultProducer {
             LOG.error("Get a specific service require specify a namespace name");
             throw new IllegalArgumentException("Get a specific service require specify a namespace name");
         }
-        service = getEndpoint().getKubernetesClient().services().inNamespace(namespaceName).withName(serviceName).get();
+        Service service = getEndpoint().getKubernetesClient().services().inNamespace(namespaceName).withName(serviceName).get();
 
         prepareOutboundMessage(exchange, service);
     }
 
+    protected void doReplaceService(Exchange exchange) {
+        doCreateOrUpdateService(exchange, "Replace", Resource::replace);
+    }
+
     protected void doCreateService(Exchange exchange) {
-        Service service = null;
+        doCreateOrUpdateService(exchange, "Create", Resource::create);
+    }
+
+    private void doCreateOrUpdateService(
+            Exchange exchange, String operationName, Function<Resource<Service>, Service> operation) {
         String serviceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SERVICE_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         ServiceSpec serviceSpec = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SERVICE_SPEC, ServiceSpec.class);
         if (ObjectHelper.isEmpty(serviceName)) {
-            LOG.error("Create a specific service require specify a service name");
-            throw new IllegalArgumentException("Create a specific service require specify a service name");
+            LOG.error("{} a specific service require specify a service name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific service require specify a service name", operationName));
         }
         if (ObjectHelper.isEmpty(namespaceName)) {
-            LOG.error("Create a specific service require specify a namespace name");
-            throw new IllegalArgumentException("Create a specific service require specify a namespace name");
+            LOG.error("{} a specific service require specify a namespace name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific service require specify a namespace name", operationName));
         }
         if (ObjectHelper.isEmpty(serviceSpec)) {
-            LOG.error("Create a specific service require specify a service spec bean");
-            throw new IllegalArgumentException("Create a specific service require specify a service spec bean");
+            LOG.error("{} a specific service require specify a service spec bean", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific service require specify a service spec bean", operationName));
         }
         Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SERVICE_LABELS, Map.class);
         Service serviceCreating = new ServiceBuilder().withNewMetadata().withName(serviceName).withLabels(labels).endMetadata()
                 .withSpec(serviceSpec).build();
-        service = getEndpoint().getKubernetesClient().services().inNamespace(namespaceName).create(serviceCreating);
+        Service service
+                = operation.apply(
+                        getEndpoint().getKubernetesClient().services().inNamespace(namespaceName).resource(serviceCreating));
 
         prepareOutboundMessage(exchange, service);
     }
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/openshift/build_configs/OpenshiftBuildConfigsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/openshift/build_configs/OpenshiftBuildConfigsProducer.java
index e485d3defcd..6057993c645 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/openshift/build_configs/OpenshiftBuildConfigsProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/openshift/build_configs/OpenshiftBuildConfigsProducer.java
@@ -76,9 +76,9 @@ public class OpenshiftBuildConfigsProducer extends DefaultProducer {
     }
 
     protected void doListBuildConfigsByLabels(Exchange exchange) {
-        BuildConfigList buildConfigsList = null;
         Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_BUILD_CONFIGS_LABELS, Map.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        BuildConfigList buildConfigsList;
         if (!ObjectHelper.isEmpty(namespaceName)) {
             buildConfigsList = getEndpoint().getKubernetesClient().adapt(OpenShiftClient.class).buildConfigs()
                     .inNamespace(namespaceName).withLabels(labels).list();
@@ -90,7 +90,6 @@ public class OpenshiftBuildConfigsProducer extends DefaultProducer {
     }
 
     protected void doGetBuildConfig(Exchange exchange) {
-        BuildConfig buildConfig = null;
         String buildConfigName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_BUILD_CONFIG_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         if (ObjectHelper.isEmpty(buildConfigName)) {
@@ -101,8 +100,9 @@ public class OpenshiftBuildConfigsProducer extends DefaultProducer {
             LOG.error("Get a specific Build Config require specify a namespace name");
             throw new IllegalArgumentException("Get a specific Build Config require specify a namespace name");
         }
-        buildConfig = getEndpoint().getKubernetesClient().adapt(OpenShiftClient.class).buildConfigs().inNamespace(namespaceName)
-                .withName(buildConfigName).get();
+        BuildConfig buildConfig
+                = getEndpoint().getKubernetesClient().adapt(OpenShiftClient.class).buildConfigs().inNamespace(namespaceName)
+                        .withName(buildConfigName).get();
 
         prepareOutboundMessage(exchange, buildConfig);
     }
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/openshift/builds/OpenshiftBuildsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/openshift/builds/OpenshiftBuildsProducer.java
index da5474ce895..5a8d3952479 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/openshift/builds/OpenshiftBuildsProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/openshift/builds/OpenshiftBuildsProducer.java
@@ -75,9 +75,9 @@ public class OpenshiftBuildsProducer extends DefaultProducer {
     }
 
     protected void doListBuildByLabels(Exchange exchange) {
-        BuildList buildList = null;
         Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_BUILDS_LABELS, Map.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        BuildList buildList;
         if (!ObjectHelper.isEmpty(namespaceName)) {
             buildList = getEndpoint().getKubernetesClient()
                     .adapt(OpenShiftClient.class).builds().inNamespace(namespaceName).withLabels(labels).list();
@@ -90,7 +90,6 @@ public class OpenshiftBuildsProducer extends DefaultProducer {
     }
 
     protected void doGetBuild(Exchange exchange) {
-        Build build = null;
         String buildName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_BUILD_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         if (ObjectHelper.isEmpty(buildName)) {
@@ -101,7 +100,7 @@ public class OpenshiftBuildsProducer extends DefaultProducer {
             LOG.error("Get a specific Build require specify a namespace name");
             throw new IllegalArgumentException("Get a specific Build require specify a namespace name");
         }
-        build = getEndpoint().getKubernetesClient().adapt(OpenShiftClient.class).builds().inNamespace(namespaceName)
+        Build build = getEndpoint().getKubernetesClient().adapt(OpenShiftClient.class).builds().inNamespace(namespaceName)
                 .withName(buildName).get();
 
         prepareOutboundMessage(exchange, build);
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/openshift/deploymentconfigs/OpenshiftDeploymentConfigsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/openshift/deploymentconfigs/OpenshiftDeploymentConfigsProducer.java
index a2f7732dbaf..d49b245002f 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/openshift/deploymentconfigs/OpenshiftDeploymentConfigsProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/openshift/deploymentconfigs/OpenshiftDeploymentConfigsProducer.java
@@ -18,8 +18,10 @@ package org.apache.camel.component.openshift.deploymentconfigs;
 
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import io.fabric8.kubernetes.api.model.StatusDetails;
+import io.fabric8.kubernetes.client.dsl.Resource;
 import io.fabric8.openshift.api.model.DeploymentConfig;
 import io.fabric8.openshift.api.model.DeploymentConfigBuilder;
 import io.fabric8.openshift.api.model.DeploymentConfigList;
@@ -76,6 +78,10 @@ public class OpenshiftDeploymentConfigsProducer extends DefaultProducer {
                 doCreateDeployment(exchange);
                 break;
 
+            case KubernetesOperations.REPLACE_DEPLOYMENT_CONFIG:
+                doReplaceDeployment(exchange);
+                break;
+
             case KubernetesOperations.SCALE_DEPLOYMENT_CONFIG:
                 doScaleDeploymentConfig(exchange);
                 break;
@@ -133,30 +139,43 @@ public class OpenshiftDeploymentConfigsProducer extends DefaultProducer {
         prepareOutboundMessage(exchange, deploymentConfigDeleted);
     }
 
+    protected void doReplaceDeployment(Exchange exchange) {
+        doCreateOrUpdateDeployment(exchange, "Replace", Resource::replace);
+    }
+
     protected void doCreateDeployment(Exchange exchange) {
+        doCreateOrUpdateDeployment(exchange, "Create", Resource::create);
+    }
+
+    private void doCreateOrUpdateDeployment(
+            Exchange exchange, String operationName, Function<Resource<DeploymentConfig>, DeploymentConfig> operation) {
         String deploymentName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_NAME, String.class);
         String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
         DeploymentConfigSpec dcSpec
                 = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_CONFIG_SPEC, DeploymentConfigSpec.class);
         if (ObjectHelper.isEmpty(deploymentName)) {
-            LOG.error("Create a specific Deployment Config require specify a Deployment name");
-            throw new IllegalArgumentException("Create a specific Deployment Config require specify a pod name");
+            LOG.error("{} a specific Deployment Config require specify a Deployment name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific Deployment Config require specify a pod name", operationName));
         }
         if (ObjectHelper.isEmpty(namespaceName)) {
-            LOG.error("Create a specific Deployment Config require specify a namespace name");
-            throw new IllegalArgumentException("Create a specific Deployment Config require specify a namespace name");
+            LOG.error("{} a specific Deployment Config require specify a namespace name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific Deployment Config require specify a namespace name", operationName));
         }
         if (ObjectHelper.isEmpty(dcSpec)) {
-            LOG.error("Create a specific Deployment Config require specify a Deployment Config spec bean");
+            LOG.error("{} a specific Deployment Config require specify a Deployment Config spec bean", operationName);
             throw new IllegalArgumentException(
-                    "Create a specific Deployment Config require specify a Deployment Config spec bean");
+                    String.format("%s a specific Deployment Config require specify a Deployment Config spec bean",
+                            operationName));
         }
         Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_DEPLOYMENTS_LABELS, Map.class);
         DeploymentConfig deploymentCreating = new DeploymentConfigBuilder().withNewMetadata().withName(deploymentName)
                 .withLabels(labels).endMetadata().withSpec(dcSpec).build();
-        DeploymentConfig deploymentConfig = getEndpoint().getKubernetesClient().adapt(OpenShiftClient.class).deploymentConfigs()
-                .inNamespace(namespaceName)
-                .create(deploymentCreating);
+        DeploymentConfig deploymentConfig
+                = operation.apply(getEndpoint().getKubernetesClient().adapt(OpenShiftClient.class).deploymentConfigs()
+                        .inNamespace(namespaceName)
+                        .resource(deploymentCreating));
 
         prepareOutboundMessage(exchange, deploymentConfig);
     }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/KubernetesServer.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/KubernetesServer.java
deleted file mode 100644
index 1f50c32614e..00000000000
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/KubernetesServer.java
+++ /dev/null
@@ -1,111 +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;
-
-import java.util.HashMap;
-
-import io.fabric8.kubernetes.client.NamespacedKubernetesClient;
-import io.fabric8.kubernetes.client.server.mock.KubernetesCrudDispatcher;
-import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;
-import io.fabric8.mockwebserver.Context;
-import io.fabric8.mockwebserver.dsl.MockServerExpectation;
-import io.fabric8.mockwebserver.dsl.ReturnOrWebsocketable;
-import io.fabric8.mockwebserver.dsl.TimesOnceableOrHttpHeaderable;
-import okhttp3.mockwebserver.MockWebServer;
-import okhttp3.mockwebserver.RecordedRequest;
-import org.junit.jupiter.api.extension.AfterEachCallback;
-import org.junit.jupiter.api.extension.BeforeEachCallback;
-import org.junit.jupiter.api.extension.ExtensionContext;
-
-public class KubernetesServer implements BeforeEachCallback, AfterEachCallback {
-
-    private KubernetesMockServer mock;
-    private NamespacedKubernetesClient client;
-    private boolean https;
-    private boolean crudMode;
-
-    public KubernetesServer() {
-        this(true, false);
-    }
-
-    public KubernetesServer(boolean https) {
-        this(https, false);
-    }
-
-    public KubernetesServer(boolean https, boolean crudMode) {
-        this.https = https;
-        this.crudMode = crudMode;
-    }
-
-    @Override
-    public void beforeEach(ExtensionContext context) {
-        this.mock = this.crudMode
-                ? new KubernetesMockServer(
-                        new Context(), new MockWebServer(), new HashMap(), new KubernetesCrudDispatcher(), true)
-                : new KubernetesMockServer(this.https);
-        this.mock.init();
-        this.client = this.mock.createClient();
-    }
-
-    @Override
-    public void afterEach(ExtensionContext context) {
-        this.mock.destroy();
-        this.client.close();
-    }
-
-    public NamespacedKubernetesClient getClient() {
-        return this.client;
-    }
-
-    public MockServerExpectation expect() {
-        return this.mock.expect();
-    }
-
-    /** @deprecated */
-    @Deprecated
-    public <T> void expectAndReturnAsJson(String path, int code, T body) {
-        ((TimesOnceableOrHttpHeaderable) ((ReturnOrWebsocketable) this.expect().withPath(path)).andReturn(code, body)).always();
-    }
-
-    /** @deprecated */
-    @Deprecated
-    public void expectAndReturnAsString(String path, int code, String body) {
-        ((TimesOnceableOrHttpHeaderable) ((ReturnOrWebsocketable) this.expect().withPath(path)).andReturn(code, body)).always();
-    }
-
-    /** @deprecated */
-    @Deprecated
-    public <T> void expectAndReturnAsJson(String method, String path, int code, T body) {
-        ((TimesOnceableOrHttpHeaderable) ((ReturnOrWebsocketable) this.expect().withPath(path)).andReturn(code, body)).always();
-    }
-
-    /** @deprecated */
-    @Deprecated
-    public void expectAndReturnAsString(String method, String path, int code, String body) {
-        ((TimesOnceableOrHttpHeaderable) ((ReturnOrWebsocketable) this.expect().withPath(path)).andReturn(code, body)).always();
-    }
-
-    public RecordedRequest getLastRequest() throws InterruptedException {
-        int count = this.mock.getRequestCount();
-
-        RecordedRequest request;
-        for (request = null; count-- > 0; request = this.mock.takeRequest()) {
-        }
-
-        return request;
-    }
-}
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/OpenShiftServer.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/OpenShiftServer.java
deleted file mode 100644
index 1223c0e8dac..00000000000
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/OpenShiftServer.java
+++ /dev/null
@@ -1,105 +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;
-
-import java.util.HashMap;
-
-import io.fabric8.kubernetes.client.KubernetesClient;
-import io.fabric8.kubernetes.client.server.mock.KubernetesCrudDispatcher;
-import io.fabric8.mockwebserver.Context;
-import io.fabric8.mockwebserver.dsl.MockServerExpectation;
-import io.fabric8.mockwebserver.dsl.ReturnOrWebsocketable;
-import io.fabric8.mockwebserver.dsl.TimesOnceableOrHttpHeaderable;
-import io.fabric8.openshift.client.NamespacedOpenShiftClient;
-import io.fabric8.openshift.client.server.mock.OpenShiftMockServer;
-import okhttp3.mockwebserver.MockWebServer;
-import okhttp3.mockwebserver.RecordedRequest;
-import org.junit.jupiter.api.extension.AfterEachCallback;
-import org.junit.jupiter.api.extension.BeforeEachCallback;
-import org.junit.jupiter.api.extension.ExtensionContext;
-
-public class OpenShiftServer implements BeforeEachCallback, AfterEachCallback {
-
-    protected OpenShiftMockServer mock;
-    private NamespacedOpenShiftClient client;
-    private boolean https;
-    private boolean curdMode;
-
-    public OpenShiftServer() {
-        this(true, false);
-    }
-
-    public OpenShiftServer(boolean https) {
-        this(https, false);
-    }
-
-    public OpenShiftServer(boolean https, boolean curdMode) {
-        this.https = https;
-        this.curdMode = curdMode;
-    }
-
-    @Override
-    public void beforeEach(ExtensionContext context) {
-        this.mock = this.curdMode
-                ? new OpenShiftMockServer(
-                        new Context(), new MockWebServer(), new HashMap(), new KubernetesCrudDispatcher(), true)
-                : new OpenShiftMockServer(this.https);
-        this.mock.init();
-        this.client = this.mock.createOpenShiftClient();
-    }
-
-    @Override
-    public void afterEach(ExtensionContext context) {
-        this.mock.destroy();
-        this.client.close();
-    }
-
-    public KubernetesClient getKubernetesClient() {
-        return this.client;
-    }
-
-    public NamespacedOpenShiftClient getOpenshiftClient() {
-        return this.client;
-    }
-
-    public MockServerExpectation expect() {
-        return this.mock.expect();
-    }
-
-    /** @deprecated */
-    @Deprecated
-    public <T> void expectAndReturnAsJson(String path, int code, T body) {
-        ((TimesOnceableOrHttpHeaderable) ((ReturnOrWebsocketable) this.expect().withPath(path)).andReturn(code, body)).always();
-    }
-
-    /** @deprecated */
-    @Deprecated
-    public void expectAndReturnAsString(String path, int code, String body) {
-        ((TimesOnceableOrHttpHeaderable) ((ReturnOrWebsocketable) this.expect().withPath(path)).andReturn(code, body)).always();
-    }
-
-    public RecordedRequest getLastRequest() throws InterruptedException {
-        int count = this.mock.getRequestCount();
-
-        RecordedRequest request;
-        for (request = null; count-- > 0; request = this.mock.takeRequest()) {
-        }
-
-        return request;
-    }
-
-}
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/KubernetesTestSupport.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/KubernetesTestSupport.java
index ba8253cbc4d..37135c894dc 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/KubernetesTestSupport.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/KubernetesTestSupport.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.kubernetes;
 
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 
 import org.apache.camel.test.junit5.CamelTestSupport;
 import org.junit.jupiter.api.BeforeEach;
@@ -49,6 +50,6 @@ public class KubernetesTestSupport extends CamelTestSupport {
     }
 
     public static String toUrlEncoded(String str) throws UnsupportedEncodingException {
-        return URLEncoder.encode(str, "UTF-8");
+        return URLEncoder.encode(str, StandardCharsets.UTF_8);
     }
 }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesConfigMapsConsumerIT.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesConfigMapsConsumerIT.java
index d8508157efa..c16c2d99301 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesConfigMapsConsumerIT.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesConfigMapsConsumerIT.java
@@ -38,6 +38,7 @@ 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;
 
@@ -65,7 +66,7 @@ public class KubernetesConfigMapsConsumerIT extends KubernetesTestSupport {
 
     @Test
     @Order(1)
-    public void createConfigMapWithProperties() {
+    void createConfigMapWithProperties() {
         configureMock();
 
         Exchange ex = template.request("direct:createConfigmap", exchange -> {
@@ -87,7 +88,7 @@ public class KubernetesConfigMapsConsumerIT extends KubernetesTestSupport {
 
     @Test
     @Order(2)
-    public void createConfigMap() {
+    void createConfigMap() {
         configureMock();
 
         Exchange ex = template.request("direct:createConfigmap", exchange -> {
@@ -105,10 +106,33 @@ public class KubernetesConfigMapsConsumerIT extends KubernetesTestSupport {
         assertNotNull(message.getBody());
     }
 
-    @ParameterizedTest
+    @Test
     @Order(3)
+    void replaceConfigMap() {
+        configureMock();
+
+        Map<String, String> configMapData = Map.of("test1", "test1");
+        Exchange ex = template.request("direct:replaceConfigmap", exchange -> {
+            exchange.getIn().removeHeader(KubernetesConstants.KUBERNETES_CONFIGMAPS_LABELS);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "default");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_NAME, "test1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_DATA, configMapData);
+        });
+
+        Message message = ex.getMessage();
+
+        assertNotNull(message);
+        ConfigMap result = ex.getMessage().getBody(ConfigMap.class);
+
+        assertEquals("default", result.getMetadata().getNamespace());
+        assertEquals("test1", result.getMetadata().getName());
+        assertEquals(configMapData, result.getData());
+    }
+
+    @ParameterizedTest
+    @Order(4)
     @ValueSource(strings = { "test", "test1" })
-    public void deleteConfigMaps(String configMapName) {
+    void deleteConfigMaps(String configMapName) {
         Exchange ex = template.request("direct:deleteConfigmap", exchange -> {
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "default");
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_NAME, configMapName);
@@ -132,6 +156,9 @@ public class KubernetesConfigMapsConsumerIT extends KubernetesTestSupport {
                 from("direct:createConfigmap")
                         .toF("kubernetes-config-maps://%s?oauthToken=%s&operation=createConfigMap", host,
                                 authToken);
+                from("direct:replaceConfigmap")
+                        .toF("kubernetes-config-maps://%s?oauthToken=%s&operation=replaceConfigMap", host,
+                                authToken);
 
                 from("direct:deleteConfigmap")
                         .toF("kubernetes-config-maps://%s?oauthToken=%s&operation=deleteConfigMap", host,
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesCustomResourcesConsumerIT.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesCustomResourcesConsumerIT.java
index 3a90ab6de32..e51dc808329 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesCustomResourcesConsumerIT.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesCustomResourcesConsumerIT.java
@@ -22,8 +22,8 @@ import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition
 import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinitionBuilder;
 import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinitionVersionBuilder;
 import io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsBuilder;
-import io.fabric8.kubernetes.client.DefaultKubernetesClient;
 import io.fabric8.kubernetes.client.KubernetesClient;
+import io.fabric8.kubernetes.client.KubernetesClientBuilder;
 import io.fabric8.kubernetes.client.Watcher;
 import org.apache.camel.EndpointInject;
 import org.apache.camel.Exchange;
@@ -54,23 +54,22 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
 public class KubernetesCustomResourcesConsumerIT extends KubernetesTestSupport {
 
-    private static final KubernetesClient CLIENT = new DefaultKubernetesClient();
+    private static final KubernetesClient CLIENT = new KubernetesClientBuilder().build();
+    private static final String CRD_SOURCE_STRING = "{\n" +
+                                                    "  \"apiVersion\": \"camel.apache.org/v1\",\n" +
+                                                    "  \"kind\": \"CamelTest\",\n" +
+                                                    "  \"metadata\": {\n" +
+                                                    "    \"name\": \"camel-crd-itest\"\n" +
+                                                    "  },\n" +
+                                                    "  \"spec\": {\n" +
+                                                    "    \"message\": \"Apache Camel Rocks!\"\n" +
+                                                    "  }\n" +
+                                                    "}";
     private static CustomResourceDefinition crd;
 
     @EndpointInject("mock:result")
     protected MockEndpoint mockResultEndpoint;
 
-    private String crdSourceString = "{\n" +
-                                     "  \"apiVersion\": \"camel.apache.org/v1\",\n" +
-                                     "  \"kind\": \"CamelTest\",\n" +
-                                     "  \"metadata\": {\n" +
-                                     "    \"name\": \"camel-crd-itest\"\n" +
-                                     "  },\n" +
-                                     "  \"spec\": {\n" +
-                                     "    \"message\": \"Apache Camel Rocks!\"\n" +
-                                     "  }\n" +
-                                     "}";
-
     @BeforeAll
     public static void beforeAll() {
         crd = new CustomResourceDefinitionBuilder()
@@ -115,11 +114,11 @@ public class KubernetesCustomResourcesConsumerIT extends KubernetesTestSupport {
 
     @Test
     @Order(1)
-    public void createCustomResource() throws Exception {
+    void createCustomResource() throws Exception {
         mockResultEndpoint.expectedHeaderValuesReceivedInAnyOrder(KubernetesConstants.KUBERNETES_CRD_EVENT_ACTION,
                 Watcher.Action.ADDED);
         Exchange ex = template.request("direct:createCustomResource", exchange -> {
-            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_INSTANCE, crdSourceString);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_INSTANCE, CRD_SOURCE_STRING);
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_INSTANCE_NAME, "camel-crd-itest");
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "default");
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_NAME, "cameltests.camel.apache.org");
@@ -137,7 +136,7 @@ public class KubernetesCustomResourcesConsumerIT extends KubernetesTestSupport {
 
     @Test
     @Order(2)
-    public void deleteCustomResource() throws Exception {
+    void deleteCustomResource() throws Exception {
         mockResultEndpoint.reset();
         mockResultEndpoint.expectedHeaderValuesReceivedInAnyOrder(KubernetesConstants.KUBERNETES_CRD_EVENT_ACTION,
                 Watcher.Action.ADDED, Watcher.Action.DELETED);
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesNamespacesConsumerIT.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesNamespacesConsumerIT.java
index e34c62cd465..31eb6e02a76 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesNamespacesConsumerIT.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesNamespacesConsumerIT.java
@@ -17,7 +17,6 @@
 package org.apache.camel.component.kubernetes.consumer.integration;
 
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ThreadLocalRandom;
@@ -56,7 +55,7 @@ public class KubernetesNamespacesConsumerIT extends KubernetesTestSupport {
 
     @Test
     @Order(1)
-    public void createPod() {
+    void createPod() {
         mockResultEndpoint.expectedMessageCount(5);
         mockResultEndpoint.expectedHeaderValuesReceivedInAnyOrder(KubernetesConstants.KUBERNETES_EVENT_ACTION, "ADDED",
                 "MODIFIED", "MODIFIED", "MODIFIED", "DELETED");
@@ -76,20 +75,17 @@ public class KubernetesNamespacesConsumerIT extends KubernetesTestSupport {
 
     @Test
     @Order(2)
-    public void listByLabels() {
+    void listByLabels() {
         Exchange ex = template.request("direct:listByLabels", exchange -> {
             Map<String, String> labels = new HashMap<>();
             labels.put("this", "rocks");
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_LABELS, labels);
         });
 
-        List<Namespace> result = ex.getMessage().getBody(List.class);
-
         boolean testNamespaceExists = false;
 
-        Iterator<Namespace> it = result.iterator();
-        while (it.hasNext()) {
-            Namespace namespace = it.next();
+        for (Object o : ex.getMessage().getBody(List.class)) {
+            Namespace namespace = (Namespace) o;
             if (TEST_NAME_SPACE.equalsIgnoreCase(namespace.getMetadata().getName())) {
                 testNamespaceExists = true;
             }
@@ -100,7 +96,7 @@ public class KubernetesNamespacesConsumerIT extends KubernetesTestSupport {
 
     @Test
     @Order(3)
-    public void deletePod() throws Exception {
+    void deletePod() throws Exception {
         Exchange ex = template.request("direct:deleteNamespace",
                 exchange -> exchange.getIn()
                         .setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, TEST_NAME_SPACE));
@@ -120,10 +116,8 @@ public class KubernetesNamespacesConsumerIT extends KubernetesTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() {
-                from("direct:list").toF("kubernetes-namespaces://%s?oauthToken=%s&operation=listNamespaces", host, authToken);
                 from("direct:listByLabels").toF("kubernetes-namespaces://%s?oauthToken=%s&operation=listNamespacesByLabels",
                         host, authToken);
-                from("direct:getNs").toF("kubernetes-namespaces://%s?oauthToken=%s&operation=getNamespace", host, authToken);
                 from("direct:createNamespace").toF("kubernetes-namespaces://%s?oauthToken=%s&operation=createNamespace", host,
                         authToken);
                 from("direct:deleteNamespace").toF("kubernetes-namespaces://%s?oauthToken=%s&operation=deleteNamespace", host,
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesNodesConsumerIT.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesNodesConsumerIT.java
index b43c04ebeaf..250047c9ab4 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesNodesConsumerIT.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesNodesConsumerIT.java
@@ -47,7 +47,7 @@ public class KubernetesNodesConsumerIT extends KubernetesTestSupport {
 
     @Test
     @Order(1)
-    public void listNode() throws Exception {
+    void listNode() throws Exception {
         configureMock();
         Exchange ex = template.request("direct:listNode", exchange -> {
 
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesPodsConsumerIT.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesPodsConsumerIT.java
index cd552995678..f43758de4d1 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesPodsConsumerIT.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesPodsConsumerIT.java
@@ -88,7 +88,7 @@ public class KubernetesPodsConsumerIT extends KubernetesTestSupport {
 
     @Test
     @Order(1)
-    public void createPod() throws Exception {
+    void createPod() throws Exception {
         mockResultEndpoint.expectedMessageCount(2);
         mockResultEndpoint.expectedHeaderValuesReceivedInAnyOrder(KubernetesConstants.KUBERNETES_EVENT_ACTION, "ADDED",
                 "ADDED", "ADDED");
@@ -103,7 +103,7 @@ public class KubernetesPodsConsumerIT extends KubernetesTestSupport {
 
     @Test
     @Order(2)
-    public void deletePod() throws Exception {
+    void deletePod() throws Exception {
         mockResultEndpoint.expectedMessageCount(1);
         mockResultEndpoint.expectedHeaderValuesReceivedInAnyOrder(KubernetesConstants.KUBERNETES_EVENT_ACTION,
                 "ADDED", "ADDED", "ADDED");
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesReplicationControllersConsumerIT.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesReplicationControllersConsumerIT.java
index 71b99b80cb4..39cfed9d34c 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesReplicationControllersConsumerIT.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesReplicationControllersConsumerIT.java
@@ -60,7 +60,7 @@ public class KubernetesReplicationControllersConsumerIT extends KubernetesTestSu
 
     @Test
     @Order(1)
-    public void createReplicationController() throws Exception {
+    void createReplicationController() throws Exception {
         mockResultEndpoint.expectedHeaderValuesReceivedInAnyOrder(KubernetesConstants.KUBERNETES_EVENT_ACTION, "ADDED",
                 "MODIFIED", "MODIFIED");
 
@@ -93,7 +93,7 @@ public class KubernetesReplicationControllersConsumerIT extends KubernetesTestSu
 
     @Test
     @Order(2)
-    public void deleteReplicationController() throws Exception {
+    void deleteReplicationController() throws Exception {
         Exchange ex = template.request("direct:deleteReplicationController", exchange -> {
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "default");
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLER_NAME, "test");
@@ -111,15 +111,6 @@ public class KubernetesReplicationControllersConsumerIT extends KubernetesTestSu
         return new RouteBuilder() {
             @Override
             public void configure() {
-                from("direct:list").toF(
-                        "kubernetes-replication-controllers://%s?oauthToken=%s&operation=listReplicationControllers", host,
-                        authToken);
-                from("direct:listByLabels").toF(
-                        "kubernetes-replication-controllers://%s?oauthToken=%s&operation=listReplicationControllersByLabels",
-                        host, authToken);
-                from("direct:getReplicationController").toF(
-                        "kubernetes-replication-controllers://%s?oauthToken=%s&operation=getReplicationController", host,
-                        authToken);
                 from("direct:createReplicationController").toF(
                         "kubernetes-replication-controllers://%s?oauthToken=%s&operation=createReplicationController", host,
                         authToken);
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesServicesConsumerIT.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesServicesConsumerIT.java
index f4cbfc88c2e..f254f540ee7 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesServicesConsumerIT.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesServicesConsumerIT.java
@@ -60,8 +60,7 @@ public class KubernetesServicesConsumerIT extends KubernetesTestSupport {
 
     @Test
     @Order(1)
-    public void createService() {
-        //        mockResultEndpoint.expectedMessageCount(1);
+    void createService() {
         mockResultEndpoint.expectedHeaderValuesReceivedInAnyOrder(KubernetesConstants.KUBERNETES_EVENT_ACTION, "ADDED");
 
         Exchange ex = template.request("direct:createService", exchange -> {
@@ -94,7 +93,7 @@ public class KubernetesServicesConsumerIT extends KubernetesTestSupport {
 
     @Test
     @Order(2)
-    public void deleteService() {
+    void deleteService() {
         Exchange ex = template.request("direct:deleteService", exchange -> {
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "default");
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SERVICE_NAME, TEST_SERVICE_NAME);
@@ -113,10 +112,6 @@ public class KubernetesServicesConsumerIT extends KubernetesTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() {
-                from("direct:list").toF("kubernetes-services://%s?oauthToken=%s&operation=listServices", host, authToken);
-                from("direct:listByLabels").toF("kubernetes-services://%s?oauthToken=%s&operation=listServicesByLabels", host,
-                        authToken);
-                from("direct:getServices").toF("kubernetes-services://%s?oauthToken=%s&operation=getService", host, authToken);
                 from("direct:createService").toF("kubernetes-services://%s?oauthToken=%s&operation=createService", host,
                         authToken);
                 from("direct:deleteService").toF("kubernetes-services://%s?oauthToken=%s&operation=deleteService", host,
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducerTest.java
index 817e538d8fc..d18e510328b 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducerTest.java
@@ -25,39 +25,41 @@ import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
 import io.fabric8.kubernetes.api.model.ConfigMapListBuilder;
 import io.fabric8.kubernetes.api.model.ObjectMeta;
 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.KubernetesServer;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@EnableKubernetesMockClient
 public class KubernetesConfigMapsProducerTest extends KubernetesTestSupport {
 
-    @RegisterExtension
-    public KubernetesServer server = new KubernetesServer();
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BindToRegistry("kubernetesClient")
     public KubernetesClient getClient() {
-        return server.getClient();
+        return client;
     }
 
     @Test
-    public void listTest() {
+    void listTest() {
         server.expect().withPath("/api/v1/configmaps")
                 .andReturn(200, new ConfigMapListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
                 .once();
-        List<ConfigMap> result = template.requestBody("direct:list", "", List.class);
+        List<?> result = template.requestBody("direct:list", "", List.class);
         assertEquals(3, result.size());
     }
 
     @Test
-    public void listByLabelsTest() throws Exception {
+    void listByLabelsTest() throws Exception {
         server.expect().withPath("/api/v1/configmaps?labelSelector=" + toUrlEncoded("key1=value1,key2=value2"))
                 .andReturn(200, new ConfigMapListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
                 .once();
@@ -68,13 +70,13 @@ public class KubernetesConfigMapsProducerTest extends KubernetesTestSupport {
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAPS_LABELS, labels);
         });
 
-        List<ConfigMap> result = ex.getMessage().getBody(List.class);
+        List<?> result = ex.getMessage().getBody(List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void getConfigMapTestDefaultNamespace() {
+    void getConfigMapTestDefaultNamespace() {
         ObjectMeta meta = new ObjectMeta();
         meta.setName("cm1");
         server.expect().withPath("/api/v1/namespaces/test/configmaps/cm1")
@@ -90,7 +92,7 @@ public class KubernetesConfigMapsProducerTest extends KubernetesTestSupport {
     }
 
     @Test
-    public void getConfigMapTestCustomNamespace() {
+    void getConfigMapTestCustomNamespace() {
         ObjectMeta meta = new ObjectMeta();
         meta.setName("cm1");
         server.expect().withPath("/api/v1/namespaces/custom/configmaps/cm1")
@@ -108,7 +110,55 @@ public class KubernetesConfigMapsProducerTest extends KubernetesTestSupport {
     }
 
     @Test
-    public void createGetAndDeleteConfigMap() {
+    void createConfigMap() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        Map<String, String> data = Map.of("my.data.key", "my.data.value");
+        ConfigMap cm1 = new ConfigMapBuilder().withNewMetadata().withName("cm1").withNamespace("test").withLabels(labels).and()
+                .withData(data).build();
+        server.expect().post().withPath("/api/v1/namespaces/test/configmaps").andReturn(200, cm1).once();
+
+        Exchange ex = template.request("direct:createConfigMap", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAPS_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_NAME, "cm1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_DATA, data);
+        });
+
+        ConfigMap result = ex.getMessage().getBody(ConfigMap.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("cm1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+    }
+
+    @Test
+    void replaceConfigMap() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        Map<String, String> data = Map.of("my.data.key", "my.data.value");
+        ConfigMap cm1 = new ConfigMapBuilder().withNewMetadata().withName("cm1").withNamespace("test").withLabels(labels).and()
+                .withData(data).build();
+        server.expect().get().withPath("/api/v1/namespaces/test/configmaps/cm1")
+                .andReturn(200,
+                        new ConfigMapBuilder().withNewMetadata().withName("cm1").withNamespace("test").endMetadata().build())
+                .once();
+        server.expect().put().withPath("/api/v1/namespaces/test/configmaps/cm1").andReturn(200, cm1).once();
+
+        Exchange ex = template.request("direct:replaceConfigMap", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAPS_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_NAME, "cm1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_DATA, data);
+        });
+
+        ConfigMap result = ex.getMessage().getBody(ConfigMap.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("cm1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+    }
+
+    @Test
+    void deleteConfigMap() {
         ConfigMap cm1 = new ConfigMapBuilder().withNewMetadata().withName("cm1").withNamespace("test").and().build();
         server.expect().withPath("/api/v1/namespaces/test/configmaps/cm1").andReturn(200, cm1).once();
 
@@ -135,6 +185,8 @@ public class KubernetesConfigMapsProducerTest extends KubernetesTestSupport {
                         .to("kubernetes-config-maps:///?kubernetesClient=#kubernetesClient&operation=getConfigMap");
                 from("direct:createConfigMap")
                         .to("kubernetes-config-maps:///?kubernetesClient=#kubernetesClient&operation=createConfigMap");
+                from("direct:replaceConfigMap")
+                        .to("kubernetes-config-maps:///?kubernetesClient=#kubernetesClient&operation=replaceConfigMap");
                 from("direct:deleteConfigMap")
                         .to("kubernetes-config-maps:///?kubernetesClient=#kubernetesClient&operation=deleteConfigMap");
             }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesCustomResourcesProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesCustomResourcesProducerTest.java
index 039a0a26490..22d54a9ddd4 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesCustomResourcesProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesCustomResourcesProducerTest.java
@@ -25,12 +25,13 @@ import java.util.Map;
 import io.fabric8.kubernetes.api.model.GenericKubernetesResource;
 import io.fabric8.kubernetes.api.model.GenericKubernetesResourceList;
 import io.fabric8.kubernetes.client.KubernetesClient;
-import io.fabric8.kubernetes.client.dsl.base.CustomResourceDefinitionContext;
+import io.fabric8.kubernetes.client.NamespacedKubernetesClient;
+import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient;
+import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;
 import io.fabric8.kubernetes.client.utils.Serialization;
 import org.apache.camel.BindToRegistry;
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.KubernetesServer;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.apache.camel.util.IOHelper;
@@ -39,7 +40,6 @@ import org.junit.jupiter.api.MethodOrderer;
 import org.junit.jupiter.api.Order;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestMethodOrder;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -47,22 +47,13 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@EnableKubernetesMockClient
 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
 public class KubernetesCustomResourcesProducerTest extends KubernetesTestSupport {
     private static String githubSourceString;
 
-    @RegisterExtension
-    public KubernetesServer server = new KubernetesServer();
-
-    private CustomResourceDefinitionContext getCustomResourceContext() {
-        return new CustomResourceDefinitionContext.Builder()
-                .withName("githubsources.sources.knative.dev")
-                .withGroup("sources.knative.dev")
-                .withScope("Namespaced")
-                .withVersion("v1alpha1")
-                .withPlural("githubsources")
-                .build();
-    }
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BeforeAll
     public static void readResource() throws IOException {
@@ -73,10 +64,10 @@ public class KubernetesCustomResourcesProducerTest extends KubernetesTestSupport
 
     @BindToRegistry("kubernetesClient")
     public KubernetesClient getClient() {
-        return server.getClient();
+        return client;
     }
 
-    private String setupGithubSourceList() throws Exception {
+    private String setupGithubSourceList() {
         GenericKubernetesResourceList list = new GenericKubernetesResourceList();
         list.getItems().add(Serialization.unmarshal(githubSourceString, GenericKubernetesResource.class));
         return Serialization.asJson(list);
@@ -84,7 +75,7 @@ public class KubernetesCustomResourcesProducerTest extends KubernetesTestSupport
 
     @Test
     @Order(1)
-    public void createTest() throws Exception {
+    void createTest() {
         server.expect().post().withPath("/apis/sources.knative.dev/v1alpha1/namespaces/testnamespace/githubsources")
                 .andReturn(200, githubSourceString).once();
         server.expect().delete().withPath("/apis/sources.knative.dev/v1alpha1/namespaces/testnamespace/githubsources/samplecr")
@@ -108,9 +99,35 @@ public class KubernetesCustomResourcesProducerTest extends KubernetesTestSupport
         assertNotNull(ex.getMessage().getBody());
     }
 
+    @Test
+    @Order(0)
+    void replaceTest() {
+        server.expect().get().withPath("/apis/sources.knative.dev/v1alpha1/namespaces/testnamespace/githubsources/samplecr")
+                .andReturn(200, githubSourceString).once();
+        server.expect().put().withPath("/apis/sources.knative.dev/v1alpha1/namespaces/testnamespace/githubsources/samplecr")
+                .andReturn(200, githubSourceString).once();
+
+        Exchange ex = template.request("direct:replaceCustomResource", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_INSTANCE_NAME, "samplecr");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "testnamespace");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_NAME, "githubsources.sources.knative.dev");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_GROUP, "sources.knative.dev");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_SCOPE, "Namespaced");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_VERSION, "v1alpha1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_PLURAL, "githubsources");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_INSTANCE, githubSourceString);
+        });
+
+        assertFalse(ex.isFailed());
+        assertNull(ex.getException());
+
+        assertNotNull(ex.getMessage());
+        assertNotNull(ex.getMessage().getBody());
+    }
+
     @Test
     @Order(2)
-    public void listTest() throws Exception {
+    void listTest() throws Exception {
         server.expect().get().withPath("/apis/sources.knative.dev/v1alpha1/namespaces/testnamespace/githubsources")
                 .andReturn(200, setupGithubSourceList()).once();
 
@@ -126,14 +143,14 @@ public class KubernetesCustomResourcesProducerTest extends KubernetesTestSupport
         assertFalse(ex.isFailed());
         assertNull(ex.getException());
 
-        List<Map<String, Object>> result = ex.getMessage().getBody(List.class);
+        List<?> result = ex.getMessage().getBody(List.class);
 
         assertEquals(1, result.size());
     }
 
     @Test
     @Order(3)
-    public void listByLabelsTest() throws Exception {
+    void listByLabelsTest() throws Exception {
         server.expect().get()
                 .withPath("/apis/sources.knative.dev/v1alpha1/namespaces/testnamespace/githubsources?labelSelector="
                           + toUrlEncoded("key1=value1,key2=value2"))
@@ -155,14 +172,14 @@ public class KubernetesCustomResourcesProducerTest extends KubernetesTestSupport
         assertFalse(ex.isFailed());
         assertNull(ex.getException());
 
-        List<Map<String, Object>> result = ex.getMessage().getBody(List.class);
+        List<?> result = ex.getMessage().getBody(List.class);
 
         assertEquals(1, result.size());
     }
 
     @Test
     @Order(4)
-    public void deleteTest() throws Exception {
+    void deleteTest() {
         server.expect().post().withPath("/apis/sources.knative.dev/v1alpha1/namespaces/testnamespace/githubsources")
                 .andReturn(200, githubSourceString).once();
         server.expect().delete().withPath("/apis/sources.knative.dev/v1alpha1/namespaces/testnamespace/githubsources/samplecr")
@@ -184,7 +201,7 @@ public class KubernetesCustomResourcesProducerTest extends KubernetesTestSupport
 
     @Test
     @Order(5)
-    public void testListNotFound() {
+    void testListNotFound() {
         server.expect().get().withPath("/apis/sources.knative.dev/v1alpha1/namespaces/testnamespace/githubsources")
                 .andReturn(404, "").once();
         Exchange ex4 = template.request("direct:listCustomResources", exchange -> {
@@ -205,8 +222,6 @@ public class KubernetesCustomResourcesProducerTest extends KubernetesTestSupport
         return new RouteBuilder() {
             @Override
             public void configure() {
-                from("direct:getCustomResource")
-                        .toF("kubernetes-custom-resources:///?kubernetesClient=#kubernetesClient&operation=getCustomResource");
                 from("direct:listCustomResources").toF(
                         "kubernetes-custom-resources:///?kubernetesClient=#kubernetesClient&operation=listCustomResources");
                 from("direct:listCustomResourcesByLabels").toF(
@@ -215,6 +230,8 @@ public class KubernetesCustomResourcesProducerTest extends KubernetesTestSupport
                         "kubernetes-custom-resources:///?kubernetesClient=#kubernetesClient&operation=deleteCustomResource");
                 from("direct:createCustomResource").toF(
                         "kubernetes-custom-resources:///?kubernetesClient=#kubernetesClient&operation=createCustomResource");
+                from("direct:replaceCustomResource").toF(
+                        "kubernetes-custom-resources:///?kubernetesClient=#kubernetesClient&operation=replaceCustomResource");
             }
         };
     }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesDeploymentsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesDeploymentsProducerTest.java
index 230e6a8929e..32354ca1462 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesDeploymentsProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesDeploymentsProducerTest.java
@@ -23,40 +23,44 @@ import java.util.Map;
 import io.fabric8.kubernetes.api.model.apps.Deployment;
 import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;
 import io.fabric8.kubernetes.api.model.apps.DeploymentListBuilder;
+import io.fabric8.kubernetes.api.model.apps.DeploymentSpec;
+import io.fabric8.kubernetes.api.model.apps.DeploymentSpecBuilder;
 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.KubernetesServer;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@EnableKubernetesMockClient
 public class KubernetesDeploymentsProducerTest extends KubernetesTestSupport {
 
-    @RegisterExtension
-    public KubernetesServer server = new KubernetesServer();
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BindToRegistry("kubernetesClient")
     public KubernetesClient getClient() {
-        return server.getClient();
+        return client;
     }
 
     @Test
-    public void listTest() {
+    void listTest() {
         server.expect().withPath("/apis/apps/v1/namespaces/test/deployments")
                 .andReturn(200, new DeploymentListBuilder().addNewItem().and().build()).once();
-        List<Deployment> result = template.requestBody("direct:list", "", List.class);
+        List<?> result = template.requestBody("direct:list", "", List.class);
 
         assertEquals(1, result.size());
     }
 
     @Test
-    public void listByLabelsTest() throws Exception {
+    void listByLabelsTest() throws Exception {
         server.expect()
                 .withPath("/apis/apps/v1/namespaces/test/deployments?labelSelector="
                           + toUrlEncoded("key1=value1,key2=value2"))
@@ -69,13 +73,65 @@ public class KubernetesDeploymentsProducerTest extends KubernetesTestSupport {
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENTS_LABELS, labels);
         });
 
-        List<Deployment> result = ex.getMessage().getBody(List.class);
+        List<?> result = ex.getMessage().getBody(List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void createAndDeleteDeployment() {
+    void createDeployment() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        DeploymentSpec spec = new DeploymentSpecBuilder().withReplicas(13).build();
+        Deployment de1
+                = new DeploymentBuilder().withNewMetadata().withName("de1").withNamespace("test").withLabels(labels).and()
+                        .withSpec(spec).build();
+        server.expect().post().withPath("/apis/apps/v1/namespaces/test/deployments").andReturn(200, de1).once();
+
+        Exchange ex = template.request("direct:createDeployment", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENTS_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_NAME, "de1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_SPEC, spec);
+        });
+
+        Deployment result = ex.getMessage().getBody(Deployment.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("de1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals(13, result.getSpec().getReplicas());
+    }
+
+    @Test
+    void replaceDeployment() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        DeploymentSpec spec = new DeploymentSpecBuilder().withReplicas(13).build();
+        Deployment de1
+                = new DeploymentBuilder().withNewMetadata().withName("de1").withNamespace("test").withLabels(labels).and()
+                        .withSpec(spec).build();
+        server.expect().get().withPath("/apis/apps/v1/namespaces/test/deployments/de1")
+                .andReturn(200,
+                        new DeploymentBuilder().withNewMetadata().withName("de1").withNamespace("test").endMetadata().build())
+                .once();
+        server.expect().put().withPath("/apis/apps/v1/namespaces/test/deployments/de1").andReturn(200, de1).once();
+
+        Exchange ex = template.request("direct:replaceDeployment", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENTS_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_NAME, "de1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_SPEC, spec);
+        });
+
+        Deployment result = ex.getMessage().getBody(Deployment.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("de1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals(13, result.getSpec().getReplicas());
+    }
+
+    @Test
+    void deleteDeployment() {
         Deployment de1 = new DeploymentBuilder().withNewMetadata().withNamespace("test").withName("de1")
                 .withResourceVersion("1").withGeneration(2L).endMetadata().withNewSpec()
                 .withReplicas(0).endSpec().withNewStatus().withReplicas(1).withObservedGeneration(1L).endStatus().build();
@@ -98,7 +154,7 @@ public class KubernetesDeploymentsProducerTest extends KubernetesTestSupport {
     }
 
     @Test
-    public void createScaleAndDeleteDeployment() {
+    void scaleDeployment() {
         server.expect().withPath("/apis/apps/v1/namespaces/test/deployments/de1")
                 .andReturn(200, new DeploymentBuilder().withNewMetadata().withName("de1")
                         .withResourceVersion("1").endMetadata().withNewSpec().withReplicas(5).endSpec().withNewStatus()
@@ -116,7 +172,6 @@ public class KubernetesDeploymentsProducerTest extends KubernetesTestSupport {
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_REPLICAS, 5);
         });
 
-        // Thread.sleep(3000);
         int replicas = ex.getMessage().getBody(Integer.class);
 
         assertEquals(5, replicas);
@@ -135,6 +190,8 @@ public class KubernetesDeploymentsProducerTest extends KubernetesTestSupport {
                         .toF("kubernetes-deployments:///?kubernetesClient=#kubernetesClient&operation=deleteDeployment");
                 from("direct:createDeployment")
                         .toF("kubernetes-deployments:///?kubernetesClient=#kubernetesClient&operation=createDeployment");
+                from("direct:replaceDeployment")
+                        .toF("kubernetes-deployments:///?kubernetesClient=#kubernetesClient&operation=replaceDeployment");
                 from("direct:scaleDeployment")
                         .toF("kubernetes-deployments:///?kubernetesClient=#kubernetesClient&operation=scaleDeployment");
             }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesHPAProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesHPAProducerTest.java
index 17791425bf3..01a4c3d5155 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesHPAProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesHPAProducerTest.java
@@ -24,65 +24,64 @@ import io.fabric8.kubernetes.api.model.PodListBuilder;
 import io.fabric8.kubernetes.api.model.autoscaling.v1.HorizontalPodAutoscaler;
 import io.fabric8.kubernetes.api.model.autoscaling.v1.HorizontalPodAutoscalerBuilder;
 import io.fabric8.kubernetes.api.model.autoscaling.v1.HorizontalPodAutoscalerListBuilder;
+import io.fabric8.kubernetes.api.model.autoscaling.v1.HorizontalPodAutoscalerSpec;
+import io.fabric8.kubernetes.api.model.autoscaling.v1.HorizontalPodAutoscalerSpecBuilder;
 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.Processor;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.KubernetesServer;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@EnableKubernetesMockClient
 public class KubernetesHPAProducerTest extends KubernetesTestSupport {
 
-    @RegisterExtension
-    public KubernetesServer server = new KubernetesServer();
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BindToRegistry("kubernetesClient")
     public KubernetesClient getClient() {
-        return server.getClient();
+        return client;
     }
 
     @Test
-    public void listTest() {
+    void listTest() {
         server.expect().withPath("/apis/autoscaling/v1/namespaces/test/horizontalpodautoscalers")
                 .andReturn(200, new HorizontalPodAutoscalerListBuilder().addNewItem().and().addNewItem().and().addNewItem()
                         .and().build())
                 .once();
-        List<HorizontalPodAutoscaler> result = template.requestBody("direct:list", "", List.class);
+        List<?> result = template.requestBody("direct:list", "", List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void listByLabelsTest() throws Exception {
+    void listByLabelsTest() throws Exception {
         server.expect()
                 .withPath("/apis/autoscaling/v1/namespaces/test/horizontalpodautoscalers?labelSelector="
                           + toUrlEncoded("key1=value1,key2=value2"))
                 .andReturn(200, new PodListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build()).once();
-        Exchange ex = template.request("direct:listByLabels", new Processor() {
-
-            @Override
-            public void process(Exchange exchange) {
-                Map<String, String> labels = new HashMap<>();
-                labels.put("key1", "value1");
-                labels.put("key2", "value2");
-                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_HPA_LABELS, labels);
-            }
+        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_HPA_LABELS, labels);
         });
 
-        List<HorizontalPodAutoscaler> result = ex.getMessage().getBody(List.class);
+        List<?> result = ex.getMessage().getBody(List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void getHPATest() {
+    void getHPATest() {
         HorizontalPodAutoscaler hpa1
                 = new HorizontalPodAutoscalerBuilder().withNewMetadata().withName("hpa1").withNamespace("test").and().build();
         HorizontalPodAutoscaler hpa2
@@ -92,34 +91,81 @@ public class KubernetesHPAProducerTest extends KubernetesTestSupport {
                 .once();
         server.expect().withPath("/apis/autoscaling/v1/namespaces/ns1/horizontalpodautoscalers/hpa2").andReturn(200, hpa2)
                 .once();
-        Exchange ex = template.request("direct:getHPA", new Processor() {
+        Exchange ex = template.request("direct:getHPA", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_HPA_NAME, "hpa1");
+        });
 
-            @Override
-            public void process(Exchange exchange) {
-                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
-                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_HPA_NAME, "hpa1");
-            }
+        HorizontalPodAutoscaler result = ex.getMessage().getBody(HorizontalPodAutoscaler.class);
+
+        assertEquals("hpa1", result.getMetadata().getName());
+    }
+
+    @Test
+    void createHPATest() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        HorizontalPodAutoscalerSpec spec = new HorizontalPodAutoscalerSpecBuilder().withMinReplicas(13).build();
+        HorizontalPodAutoscaler hpa1 = new HorizontalPodAutoscalerBuilder().withNewMetadata().withName("hpa1")
+                .withNamespace("test").withLabels(labels).and()
+                .withSpec(spec).build();
+        server.expect().post().withPath("/apis/autoscaling/v1/namespaces/test/horizontalpodautoscalers").andReturn(200, hpa1)
+                .once();
+
+        Exchange ex = template.request("direct:createHPA", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_HPA_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_HPA_NAME, "hpa1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_HPA_SPEC, spec);
         });
 
         HorizontalPodAutoscaler result = ex.getMessage().getBody(HorizontalPodAutoscaler.class);
 
+        assertEquals("test", result.getMetadata().getNamespace());
         assertEquals("hpa1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals(13, result.getSpec().getMinReplicas());
     }
 
     @Test
-    public void deleteHPATest() {
+    void replaceHPATest() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        HorizontalPodAutoscalerSpec spec = new HorizontalPodAutoscalerSpecBuilder().withMinReplicas(13).build();
+        HorizontalPodAutoscaler hpa1 = new HorizontalPodAutoscalerBuilder().withNewMetadata().withName("hpa1")
+                .withNamespace("test").withLabels(labels).and()
+                .withSpec(spec).build();
+        server.expect().get().withPath("/apis/autoscaling/v1/namespaces/test/horizontalpodautoscalers/hpa1")
+                .andReturn(200, new HorizontalPodAutoscalerBuilder().withNewMetadata().withName("hpa1")
+                        .withNamespace("test").endMetadata().build())
+                .once();
+        server.expect().put().withPath("/apis/autoscaling/v1/namespaces/test/horizontalpodautoscalers/hpa1")
+                .andReturn(200, hpa1)
+                .once();
+
+        Exchange ex = template.request("direct:replaceHPA", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_HPA_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_HPA_NAME, "hpa1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_HPA_SPEC, spec);
+        });
+
+        HorizontalPodAutoscaler result = ex.getMessage().getBody(HorizontalPodAutoscaler.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("hpa1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals(13, result.getSpec().getMinReplicas());
+    }
+
+    @Test
+    void deleteHPATest() {
         HorizontalPodAutoscaler hpa1
                 = new HorizontalPodAutoscalerBuilder().withNewMetadata().withName("hpa1").withNamespace("test").and().build();
         server.expect().withPath("/apis/autoscaling/v1/namespaces/test/horizontalpodautoscalers/hpa1").andReturn(200, hpa1)
                 .once();
 
-        Exchange ex = template.request("direct:deleteHPA", new Processor() {
-
-            @Override
-            public void process(Exchange exchange) {
-                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
-                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_HPA_NAME, "hpa1");
-            }
+        Exchange ex = template.request("direct:deleteHPA", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_HPA_NAME, "hpa1");
         });
 
         boolean podDeleted = ex.getMessage().getBody(Boolean.class);
@@ -136,6 +182,8 @@ public class KubernetesHPAProducerTest extends KubernetesTestSupport {
                 from("direct:listByLabels")
                         .to("kubernetes-hpa:///?kubernetesClient=#kubernetesClient&operation=listHPAByLabels");
                 from("direct:getHPA").to("kubernetes-hpa:///?kubernetesClient=#kubernetesClient&operation=getHPA");
+                from("direct:createHPA").to("kubernetes-hpa:///?kubernetesClient=#kubernetesClient&operation=createHPA");
+                from("direct:replaceHPA").to("kubernetes-hpa:///?kubernetesClient=#kubernetesClient&operation=replaceHPA");
                 from("direct:deleteHPA").to("kubernetes-hpa:///?kubernetesClient=#kubernetesClient&operation=deleteHPA");
             }
         };
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesJobProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesJobProducerTest.java
index 334ea500e48..52696df1e0b 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesJobProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesJobProducerTest.java
@@ -20,45 +20,51 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import io.fabric8.kubernetes.api.model.Secret;
+import io.fabric8.kubernetes.api.model.LabelSelector;
+import io.fabric8.kubernetes.api.model.ObjectMeta;
+import io.fabric8.kubernetes.api.model.PodTemplateSpecBuilder;
 import io.fabric8.kubernetes.api.model.batch.v1.Job;
 import io.fabric8.kubernetes.api.model.batch.v1.JobBuilder;
 import io.fabric8.kubernetes.api.model.batch.v1.JobListBuilder;
+import io.fabric8.kubernetes.api.model.batch.v1.JobSpec;
+import io.fabric8.kubernetes.api.model.batch.v1.JobSpecBuilder;
 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.KubernetesServer;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
+@EnableKubernetesMockClient
 public class KubernetesJobProducerTest extends KubernetesTestSupport {
 
-    @RegisterExtension
-    public KubernetesServer server = new KubernetesServer();
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BindToRegistry("kubernetesClient")
     public KubernetesClient getClient() {
-        return server.getClient();
+        return client;
     }
 
     @Test
-    public void listTest() {
+    void listTest() {
         server.expect().withPath("/apis/batch/v1/namespaces/test/jobs")
                 .andReturn(200, new JobListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
                 .once();
-        List<Secret> result = template.requestBody("direct:list", "", List.class);
+        List<?> result = template.requestBody("direct:list", "", List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void listByLabelsTest() throws Exception {
+    void listByLabelsTest() throws Exception {
         server.expect().withPath("/apis/batch/v1/namespaces/test/jobs?labelSelector=" + toUrlEncoded("key1=value1,key2=value2"))
                 .andReturn(200, new JobListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build()).once();
         Exchange ex = template.request("direct:listByLabels", exchange -> {
@@ -68,13 +74,13 @@ public class KubernetesJobProducerTest extends KubernetesTestSupport {
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_LABELS, labels);
         });
 
-        List<Job> result = ex.getMessage().getBody(List.class);
+        List<?> result = ex.getMessage().getBody(List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void getJobTest() {
+    void getJobTest() {
         Job sc1 = new JobBuilder().withNewMetadata().withName("sc1").withNamespace("test").and().build();
 
         server.expect().withPath("/apis/batch/v1/namespaces/test/jobs/sc1").andReturn(200, sc1).once();
@@ -88,6 +94,73 @@ public class KubernetesJobProducerTest extends KubernetesTestSupport {
         assertNotNull(result);
     }
 
+    @Test
+    void createJobTest() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        JobSpec spec = new JobSpecBuilder().withBackoffLimit(13).build();
+        Job j1 = new JobBuilder().withNewMetadata().withName("j1").withNamespace("test").withLabels(labels).and()
+                .withSpec(spec).build();
+        server.expect().post().withPath("/apis/batch/v1/namespaces/test/jobs").andReturn(200, j1).once();
+
+        Exchange ex = template.request("direct:create", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_NAME, "j1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_SPEC, spec);
+        });
+
+        Job result = ex.getMessage().getBody(Job.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("j1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals(13, result.getSpec().getBackoffLimit());
+    }
+
+    @Test
+    void replaceJobTest() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        JobSpec spec = new JobSpecBuilder().withBackoffLimit(13).withSelector(new LabelSelector())
+                .withTemplate(new PodTemplateSpecBuilder().build()).build();
+        Job j1 = new JobBuilder().withNewMetadata().withName("j1").withNamespace("test").withLabels(labels).and()
+                .withSpec(spec).build();
+        server.expect().get().withPath("/apis/batch/v1/namespaces/test/jobs/j1")
+                .andReturn(200, new JobBuilder().withNewMetadata().withName("j1").withNamespace("test").endMetadata()
+                        .withSpec(new JobSpecBuilder()
+                                .withTemplate(new PodTemplateSpecBuilder().withMetadata(new ObjectMeta()).build()).build())
+                        .build())
+                .times(2);
+        server.expect().put().withPath("/apis/batch/v1/namespaces/test/jobs/j1").andReturn(200, j1).once();
+
+        Exchange ex = template.request("direct:replace", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_NAME, "j1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_SPEC, spec);
+        });
+
+        Job result = ex.getMessage().getBody(Job.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("j1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals(13, result.getSpec().getBackoffLimit());
+    }
+
+    @Test
+    void deleteJobTest() {
+        Job j1 = new JobBuilder().withNewMetadata().withName("j1").withNamespace("test").and().build();
+        server.expect().delete().withPath("/apis/batch/v1/namespaces/test/jobs/j1").andReturn(200, j1)
+                .once();
+
+        Exchange ex = template.request("direct:delete", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_NAME, "j1");
+        });
+
+        assertNotNull(ex.getMessage());
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
@@ -99,6 +172,7 @@ public class KubernetesJobProducerTest extends KubernetesTestSupport {
                 from("direct:listByLabels").to("kubernetes-job:foo?operation=listJobByLabels");
                 from("direct:get").to("kubernetes-job:foo?operation=getJob");
                 from("direct:create").to("kubernetes-job:foo?operation=createJob");
+                from("direct:replace").to("kubernetes-job:foo?operation=replaceJob");
                 from("direct:delete").to("kubernetes-job:foo?operation=deleteJob");
             }
         };
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNamespacesProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNamespacesProducerTest.java
index ac149508f8b..2b99a42a27d 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNamespacesProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNamespacesProducerTest.java
@@ -17,45 +17,48 @@
 package org.apache.camel.component.kubernetes.producer;
 
 import java.util.List;
+import java.util.Map;
 
 import io.fabric8.kubernetes.api.model.Namespace;
 import io.fabric8.kubernetes.api.model.NamespaceBuilder;
 import io.fabric8.kubernetes.api.model.NamespaceListBuilder;
 import io.fabric8.kubernetes.api.model.ObjectMeta;
 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.KubernetesServer;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@EnableKubernetesMockClient
 public class KubernetesNamespacesProducerTest extends KubernetesTestSupport {
 
-    @RegisterExtension
-    public KubernetesServer server = new KubernetesServer();
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BindToRegistry("kubernetesClient")
     public KubernetesClient getClient() {
-        return server.getClient();
+        return client;
     }
 
     @Test
-    public void listTest() {
+    void listTest() {
         server.expect().withPath("/api/v1/namespaces")
                 .andReturn(200, new NamespaceListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
                 .once();
-        List<Namespace> result = template.requestBody("direct:list", "", List.class);
+        List<?> result = template.requestBody("direct:list", "", List.class);
         assertEquals(3, result.size());
     }
 
     @Test
-    public void getNamespace() {
+    void getNamespace() {
         ObjectMeta meta = new ObjectMeta();
         meta.setName("test");
         server.expect().withPath("/api/v1/namespaces/test").andReturn(200, new NamespaceBuilder().withMetadata(meta).build())
@@ -70,7 +73,43 @@ public class KubernetesNamespacesProducerTest extends KubernetesTestSupport {
     }
 
     @Test
-    public void createAndDeleteNamespace() {
+    void createNamespace() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        Namespace ns1 = new NamespaceBuilder().withNewMetadata().withName("ns1").withLabels(labels).endMetadata().build();
+        server.expect().post().withPath("/api/v1/namespaces").andReturn(200, ns1).once();
+
+        Exchange ex = template.request("direct:createNamespace", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "ns1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_LABELS, labels);
+        });
+
+        Namespace result = ex.getMessage().getBody(Namespace.class);
+
+        assertEquals("ns1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+    }
+
+    @Test
+    void replaceNamespace() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        Namespace ns1 = new NamespaceBuilder().withNewMetadata().withName("ns1").withLabels(labels).endMetadata().build();
+        server.expect().get().withPath("/api/v1/namespaces/ns1")
+                .andReturn(200, new NamespaceBuilder().withNewMetadata().withName("ns1").endMetadata().build()).once();
+        server.expect().put().withPath("/api/v1/namespaces/ns1").andReturn(200, ns1).once();
+
+        Exchange ex = template.request("direct:replaceNamespace", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "ns1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_LABELS, labels);
+        });
+
+        Namespace result = ex.getMessage().getBody(Namespace.class);
+
+        assertEquals("ns1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+    }
+
+    @Test
+    void deleteNamespace() {
         Namespace ns1 = new NamespaceBuilder().withNewMetadata().withName("ns1").endMetadata().build();
         server.expect().withPath("/api/v1/namespaces/ns1").andReturn(200, ns1).once();
 
@@ -89,6 +128,10 @@ public class KubernetesNamespacesProducerTest extends KubernetesTestSupport {
             public void configure() {
                 from("direct:list").to("kubernetes-namespaces:///?kubernetesClient=#kubernetesClient&operation=listNamespaces");
                 from("direct:getNs").to("kubernetes-namespaces:///?kubernetesClient=#kubernetesClient&operation=getNamespace");
+                from("direct:createNamespace")
+                        .to("kubernetes-namespaces:///?kubernetesClient=#kubernetesClient&operation=createNamespace");
+                from("direct:replaceNamespace")
+                        .to("kubernetes-namespaces:///?kubernetesClient=#kubernetesClient&operation=replaceNamespace");
                 from("direct:deleteNamespace")
                         .to("kubernetes-namespaces:///?kubernetesClient=#kubernetesClient&operation=deleteNamespace");
             }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNodesProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNodesProducerTest.java
index 3449a712dff..576fd3b1181 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNodesProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNodesProducerTest.java
@@ -27,38 +27,40 @@ import io.fabric8.kubernetes.api.model.NodeSpec;
 import io.fabric8.kubernetes.api.model.NodeSpecBuilder;
 import io.fabric8.kubernetes.api.model.ObjectMeta;
 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.KubernetesServer;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@EnableKubernetesMockClient
 public class KubernetesNodesProducerTest extends KubernetesTestSupport {
 
-    @RegisterExtension
-    public KubernetesServer server = new KubernetesServer();
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BindToRegistry("kubernetesClient")
     public KubernetesClient getClient() {
-        return server.getClient();
+        return client;
     }
 
     @Test
-    public void listTest() {
+    void listTest() {
         server.expect().withPath("/api/v1/nodes").andReturn(200, new NodeListBuilder().addNewItem().and().build()).once();
-        List<Node> result = template.requestBody("direct:list", "", List.class);
+        List<?> result = template.requestBody("direct:list", "", List.class);
 
         assertEquals(1, result.size());
     }
 
     @Test
-    public void listByLabelsTest() throws Exception {
+    void listByLabelsTest() throws Exception {
         server.expect().withPath("/api/v1/nodes?labelSelector=" + toUrlEncoded("key1=value1,key2=value2"))
                 .andReturn(200, new NodeListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build()).once();
         Exchange ex = template.request("direct:listByLabels", exchange -> {
@@ -68,13 +70,13 @@ public class KubernetesNodesProducerTest extends KubernetesTestSupport {
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NODES_LABELS, labels);
         });
 
-        List<Node> result = ex.getMessage().getBody(List.class);
+        List<?> result = ex.getMessage().getBody(List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void createNodeTest() {
+    void createNodeTest() {
         ObjectMeta meta = new ObjectMeta();
         meta.setName("test");
         server.expect().withPath("/api/v1/nodes").andReturn(200, new NodeBuilder().withMetadata(meta).build()).once();
@@ -94,7 +96,29 @@ public class KubernetesNodesProducerTest extends KubernetesTestSupport {
     }
 
     @Test
-    public void deleteNode() {
+    void replaceNodeTest() {
+        ObjectMeta meta = new ObjectMeta();
+        meta.setName("test");
+        server.expect().get().withPath("/api/v1/nodes/test").andReturn(200, new NodeBuilder().build()).once();
+        server.expect().put().withPath("/api/v1/nodes/test").andReturn(200, new NodeBuilder().withMetadata(meta).build())
+                .once();
+        Exchange ex = template.request("direct:replaceNode", exchange -> {
+            Map<String, String> labels = new HashMap<>();
+            labels.put("key1", "value1");
+            labels.put("key2", "value2");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NODES_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NODE_NAME, "test");
+            NodeSpec spec = new NodeSpecBuilder().build();
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NODE_SPEC, spec);
+        });
+
+        Node result = ex.getMessage().getBody(Node.class);
+
+        assertEquals("test", result.getMetadata().getName());
+    }
+
+    @Test
+    void deleteNode() {
         Node node1 = new NodeBuilder().withNewMetadata().withName("node1").withNamespace("test").and().build();
         server.expect().withPath("/api/v1/nodes/node1").andReturn(200, node1).once();
 
@@ -115,6 +139,7 @@ public class KubernetesNodesProducerTest extends KubernetesTestSupport {
                 from("direct:listByLabels")
                         .toF("kubernetes-nodes:///?kubernetesClient=#kubernetesClient&operation=listNodesByLabels");
                 from("direct:createNode").toF("kubernetes-nodes:///?kubernetesClient=#kubernetesClient&operation=createNode");
+                from("direct:replaceNode").toF("kubernetes-nodes:///?kubernetesClient=#kubernetesClient&operation=replaceNode");
                 from("direct:deleteNode").toF("kubernetes-nodes:///?kubernetesClient=#kubernetesClient&operation=deleteNode");
             }
         };
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPersistentVolumesClaimsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPersistentVolumesClaimsProducerTest.java
index 261692c5e05..ab2314c5d24 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPersistentVolumesClaimsProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPersistentVolumesClaimsProducerTest.java
@@ -21,46 +21,49 @@ import java.util.List;
 import java.util.Map;
 
 import io.fabric8.kubernetes.api.model.ObjectMeta;
-import io.fabric8.kubernetes.api.model.PersistentVolume;
 import io.fabric8.kubernetes.api.model.PersistentVolumeClaim;
 import io.fabric8.kubernetes.api.model.PersistentVolumeClaimBuilder;
 import io.fabric8.kubernetes.api.model.PersistentVolumeClaimListBuilder;
+import io.fabric8.kubernetes.api.model.PersistentVolumeClaimSpec;
+import io.fabric8.kubernetes.api.model.PersistentVolumeClaimSpecBuilder;
 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.KubernetesServer;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@EnableKubernetesMockClient
 public class KubernetesPersistentVolumesClaimsProducerTest extends KubernetesTestSupport {
 
-    @RegisterExtension
-    public KubernetesServer server = new KubernetesServer();
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BindToRegistry("kubernetesClient")
     public KubernetesClient getClient() {
-        return server.getClient();
+        return client;
     }
 
     @Test
-    public void listTest() {
+    void listTest() {
         server.expect().withPath("/api/v1/namespaces/test/persistentvolumeclaims")
                 .andReturn(200,
                         new PersistentVolumeClaimListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
                 .once();
-        List<PersistentVolumeClaim> result = template.requestBody("direct:list", "", List.class);
+        List<?> result = template.requestBody("direct:list", "", List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void listByLabelsTest() throws Exception {
+    void listByLabelsTest() throws Exception {
         server.expect()
                 .withPath("/api/v1/namespaces/test/persistentvolumeclaims?labelSelector="
                           + toUrlEncoded("key1=value1,key2=value2"))
@@ -75,12 +78,64 @@ public class KubernetesPersistentVolumesClaimsProducerTest extends KubernetesTes
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUMES_CLAIMS_LABELS, labels);
         });
 
-        List<PersistentVolume> result = ex.getMessage().getBody(List.class);
+        List<?> result = ex.getMessage().getBody(List.class);
         assertEquals(3, result.size());
     }
 
     @Test
-    public void createListAndDeletePersistentVolumeClaim() {
+    void createPersistentVolumeClaim() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        PersistentVolumeClaimSpec spec = new PersistentVolumeClaimSpecBuilder().withVolumeName("SomeVolumeName").build();
+        PersistentVolumeClaim vc1 = new PersistentVolumeClaimBuilder().withNewMetadata().withName("vc1").withNamespace("test")
+                .withLabels(labels).and()
+                .withSpec(spec).build();
+        server.expect().post().withPath("/api/v1/namespaces/test/persistentvolumeclaims").andReturn(200, vc1).once();
+
+        Exchange ex = template.request("direct:create", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUMES_CLAIMS_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUME_CLAIM_NAME, "vc1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUME_CLAIM_SPEC, spec);
+        });
+
+        PersistentVolumeClaim result = ex.getMessage().getBody(PersistentVolumeClaim.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("vc1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals("SomeVolumeName", result.getSpec().getVolumeName());
+    }
+
+    @Test
+    void replacePersistentVolumeClaim() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        PersistentVolumeClaimSpec spec = new PersistentVolumeClaimSpecBuilder().withVolumeName("SomeVolumeName").build();
+        PersistentVolumeClaim vc1 = new PersistentVolumeClaimBuilder().withNewMetadata().withName("vc1").withNamespace("test")
+                .withLabels(labels).and()
+                .withSpec(spec).build();
+        server.expect().get().withPath("/api/v1/namespaces/test/persistentvolumeclaims/vc1")
+                .andReturn(200, new PersistentVolumeClaimBuilder().withNewMetadata().withName("vc1").withNamespace("test")
+                        .endMetadata().build())
+                .once();
+        server.expect().put().withPath("/api/v1/namespaces/test/persistentvolumeclaims/vc1").andReturn(200, vc1).once();
+
+        Exchange ex = template.request("direct:replace", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUMES_CLAIMS_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUME_CLAIM_NAME, "vc1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUME_CLAIM_SPEC, spec);
+        });
+
+        PersistentVolumeClaim result = ex.getMessage().getBody(PersistentVolumeClaim.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("vc1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals("SomeVolumeName", result.getSpec().getVolumeName());
+    }
+
+    @Test
+    void deletePersistentVolumeClaim() {
         ObjectMeta meta = new ObjectMeta();
         meta.setName("pvc1");
         server.expect().withPath("/api/v1/namespaces/test/persistentvolumeclaims/pvc1")
@@ -104,6 +159,10 @@ public class KubernetesPersistentVolumesClaimsProducerTest extends KubernetesTes
                         "kubernetes-persistent-volumes-claims:///?kubernetesClient=#kubernetesClient&operation=listPersistentVolumesClaims");
                 from("direct:listByLabels").to(
                         "kubernetes-persistent-volumes-claims:///?kubernetesClient=#kubernetesClient&operation=listPersistentVolumesClaimsByLabels");
+                from("direct:create").to(
+                        "kubernetes-persistent-volumes-claims:///?kubernetesClient=#kubernetesClient&operation=createPersistentVolumeClaim");
+                from("direct:replace").to(
+                        "kubernetes-persistent-volumes-claims:///?kubernetesClient=#kubernetesClient&operation=replacePersistentVolumeClaim");
                 from("direct:delete").to(
                         "kubernetes-persistent-volumes-claims:///?kubernetesClient=#kubernetesClient&operation=deletePersistentVolumeClaim");
             }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPersistentVolumesProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPersistentVolumesProducerTest.java
index 7013aed2783..b875449d8f9 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPersistentVolumesProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPersistentVolumesProducerTest.java
@@ -20,43 +20,44 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import io.fabric8.kubernetes.api.model.PersistentVolume;
 import io.fabric8.kubernetes.api.model.PersistentVolumeListBuilder;
 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.KubernetesServer;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+@EnableKubernetesMockClient
 public class KubernetesPersistentVolumesProducerTest extends KubernetesTestSupport {
 
-    @RegisterExtension
-    public KubernetesServer server = new KubernetesServer();
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BindToRegistry("kubernetesClient")
     public KubernetesClient getClient() {
-        return server.getClient();
+        return client;
     }
 
     @Test
-    public void listTest() {
+    void listTest() {
         server.expect().withPath("/api/v1/persistentvolumes")
                 .andReturn(200,
                         new PersistentVolumeListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
                 .once();
-        List<PersistentVolume> result = template.requestBody("direct:list", "", List.class);
+        List<?> result = template.requestBody("direct:list", "", List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void listByLabelsTest() throws Exception {
+    void listByLabelsTest() throws Exception {
         server.expect().withPath("/api/v1/persistentvolumes?labelSelector=" + toUrlEncoded("key1=value1,key2=value2"))
                 .andReturn(200,
                         new PersistentVolumeListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
@@ -68,7 +69,7 @@ public class KubernetesPersistentVolumesProducerTest extends KubernetesTestSuppo
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUMES_LABELS, labels);
         });
 
-        List<PersistentVolume> result = ex.getMessage().getBody(List.class);
+        List<?> result = ex.getMessage().getBody(List.class);
 
         assertEquals(3, result.size());
     }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPodsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPodsProducerTest.java
index 80e6db521f5..bfb957f3e8b 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPodsProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPodsProducerTest.java
@@ -23,47 +23,51 @@ import java.util.Map;
 import io.fabric8.kubernetes.api.model.Pod;
 import io.fabric8.kubernetes.api.model.PodBuilder;
 import io.fabric8.kubernetes.api.model.PodListBuilder;
+import io.fabric8.kubernetes.api.model.PodSpec;
+import io.fabric8.kubernetes.api.model.PodSpecBuilder;
 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.KubernetesServer;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@EnableKubernetesMockClient
 public class KubernetesPodsProducerTest extends KubernetesTestSupport {
 
-    @RegisterExtension
-    public KubernetesServer server = new KubernetesServer();
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BindToRegistry("kubernetesClient")
     public KubernetesClient getClient() {
-        return server.getClient();
+        return client;
     }
 
     @Test
-    public void listTest() {
+    void listTest() {
         server.expect().withPath("/api/v1/pods")
                 .andReturn(200, new PodListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build()).once();
         server.expect().withPath("/api/v1/namespaces/test/pods")
                 .andReturn(200, new PodListBuilder().addNewItem().and().addNewItem().and().build()).once();
-        List<Pod> result = template.requestBody("direct:list", "", List.class);
+        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<Pod> resultNamespaced = ex.getMessage().getBody(List.class);
+        List<?> resultNamespace = ex.getMessage().getBody(List.class);
 
-        assertEquals(2, resultNamespaced.size());
+        assertEquals(2, resultNamespace.size());
     }
 
     @Test
-    public void listByLabelsTest() throws Exception {
+    void listByLabelsTest() throws Exception {
         server.expect().withPath("/api/v1/pods?labelSelector=" + toUrlEncoded("key1=value1,key2=value2"))
                 .andReturn(200, new PodListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build()).once();
         Exchange ex = template.request("direct:listByLabels", exchange -> {
@@ -73,13 +77,13 @@ public class KubernetesPodsProducerTest extends KubernetesTestSupport {
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_PODS_LABELS, labels);
         });
 
-        List<Pod> result = ex.getMessage().getBody(List.class);
+        List<?> result = ex.getMessage().getBody(List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void getPodTest() {
+    void getPodTest() {
         Pod pod1 = new PodBuilder().withNewMetadata().withName("pod1").withNamespace("test").and().build();
         Pod pod2 = new PodBuilder().withNewMetadata().withName("pod2").withNamespace("ns1").and().build();
 
@@ -96,7 +100,56 @@ public class KubernetesPodsProducerTest extends KubernetesTestSupport {
     }
 
     @Test
-    public void deletePod() {
+    void createPod() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        PodSpec spec = new PodSpecBuilder().withHostname("SomeHostname").build();
+        Pod pod1 = new PodBuilder().withNewMetadata().withName("pod1").withNamespace("test").withLabels(labels).and()
+                .withSpec(spec).build();
+        server.expect().post().withPath("/api/v1/namespaces/test/pods").andReturn(200, pod1).once();
+
+        Exchange ex = template.request("direct:createPod", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_PODS_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_POD_NAME, "pod1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_POD_SPEC, spec);
+        });
+
+        Pod result = ex.getMessage().getBody(Pod.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("pod1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals("SomeHostname", result.getSpec().getHostname());
+    }
+
+    @Test
+    void replacePod() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        PodSpec spec = new PodSpecBuilder().withHostname("SomeHostname").build();
+        Pod pod1 = new PodBuilder().withNewMetadata().withName("pod1").withNamespace("test").withLabels(labels).and()
+                .withSpec(spec).build();
+        server.expect().get().withPath("/api/v1/namespaces/test/pods/pod1")
+                .andReturn(200, new PodBuilder().withNewMetadata().withName("pod1").withNamespace("test").endMetadata().build())
+                .once();
+        server.expect().put().withPath("/api/v1/namespaces/test/pods/pod1").andReturn(200, pod1).once();
+
+        Exchange ex = template.request("direct:replacePod", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_PODS_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_POD_NAME, "pod1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_POD_SPEC, spec);
+        });
+
+        Pod result = ex.getMessage().getBody(Pod.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("pod1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals("SomeHostname", result.getSpec().getHostname());
+    }
+
+    @Test
+    void deletePod() {
         Pod pod1 = new PodBuilder().withNewMetadata().withName("pod1").withNamespace("test").and().build();
         server.expect().withPath("/api/v1/namespaces/test/pods/pod1").andReturn(200, pod1).once();
 
@@ -119,6 +172,8 @@ public class KubernetesPodsProducerTest extends KubernetesTestSupport {
                 from("direct:listByLabels")
                         .to("kubernetes-pods:///?kubernetesClient=#kubernetesClient&operation=listPodsByLabels");
                 from("direct:getPod").to("kubernetes-pods:///?kubernetesClient=#kubernetesClient&operation=getPod");
+                from("direct:createPod").to("kubernetes-pods:///?kubernetesClient=#kubernetesClient&operation=createPod");
+                from("direct:replacePod").to("kubernetes-pods:///?kubernetesClient=#kubernetesClient&operation=replacePod");
                 from("direct:deletePod").to("kubernetes-pods:///?kubernetesClient=#kubernetesClient&operation=deletePod");
             }
         };
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesReplicationControllersProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesReplicationControllersProducerTest.java
index ffd87f95bc3..c3538678b59 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesReplicationControllersProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesReplicationControllersProducerTest.java
@@ -24,44 +24,48 @@ import java.util.concurrent.TimeUnit;
 import io.fabric8.kubernetes.api.model.ReplicationController;
 import io.fabric8.kubernetes.api.model.ReplicationControllerBuilder;
 import io.fabric8.kubernetes.api.model.ReplicationControllerListBuilder;
+import io.fabric8.kubernetes.api.model.ReplicationControllerSpec;
+import io.fabric8.kubernetes.api.model.ReplicationControllerSpecBuilder;
 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.KubernetesServer;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.awaitility.Awaitility;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@EnableKubernetesMockClient
 public class KubernetesReplicationControllersProducerTest extends KubernetesTestSupport {
 
-    @RegisterExtension
-    public KubernetesServer server = new KubernetesServer();
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BindToRegistry("kubernetesClient")
     public KubernetesClient getClient() {
-        return server.getClient();
+        return client;
     }
 
     @Test
-    public void listTest() {
+    void listTest() {
         server.expect().withPath("/api/v1/replicationcontrollers")
                 .andReturn(200,
                         new ReplicationControllerListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
                 .once();
-        List<ReplicationController> result = template.requestBody("direct:list", "", List.class);
+        List<?> result = template.requestBody("direct:list", "", List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void listByLabelsTest() throws Exception {
+    void listByLabelsTest() throws Exception {
         server.expect().withPath("/api/v1/replicationcontrollers?labelSelector=" + toUrlEncoded("key1=value1,key2=value2"))
                 .andReturn(200,
                         new ReplicationControllerListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
@@ -73,13 +77,13 @@ public class KubernetesReplicationControllersProducerTest extends KubernetesTest
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLERS_LABELS, labels);
         });
 
-        List<ReplicationController> result = ex.getMessage().getBody(List.class);
+        List<?> result = ex.getMessage().getBody(List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void getReplicationControllerTest() {
+    void getReplicationControllerTest() {
         ReplicationController rc1
                 = new ReplicationControllerBuilder().withNewMetadata().withName("rc1").withNamespace("test").and().build();
 
@@ -95,7 +99,59 @@ public class KubernetesReplicationControllersProducerTest extends KubernetesTest
     }
 
     @Test
-    public void createAndDeleteReplicationController() {
+    void createReplicationController() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        ReplicationControllerSpec spec = new ReplicationControllerSpecBuilder().withReplicas(13).build();
+        ReplicationController rc1 = new ReplicationControllerBuilder().withNewMetadata().withName("rc1").withNamespace("test")
+                .withLabels(labels).and()
+                .withSpec(spec).build();
+        server.expect().post().withPath("/api/v1/namespaces/test/replicationcontrollers").andReturn(200, rc1).once();
+
+        Exchange ex = template.request("direct:createReplicationController", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLERS_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLER_NAME, "rc1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLER_SPEC, spec);
+        });
+
+        ReplicationController result = ex.getMessage().getBody(ReplicationController.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("rc1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals(13, result.getSpec().getReplicas());
+    }
+
+    @Test
+    void replaceReplicationController() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        ReplicationControllerSpec spec = new ReplicationControllerSpecBuilder().withReplicas(13).build();
+        ReplicationController rc1 = new ReplicationControllerBuilder().withNewMetadata().withName("rc1").withNamespace("test")
+                .withLabels(labels).and()
+                .withSpec(spec).build();
+        server.expect().get().withPath("/api/v1/namespaces/test/replicationcontrollers/rc1")
+                .andReturn(200, new ReplicationControllerBuilder().withNewMetadata().withName("rc1").withNamespace("test")
+                        .endMetadata().build())
+                .once();
+        server.expect().put().withPath("/api/v1/namespaces/test/replicationcontrollers/rc1").andReturn(200, rc1).once();
+
+        Exchange ex = template.request("direct:replaceReplicationController", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLERS_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLER_NAME, "rc1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLER_SPEC, spec);
+        });
+
+        ReplicationController result = ex.getMessage().getBody(ReplicationController.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("rc1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals(13, result.getSpec().getReplicas());
+    }
+
+    @Test
+    void deleteReplicationController() {
         server.expect().withPath("/api/v1/namespaces/test/replicationcontrollers/repl1")
                 .andReturn(200, new ReplicationControllerBuilder().withNewMetadata().withName("repl1")
                         .withResourceVersion("1").endMetadata().withNewSpec().withReplicas(0).endSpec().withNewStatus()
@@ -119,7 +175,7 @@ public class KubernetesReplicationControllersProducerTest extends KubernetesTest
     }
 
     @Test
-    public void createScaleAndDeleteReplicationController() {
+    void scaleReplicationController() {
         server.expect().withPath("/api/v1/namespaces/test/replicationcontrollers/repl1")
                 .andReturn(200, new ReplicationControllerBuilder().withNewMetadata().withName("repl1")
                         .withResourceVersion("1").endMetadata().withNewSpec().withReplicas(5).endSpec().withNewStatus()
@@ -152,10 +208,12 @@ public class KubernetesReplicationControllersProducerTest extends KubernetesTest
                         "kubernetes-replication-controllers:///?kubernetesClient=#kubernetesClient&operation=listReplicationControllersByLabels");
                 from("direct:getReplicationController").to(
                         "kubernetes-replication-controllers:///?kubernetesClient=#kubernetesClient&operation=getReplicationController");
-                from("direct:createReplicationController").to(
-                        "kubernetes-replication-controllers:///?kubernetesClient=#kubernetesClient&operation=createReplicationController");
                 from("direct:scaleReplicationController").to(
                         "kubernetes-replication-controllers:///?kubernetesClient=#kubernetesClient&operation=scaleReplicationController");
+                from("direct:createReplicationController").to(
+                        "kubernetes-replication-controllers:///?kubernetesClient=#kubernetesClient&operation=createReplicationController");
+                from("direct:replaceReplicationController").to(
+                        "kubernetes-replication-controllers:///?kubernetesClient=#kubernetesClient&operation=replaceReplicationController");
                 from("direct:deleteReplicationController").to(
                         "kubernetes-replication-controllers:///?kubernetesClient=#kubernetesClient&operation=deleteReplicationController");
             }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesResourcesQuotaProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesResourcesQuotaProducerTest.java
index 9cf7fa36522..9834c295c9f 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesResourcesQuotaProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesResourcesQuotaProducerTest.java
@@ -17,45 +17,101 @@
 package org.apache.camel.component.kubernetes.producer;
 
 import java.util.List;
+import java.util.Map;
 
 import io.fabric8.kubernetes.api.model.ResourceQuota;
 import io.fabric8.kubernetes.api.model.ResourceQuotaBuilder;
 import io.fabric8.kubernetes.api.model.ResourceQuotaListBuilder;
+import io.fabric8.kubernetes.api.model.ResourceQuotaSpec;
+import io.fabric8.kubernetes.api.model.ResourceQuotaSpecBuilder;
 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.KubernetesServer;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@EnableKubernetesMockClient
 public class KubernetesResourcesQuotaProducerTest extends KubernetesTestSupport {
 
-    @RegisterExtension
-    public KubernetesServer server = new KubernetesServer();
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BindToRegistry("kubernetesClient")
     public KubernetesClient getClient() {
-        return server.getClient();
+        return client;
     }
 
     @Test
-    public void listTest() {
+    void listTest() {
         server.expect().withPath("/api/v1/resourcequotas")
                 .andReturn(200, new ResourceQuotaListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
                 .once();
-        List<ResourceQuota> result = template.requestBody("direct:list", "", List.class);
+        List<?> result = template.requestBody("direct:list", "", List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void deleteResourceQuota() {
+    void createResourceQuota() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        ResourceQuotaSpec spec = new ResourceQuotaSpecBuilder().withScopes("SomeScope").build();
+        ResourceQuota rq1
+                = new ResourceQuotaBuilder().withNewMetadata().withName("rq1").withNamespace("test").withLabels(labels).and()
+                        .withSpec(spec).build();
+        server.expect().post().withPath("/api/v1/namespaces/test/resourcequotas").andReturn(200, rq1).once();
+
+        Exchange ex = template.request("direct:create", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_RESOURCES_QUOTA_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_RESOURCES_QUOTA_NAME, "rq1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_RESOURCE_QUOTA_SPEC, spec);
+        });
+
+        ResourceQuota result = ex.getMessage().getBody(ResourceQuota.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("rq1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals(List.of("SomeScope"), result.getSpec().getScopes());
+    }
+
+    @Test
+    void replaceResourceQuota() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        ResourceQuotaSpec spec = new ResourceQuotaSpecBuilder().withScopes("SomeScope").build();
+        ResourceQuota rq1
+                = new ResourceQuotaBuilder().withNewMetadata().withName("rq1").withNamespace("test").withLabels(labels).and()
+                        .withSpec(spec).build();
+        server.expect().get().withPath("/api/v1/namespaces/test/resourcequotas/rq1").andReturn(200,
+                new ResourceQuotaBuilder().withNewMetadata().withName("rq1").withNamespace("test").endMetadata().build())
+                .once();
+        server.expect().put().withPath("/api/v1/namespaces/test/resourcequotas/rq1").andReturn(200, rq1).once();
+
+        Exchange ex = template.request("direct:replace", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_RESOURCES_QUOTA_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_RESOURCES_QUOTA_NAME, "rq1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_RESOURCE_QUOTA_SPEC, spec);
+        });
+
+        ResourceQuota result = ex.getMessage().getBody(ResourceQuota.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("rq1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals(List.of("SomeScope"), result.getSpec().getScopes());
+    }
+
+    @Test
+    void deleteResourceQuota() {
         ResourceQuota rq1 = new ResourceQuotaBuilder().withNewMetadata().withName("rq1").withNamespace("test").and().build();
         server.expect().withPath("/api/v1/namespaces/test/resourcequotas/rq1").andReturn(200, rq1).once();
 
@@ -76,6 +132,10 @@ public class KubernetesResourcesQuotaProducerTest extends KubernetesTestSupport
             public void configure() {
                 from("direct:list")
                         .to("kubernetes-resources-quota:///?kubernetesClient=#kubernetesClient&operation=listResourcesQuota");
+                from("direct:create")
+                        .to("kubernetes-resources-quota:///?kubernetesClient=#kubernetesClient&operation=createResourceQuota");
+                from("direct:replace")
+                        .to("kubernetes-resources-quota:///?kubernetesClient=#kubernetesClient&operation=replaceResourceQuota");
                 from("direct:delete")
                         .to("kubernetes-resources-quota:///?kubernetesClient=#kubernetesClient&operation=deleteResourceQuota");
             }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesSecretsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesSecretsProducerTest.java
index 363a9ffd3d3..f2257bfae5c 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesSecretsProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesSecretsProducerTest.java
@@ -24,41 +24,43 @@ import io.fabric8.kubernetes.api.model.Secret;
 import io.fabric8.kubernetes.api.model.SecretBuilder;
 import io.fabric8.kubernetes.api.model.SecretListBuilder;
 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.KubernetesServer;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@EnableKubernetesMockClient
 public class KubernetesSecretsProducerTest extends KubernetesTestSupport {
 
-    @RegisterExtension
-    public KubernetesServer server = new KubernetesServer();
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BindToRegistry("kubernetesClient")
     public KubernetesClient getClient() {
-        return server.getClient();
+        return client;
     }
 
     @Test
-    public void listTest() {
+    void listTest() {
         server.expect().withPath("/api/v1/secrets")
                 .andReturn(200, new SecretListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
                 .once();
-        List<Secret> result = template.requestBody("direct:list", "", List.class);
+        List<?> result = template.requestBody("direct:list", "", List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void listByLabelsTest() throws Exception {
+    void listByLabelsTest() throws Exception {
         server.expect().withPath("/api/v1/secrets?labelSelector=" + toUrlEncoded("key1=value1,key2=value2"))
                 .andReturn(200, new SecretListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
                 .once();
@@ -69,13 +71,13 @@ public class KubernetesSecretsProducerTest extends KubernetesTestSupport {
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SECRETS_LABELS, labels);
         });
 
-        List<Secret> result = ex.getMessage().getBody(List.class);
+        List<?> result = ex.getMessage().getBody(List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void getSecretTest() {
+    void getSecretTest() {
         Secret sc1 = new SecretBuilder().withNewMetadata().withName("sc1").withNamespace("test").and().build();
 
         server.expect().withPath("/api/v1/namespaces/test/secrets/sc1").andReturn(200, sc1).once();
@@ -90,7 +92,40 @@ public class KubernetesSecretsProducerTest extends KubernetesTestSupport {
     }
 
     @Test
-    public void createAndDeleteSecret() {
+    void createSecret() {
+        Secret sc1 = new SecretBuilder().withNewMetadata().withName("sc1").withNamespace("test").and().build();
+        server.expect().post().withPath("/api/v1/namespaces/test/secrets").andReturn(200, sc1).once();
+
+        Exchange ex = template.request("direct:create", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SECRET, sc1);
+        });
+
+        Secret result = ex.getMessage().getBody(Secret.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("sc1", result.getMetadata().getName());
+    }
+
+    @Test
+    void replaceSecret() {
+        Secret sc1 = new SecretBuilder().withNewMetadata().withName("sc1").withNamespace("test").and().build();
+        server.expect().get().withPath("/api/v1/namespaces/test/secrets/sc1").andReturn(200, sc1).once();
+        server.expect().put().withPath("/api/v1/namespaces/test/secrets/sc1").andReturn(200, sc1).once();
+
+        Exchange ex = template.request("direct:replace", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SECRET, sc1);
+        });
+
+        Secret result = ex.getMessage().getBody(Secret.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("sc1", result.getMetadata().getName());
+    }
+
+    @Test
+    void deleteSecret() {
         Secret sc1 = new SecretBuilder().withNewMetadata().withName("sc1").withNamespace("test").and().build();
 
         server.expect().withPath("/api/v1/namespaces/test/secrets/sc1").andReturn(200, sc1).once();
@@ -114,6 +149,7 @@ public class KubernetesSecretsProducerTest extends KubernetesTestSupport {
                         .to("kubernetes-secrets:///?kubernetesClient=#kubernetesClient&operation=listSecretsByLabels");
                 from("direct:get").to("kubernetes-secrets:///?kubernetesClient=#kubernetesClient&operation=getSecret");
                 from("direct:create").to("kubernetes-secrets:///?kubernetesClient=#kubernetesClient&operation=createSecret");
+                from("direct:replace").to("kubernetes-secrets:///?kubernetesClient=#kubernetesClient&operation=replaceSecret");
                 from("direct:delete").to("kubernetes-secrets:///?kubernetesClient=#kubernetesClient&operation=deleteSecret");
             }
         };
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesServiceAccountsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesServiceAccountsProducerTest.java
index bd54fff8a57..96e3880677a 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesServiceAccountsProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesServiceAccountsProducerTest.java
@@ -24,41 +24,43 @@ import io.fabric8.kubernetes.api.model.ServiceAccount;
 import io.fabric8.kubernetes.api.model.ServiceAccountBuilder;
 import io.fabric8.kubernetes.api.model.ServiceAccountListBuilder;
 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.KubernetesServer;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@EnableKubernetesMockClient
 public class KubernetesServiceAccountsProducerTest extends KubernetesTestSupport {
 
-    @RegisterExtension
-    public KubernetesServer server = new KubernetesServer();
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BindToRegistry("kubernetesClient")
     public KubernetesClient getClient() {
-        return server.getClient();
+        return client;
     }
 
     @Test
-    public void listTest() {
+    void listTest() {
         server.expect().withPath("/api/v1/serviceaccounts")
                 .andReturn(200,
                         new ServiceAccountListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
                 .once();
-        List<ServiceAccount> result = template.requestBody("direct:list", "", List.class);
+        List<?> result = template.requestBody("direct:list", "", List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void listByLabelsTest() throws Exception {
+    void listByLabelsTest() throws Exception {
         server.expect().withPath("/api/v1/serviceaccounts?labelSelector=" + toUrlEncoded("key1=value1,key2=value2"))
                 .andReturn(200,
                         new ServiceAccountListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
@@ -70,16 +72,49 @@ public class KubernetesServiceAccountsProducerTest extends KubernetesTestSupport
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SERVICE_ACCOUNTS_LABELS, labels);
         });
 
-        List<ServiceAccount> result = ex.getMessage().getBody(List.class);
+        List<?> result = ex.getMessage().getBody(List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void createAndDeleteServiceAccount() {
-        ServiceAccount pod1 = new ServiceAccountBuilder().withNewMetadata().withName("sa1").withNamespace("test").and().build();
+    void createServiceAccount() {
+        ServiceAccount sa1 = new ServiceAccountBuilder().withNewMetadata().withName("sa1").withNamespace("test").and().build();
+        server.expect().post().withPath("/api/v1/namespaces/test/serviceaccounts").andReturn(200, sa1).once();
 
-        server.expect().withPath("/api/v1/namespaces/test/serviceaccounts/sa1").andReturn(200, pod1).once();
+        Exchange ex = template.request("direct:create", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SERVICE_ACCOUNT, sa1);
+        });
+
+        ServiceAccount result = ex.getMessage().getBody(ServiceAccount.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("sa1", result.getMetadata().getName());
+    }
+
+    @Test
+    void replaceServiceAccount() {
+        ServiceAccount sa1 = new ServiceAccountBuilder().withNewMetadata().withName("sa1").withNamespace("test").and().build();
+        server.expect().get().withPath("/api/v1/namespaces/test/serviceaccounts/sa1").andReturn(200, sa1).once();
+        server.expect().put().withPath("/api/v1/namespaces/test/serviceaccounts/sa1").andReturn(200, sa1).once();
+
+        Exchange ex = template.request("direct:replace", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SERVICE_ACCOUNT, sa1);
+        });
+
+        ServiceAccount result = ex.getMessage().getBody(ServiceAccount.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("sa1", result.getMetadata().getName());
+    }
+
+    @Test
+    void deleteServiceAccount() {
+        ServiceAccount sa1 = new ServiceAccountBuilder().withNewMetadata().withName("sa1").withNamespace("test").and().build();
+
+        server.expect().withPath("/api/v1/namespaces/test/serviceaccounts/sa1").andReturn(200, sa1).once();
         Exchange ex = template.request("direct:delete", exchange -> {
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SERVICE_ACCOUNT_NAME, "sa1");
@@ -99,6 +134,10 @@ public class KubernetesServiceAccountsProducerTest extends KubernetesTestSupport
                         .to("kubernetes-service-accounts:///?kubernetesClient=#kubernetesClient&operation=listServiceAccounts");
                 from("direct:listByLabels").to(
                         "kubernetes-service-accounts:///?kubernetesClient=#kubernetesClient&operation=listServiceAccountsByLabels");
+                from("direct:create").to(
+                        "kubernetes-service-accounts:///?kubernetesClient=#kubernetesClient&operation=createServiceAccount");
+                from("direct:replace").to(
+                        "kubernetes-service-accounts:///?kubernetesClient=#kubernetesClient&operation=replaceServiceAccount");
                 from("direct:delete").to(
                         "kubernetes-service-accounts:///?kubernetesClient=#kubernetesClient&operation=deleteServiceAccount");
             }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesServicesProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesServicesProducerTest.java
index 64163fae41b..e6753286747 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesServicesProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesServicesProducerTest.java
@@ -24,42 +24,46 @@ import io.fabric8.kubernetes.api.model.PodListBuilder;
 import io.fabric8.kubernetes.api.model.Service;
 import io.fabric8.kubernetes.api.model.ServiceBuilder;
 import io.fabric8.kubernetes.api.model.ServiceListBuilder;
+import io.fabric8.kubernetes.api.model.ServiceSpec;
+import io.fabric8.kubernetes.api.model.ServiceSpecBuilder;
 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.KubernetesServer;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@EnableKubernetesMockClient
 public class KubernetesServicesProducerTest extends KubernetesTestSupport {
 
-    @RegisterExtension
-    public KubernetesServer server = new KubernetesServer();
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BindToRegistry("kubernetesClient")
     public KubernetesClient getClient() {
-        return server.getClient();
+        return client;
     }
 
     @Test
-    public void listTest() {
+    void listTest() {
         server.expect().withPath("/api/v1/services")
                 .andReturn(200, new ServiceListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
                 .once();
-        List<Service> result = template.requestBody("direct:list", "", List.class);
+        List<?> result = template.requestBody("direct:list", "", List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void listByLabelsTest() throws Exception {
+    void listByLabelsTest() throws Exception {
         server.expect().withPath("/api/v1/services?labelSelector=" + toUrlEncoded("key1=value1,key2=value2"))
                 .andReturn(200, new PodListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build()).once();
         Exchange ex = template.request("direct:listByLabels", exchange -> {
@@ -69,12 +73,12 @@ public class KubernetesServicesProducerTest extends KubernetesTestSupport {
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SERVICE_LABELS, labels);
         });
 
-        List<Service> result = ex.getMessage().getBody(List.class);
+        List<?> result = ex.getMessage().getBody(List.class);
         assertEquals(3, result.size());
     }
 
     @Test
-    public void getServiceTest() {
+    void getServiceTest() {
         Service se1 = new ServiceBuilder().withNewMetadata().withName("se1").withNamespace("test").and().build();
 
         server.expect().withPath("/api/v1/namespaces/test/services/se1").andReturn(200, se1).once();
@@ -89,7 +93,57 @@ public class KubernetesServicesProducerTest extends KubernetesTestSupport {
     }
 
     @Test
-    public void createAndDeleteService() {
+    void createService() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        ServiceSpec spec = new ServiceSpecBuilder().withClusterIP("SomeClusterIp").build();
+        Service se1 = new ServiceBuilder().withNewMetadata().withName("se1").withNamespace("test").withLabels(labels).and()
+                .withSpec(spec).build();
+        server.expect().post().withPath("/api/v1/namespaces/test/services").andReturn(200, se1).once();
+
+        Exchange ex = template.request("direct:createService", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SERVICE_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SERVICE_NAME, "se1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SERVICE_SPEC, spec);
+        });
+
+        Service result = ex.getMessage().getBody(Service.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("se1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals("SomeClusterIp", result.getSpec().getClusterIP());
+    }
+
+    @Test
+    void replaceService() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        ServiceSpec spec = new ServiceSpecBuilder().withExternalName("SomeExternalName").build();
+        Service se1 = new ServiceBuilder().withNewMetadata().withName("se1").withNamespace("test").withLabels(labels).and()
+                .withSpec(spec).build();
+        server.expect().get().withPath("/api/v1/namespaces/test/services/se1")
+                .andReturn(200, new ServiceBuilder().withNewMetadata().withName("se1").withNamespace("test").and()
+                        .withSpec(new ServiceSpecBuilder().withClusterIP("SomeClusterIp").build()).build())
+                .times(2);
+        server.expect().put().withPath("/api/v1/namespaces/test/services/se1").andReturn(200, se1).once();
+
+        Exchange ex = template.request("direct:replaceService", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SERVICE_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SERVICE_NAME, "se1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SERVICE_SPEC, spec);
+        });
+
+        Service result = ex.getMessage().getBody(Service.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("se1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals("SomeExternalName", result.getSpec().getExternalName());
+    }
+
+    @Test
+    void deleteService() {
         Service se1 = new ServiceBuilder().withNewMetadata().withName("se1").withNamespace("test").and().build();
 
         server.expect().withPath("/api/v1/namespaces/test/services/se1").andReturn(200, se1).once();
@@ -114,6 +168,10 @@ public class KubernetesServicesProducerTest extends KubernetesTestSupport {
                         .to("kubernetes-services:///?kubernetesClient=#kubernetesClient&operation=listServicesByLabels");
                 from("direct:getServices")
                         .to("kubernetes-services:///?kubernetesClient=#kubernetesClient&operation=getService");
+                from("direct:createService")
+                        .to("kubernetes-services:///?kubernetesClient=#kubernetesClient&operation=createService");
+                from("direct:replaceService")
+                        .to("kubernetes-services:///?kubernetesClient=#kubernetesClient&operation=replaceService");
                 from("direct:deleteService")
                         .to("kubernetes-services:///?kubernetesClient=#kubernetesClient&operation=deleteService");
             }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapMountPropertiesFunctionTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapMountPropertiesFunctionTest.java
index 63606f17641..5f74a2f6340 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapMountPropertiesFunctionTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapMountPropertiesFunctionTest.java
@@ -29,25 +29,24 @@ public class ConfigMapMountPropertiesFunctionTest extends KubernetesTestSupport
     @Test
     @Order(1)
     public void configMapMountPropertiesFunction() throws Exception {
-        ConfigMapPropertiesFunction cmf = new ConfigMapPropertiesFunction();
-        cmf.setClientEnabled(false);
-        cmf.setMountPathConfigMaps("src/test/resources/");
-        cmf.setCamelContext(context);
-        cmf.start();
+        try (ConfigMapPropertiesFunction cmf = new ConfigMapPropertiesFunction()) {
+            cmf.setClientEnabled(false);
+            cmf.setMountPathConfigMaps("src/test/resources/");
+            cmf.setCamelContext(context);
+            cmf.start();
 
-        String out = cmf.apply("myconfig/foo");
-        Assertions.assertEquals("456", out);
+            String out = cmf.apply("myconfig/foo");
+            Assertions.assertEquals("456", out);
 
-        out = cmf.apply("myconfig/unknown");
-        Assertions.assertNull(out);
+            out = cmf.apply("myconfig/unknown");
+            Assertions.assertNull(out);
 
-        out = cmf.apply("myconfig/unknown:444");
-        Assertions.assertEquals("444", out);
+            out = cmf.apply("myconfig/unknown:444");
+            Assertions.assertEquals("444", out);
 
-        out = cmf.apply("myconfig/bar");
-        Assertions.assertEquals("Jacks Bar", out);
-
-        cmf.stop();
+            out = cmf.apply("myconfig/bar");
+            Assertions.assertEquals("Jacks Bar", out);
+        }
     }
 
 }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionRouteTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionRouteTest.java
index 9dd34684da5..764fb073cab 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionRouteTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionRouteTest.java
@@ -21,8 +21,8 @@ import java.util.Map;
 import io.fabric8.kubernetes.api.model.ConfigMap;
 import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
 import io.fabric8.kubernetes.client.ConfigBuilder;
-import io.fabric8.kubernetes.client.DefaultKubernetesClient;
 import io.fabric8.kubernetes.client.KubernetesClient;
+import io.fabric8.kubernetes.client.KubernetesClientBuilder;
 import org.apache.camel.CamelContext;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
@@ -64,7 +64,7 @@ public class ConfigMapPropertiesFunctionRouteTest extends KubernetesTestSupport
         ConfigBuilder builder = new ConfigBuilder();
         builder.withOauthToken(authToken);
         builder.withMasterUrl(host);
-        client = new DefaultKubernetesClient(builder.build());
+        client = new KubernetesClientBuilder().withConfig(builder.build()).build();
         context.getRegistry().bind("KubernetesClient", client);
 
         Map<String, String> data = Map.of("foo", "123", "bar", "Moes Bar");
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionTest.java
index bf687d3716a..dab7c355f08 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionTest.java
@@ -21,8 +21,8 @@ import java.util.Map;
 import io.fabric8.kubernetes.api.model.ConfigMap;
 import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
 import io.fabric8.kubernetes.client.ConfigBuilder;
-import io.fabric8.kubernetes.client.DefaultKubernetesClient;
 import io.fabric8.kubernetes.client.KubernetesClient;
+import io.fabric8.kubernetes.client.KubernetesClientBuilder;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.MethodOrderer;
@@ -47,14 +47,13 @@ public class ConfigMapPropertiesFunctionTest extends KubernetesTestSupport {
         builder.withOauthToken(authToken);
         builder.withMasterUrl(host);
 
-        KubernetesClient client = new DefaultKubernetesClient(builder.build());
+        KubernetesClient client = new KubernetesClientBuilder().withConfig(builder.build()).build();
 
         Map<String, String> data = Map.of("foo", "123", "bar", "Moes Bar");
         ConfigMap cm = new ConfigMapBuilder().editOrNewMetadata().withName("myconfig").endMetadata().withData(data).build();
         client.resource(cm).createOrReplace();
 
-        try {
-            ConfigMapPropertiesFunction cmf = new ConfigMapPropertiesFunction();
+        try (ConfigMapPropertiesFunction cmf = new ConfigMapPropertiesFunction()) {
             cmf.setClient(client);
             cmf.setCamelContext(context);
             cmf.start();
@@ -70,8 +69,6 @@ public class ConfigMapPropertiesFunctionTest extends KubernetesTestSupport {
 
             out = cmf.apply("myconfig/bar");
             Assertions.assertEquals("Moes Bar", out);
-
-            cmf.stop();
         } finally {
             client.resource(cm).delete();
         }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretMountPropertiesFunctionTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretMountPropertiesFunctionTest.java
index fa6e88f1c75..a60fbe77874 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretMountPropertiesFunctionTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretMountPropertiesFunctionTest.java
@@ -29,25 +29,24 @@ public class SecretMountPropertiesFunctionTest extends KubernetesTestSupport {
     @Test
     @Order(1)
     public void secretMountPropertiesFunction() throws Exception {
-        SecretPropertiesFunction cmf = new SecretPropertiesFunction();
-        cmf.setMountPathSecrets("src/test/resources/");
-        cmf.setClientEnabled(false);
-        cmf.setCamelContext(context);
-        cmf.start();
+        try (SecretPropertiesFunction cmf = new SecretPropertiesFunction()) {
+            cmf.setMountPathSecrets("src/test/resources/");
+            cmf.setClientEnabled(false);
+            cmf.setCamelContext(context);
+            cmf.start();
 
-        String out = cmf.apply("mysecret/myuser");
-        Assertions.assertEquals("donald", out);
+            String out = cmf.apply("mysecret/myuser");
+            Assertions.assertEquals("donald", out);
 
-        out = cmf.apply("mysecret/unknown");
-        Assertions.assertNull(out);
+            out = cmf.apply("mysecret/unknown");
+            Assertions.assertNull(out);
 
-        out = cmf.apply("mysecret/unknown:444");
-        Assertions.assertEquals("444", out);
+            out = cmf.apply("mysecret/unknown:444");
+            Assertions.assertEquals("444", out);
 
-        out = cmf.apply("mysecret/mypass");
-        Assertions.assertEquals("seCre!t", out);
-
-        cmf.stop();
+            out = cmf.apply("mysecret/mypass");
+            Assertions.assertEquals("seCre!t", out);
+        }
     }
 
 }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunctionRouteTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunctionRouteTest.java
index d9f734f581b..d5c4c6872f6 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunctionRouteTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunctionRouteTest.java
@@ -23,8 +23,8 @@ import java.util.Map;
 import io.fabric8.kubernetes.api.model.Secret;
 import io.fabric8.kubernetes.api.model.SecretBuilder;
 import io.fabric8.kubernetes.client.ConfigBuilder;
-import io.fabric8.kubernetes.client.DefaultKubernetesClient;
 import io.fabric8.kubernetes.client.KubernetesClient;
+import io.fabric8.kubernetes.client.KubernetesClientBuilder;
 import org.apache.camel.CamelContext;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
@@ -66,7 +66,7 @@ public class SecretPropertiesFunctionRouteTest extends KubernetesTestSupport {
         ConfigBuilder builder = new ConfigBuilder();
         builder.withOauthToken(authToken);
         builder.withMasterUrl(host);
-        client = new DefaultKubernetesClient(builder.build());
+        client = new KubernetesClientBuilder().withConfig(builder.build()).build();
         context.getRegistry().bind("KubernetesClient", client);
 
         Map<String, String> data
@@ -93,7 +93,7 @@ public class SecretPropertiesFunctionRouteTest extends KubernetesTestSupport {
 
     @Test
     @Order(1)
-    public void secretPropertiesFunction() throws Exception {
+    public void secretPropertiesFunction() {
         String out = template.requestBody("direct:start", null, String.class);
         Assertions.assertEquals("Connect with scott:tiger", out);
     }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunctionTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunctionTest.java
index 49db700b436..669690b0e70 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunctionTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunctionTest.java
@@ -23,8 +23,8 @@ import java.util.Map;
 import io.fabric8.kubernetes.api.model.Secret;
 import io.fabric8.kubernetes.api.model.SecretBuilder;
 import io.fabric8.kubernetes.client.ConfigBuilder;
-import io.fabric8.kubernetes.client.DefaultKubernetesClient;
 import io.fabric8.kubernetes.client.KubernetesClient;
+import io.fabric8.kubernetes.client.KubernetesClientBuilder;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.MethodOrderer;
@@ -49,7 +49,7 @@ public class SecretPropertiesFunctionTest extends KubernetesTestSupport {
         builder.withOauthToken(authToken);
         builder.withMasterUrl(host);
 
-        KubernetesClient client = new DefaultKubernetesClient(builder.build());
+        KubernetesClient client = new KubernetesClientBuilder().withConfig(builder.build()).build();
 
         Map<String, String> data
                 = Map.of("myuser", Base64.getEncoder().encodeToString("scott".getBytes(StandardCharsets.UTF_8)),
@@ -57,8 +57,7 @@ public class SecretPropertiesFunctionTest extends KubernetesTestSupport {
         Secret sec = new SecretBuilder().editOrNewMetadata().withName("mysecret").endMetadata().withData(data).build();
         client.resource(sec).createOrReplace();
 
-        try {
-            SecretPropertiesFunction cmf = new SecretPropertiesFunction();
+        try (SecretPropertiesFunction cmf = new SecretPropertiesFunction()) {
             cmf.setClient(client);
             cmf.setCamelContext(context);
             cmf.start();
@@ -74,8 +73,6 @@ public class SecretPropertiesFunctionTest extends KubernetesTestSupport {
 
             out = cmf.apply("mysecret/mypass");
             Assertions.assertEquals("tiger", out);
-
-            cmf.stop();
         } finally {
             client.resource(sec).delete();
         }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/openshift/producer/OpenshiftBuildConfigsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/openshift/producer/OpenshiftBuildConfigsProducerTest.java
index 5861b4b38cc..2abd1841687 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/openshift/producer/OpenshiftBuildConfigsProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/openshift/producer/OpenshiftBuildConfigsProducerTest.java
@@ -19,25 +19,25 @@ package org.apache.camel.component.openshift.producer;
 import java.util.List;
 
 import io.fabric8.kubernetes.api.model.APIGroupListBuilder;
-import io.fabric8.openshift.api.model.BuildConfig;
+import io.fabric8.kubernetes.client.NamespacedKubernetesClient;
+import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient;
+import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;
 import io.fabric8.openshift.api.model.BuildConfigListBuilder;
-import io.fabric8.openshift.client.NamespacedOpenShiftClient;
 import org.apache.camel.BindToRegistry;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.OpenShiftServer;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+@EnableKubernetesMockClient
 public class OpenshiftBuildConfigsProducerTest extends KubernetesTestSupport {
 
-    @RegisterExtension
-    public OpenShiftServer server = new OpenShiftServer();
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BindToRegistry("client")
-    public NamespacedOpenShiftClient loadClient() {
+    public NamespacedKubernetesClient loadClient() {
         server.expect().withPath("/apis/build.openshift.io/v1/namespaces/test/buildconfigs")
                 .andReturn(200, new BuildConfigListBuilder().build()).once();
 
@@ -55,13 +55,12 @@ public class OpenshiftBuildConfigsProducerTest extends KubernetesTestSupport {
                 .andReturn(200, new BuildConfigListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
                 .once();
 
-        return server.getOpenshiftClient();
+        return client;
     }
 
     @Test
-    public void listTest() {
-        List<BuildConfig> result = template.requestBody("direct:list", "", List.class);
-
+    void listTest() {
+        List<?> result = template.requestBody("direct:list", "", List.class);
         assertEquals(3, result.size());
     }
 
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/openshift/producer/OpenshiftBuildsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/openshift/producer/OpenshiftBuildsProducerTest.java
index 8c15d2e3b8f..3340714d140 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/openshift/producer/OpenshiftBuildsProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/openshift/producer/OpenshiftBuildsProducerTest.java
@@ -21,28 +21,27 @@ import java.util.List;
 import java.util.Map;
 
 import io.fabric8.kubernetes.api.model.APIGroupListBuilder;
-import io.fabric8.openshift.api.model.Build;
+import io.fabric8.kubernetes.client.NamespacedKubernetesClient;
+import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient;
+import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;
 import io.fabric8.openshift.api.model.BuildListBuilder;
-import io.fabric8.openshift.client.OpenShiftClient;
 import org.apache.camel.BindToRegistry;
 import org.apache.camel.Exchange;
-import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.OpenShiftServer;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+@EnableKubernetesMockClient
 public class OpenshiftBuildsProducerTest extends KubernetesTestSupport {
 
-    @RegisterExtension
-    public OpenShiftServer server = new OpenShiftServer();
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BindToRegistry("client")
-    public OpenShiftClient loadClient() throws Exception {
+    public NamespacedKubernetesClient loadClient() throws Exception {
         server.expect().withPath("/apis/build.openshift.io/v1/builds")
                 .andReturn(200, new BuildListBuilder().addNewItem().and().addNewItem().and().build()).once();
         server.expect().withPath("/apis/build.openshift.io/v1/builds?labelSelector=" + toUrlEncoded("key1=value1,key2=value2"))
@@ -53,30 +52,26 @@ public class OpenshiftBuildsProducerTest extends KubernetesTestSupport {
                                 .addNewGroup()
                                 .withApiVersion("v1").withName("security.openshift.io").endGroup().build())
                 .always();
-        return server.getOpenshiftClient();
+        return client;
     }
 
     @Test
-    public void listTest() {
-        List<Build> result = template.requestBody("direct:list", "", List.class);
+    void listTest() {
+        List<?> result = template.requestBody("direct:list", "", List.class);
 
         assertEquals(2, result.size());
     }
 
     @Test
-    public void listByLabelsTest() {
-        Exchange ex = template.request("direct:listByLabels", new Processor() {
-
-            @Override
-            public void process(Exchange exchange) {
-                Map<String, String> labels = new HashMap<>();
-                labels.put("key1", "value1");
-                labels.put("key2", "value2");
-                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_BUILDS_LABELS, labels);
-            }
+    void listByLabelsTest() {
+        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_BUILDS_LABELS, labels);
         });
 
-        List<Build> result = ex.getMessage().getBody(List.class);
+        List<?> result = ex.getMessage().getBody(List.class);
 
         assertEquals(2, result.size());
     }
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/openshift/producer/OpenshiftDeploymentConfigsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/openshift/producer/OpenshiftDeploymentConfigsProducerTest.java
index 1f874a6856c..dc0ac67024b 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/openshift/producer/OpenshiftDeploymentConfigsProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/openshift/producer/OpenshiftDeploymentConfigsProducerTest.java
@@ -20,43 +20,46 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import io.fabric8.kubernetes.client.NamespacedKubernetesClient;
+import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient;
+import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;
 import io.fabric8.openshift.api.model.DeploymentConfig;
 import io.fabric8.openshift.api.model.DeploymentConfigBuilder;
 import io.fabric8.openshift.api.model.DeploymentConfigListBuilder;
-import io.fabric8.openshift.client.OpenShiftClient;
+import io.fabric8.openshift.api.model.DeploymentConfigSpec;
+import io.fabric8.openshift.api.model.DeploymentConfigSpecBuilder;
 import org.apache.camel.BindToRegistry;
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.OpenShiftServer;
 import org.apache.camel.component.kubernetes.KubernetesConstants;
 import org.apache.camel.component.kubernetes.KubernetesTestSupport;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@EnableKubernetesMockClient
 public class OpenshiftDeploymentConfigsProducerTest extends KubernetesTestSupport {
 
-    @RegisterExtension
-    public OpenShiftServer server = new OpenShiftServer();
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
 
     @BindToRegistry("kubernetesClient")
-    public OpenShiftClient getClient() {
-        return server.getOpenshiftClient();
+    public NamespacedKubernetesClient getClient() {
+        return client;
     }
 
     @Test
-    public void listTest() {
+    void listTest() {
         server.expect().withPath("/apis/apps.openshift.io/v1/namespaces/test/deploymentconfigs")
                 .andReturn(200, new DeploymentConfigListBuilder().addNewItem().and().build()).once();
-        List<DeploymentConfig> result = template.requestBody("direct:list", "", List.class);
+        List<?> result = template.requestBody("direct:list", "", List.class);
 
         assertEquals(1, result.size());
     }
 
     @Test
-    public void listByLabelsTest() throws Exception {
+    void listByLabelsTest() throws Exception {
         server.expect()
                 .withPath("/apis/apps.openshift.io/v1/namespaces/test/deploymentconfigs?labelSelector="
                           + toUrlEncoded("key1=value1,key2=value2"))
@@ -70,13 +73,66 @@ public class OpenshiftDeploymentConfigsProducerTest extends KubernetesTestSuppor
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENTS_LABELS, labels);
         });
 
-        List<DeploymentConfig> result = ex.getMessage().getBody(List.class);
+        List<?> result = ex.getMessage().getBody(List.class);
 
         assertEquals(3, result.size());
     }
 
     @Test
-    public void createAndDeleteDeploymentConfig() {
+    void createDeploymentConfig() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        DeploymentConfigSpec spec = new DeploymentConfigSpecBuilder().withReplicas(13).build();
+        DeploymentConfig de1
+                = new DeploymentConfigBuilder().withNewMetadata().withName("de1").withNamespace("test").withLabels(labels).and()
+                        .withSpec(spec).build();
+        server.expect().post().withPath("/apis/apps.openshift.io/v1/namespaces/test/deploymentconfigs").andReturn(200, de1)
+                .once();
+
+        Exchange ex = template.request("direct:create", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENTS_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_NAME, "de1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_CONFIG_SPEC, spec);
+        });
+
+        DeploymentConfig result = ex.getMessage().getBody(DeploymentConfig.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("de1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals(13, result.getSpec().getReplicas());
+    }
+
+    @Test
+    void replaceDeploymentConfig() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        DeploymentConfigSpec spec = new DeploymentConfigSpecBuilder().withReplicas(13).build();
+        DeploymentConfig de1
+                = new DeploymentConfigBuilder().withNewMetadata().withName("de1").withNamespace("test").withLabels(labels).and()
+                        .withSpec(spec).build();
+        server.expect().get().withPath("/apis/apps.openshift.io/v1/namespaces/test/deploymentconfigs/de1").andReturn(200,
+                new DeploymentConfigBuilder().withNewMetadata().withName("de1").withNamespace("test").endMetadata().build())
+                .once();
+        server.expect().put().withPath("/apis/apps.openshift.io/v1/namespaces/test/deploymentconfigs/de1").andReturn(200, de1)
+                .once();
+
+        Exchange ex = template.request("direct:replace", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENTS_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_NAME, "de1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_CONFIG_SPEC, spec);
+        });
+
+        DeploymentConfig result = ex.getMessage().getBody(DeploymentConfig.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("de1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals(13, result.getSpec().getReplicas());
+    }
+
+    @Test
+    void deleteDeploymentConfig() {
         DeploymentConfig de1 = new DeploymentConfigBuilder().withNewMetadata().withNamespace("test").withName("dc1")
                 .withResourceVersion("1").withGeneration(2L).endMetadata().withNewSpec()
                 .withReplicas(0).endSpec().withNewStatus().withReplicas(1).withObservedGeneration(1L).endStatus().build();
@@ -100,7 +156,7 @@ public class OpenshiftDeploymentConfigsProducerTest extends KubernetesTestSuppor
     }
 
     @Test
-    public void createScaleAndDeleteDeploymentConfig() {
+    void scaleDeploymentConfig() {
         server.expect().withPath("/apis/apps.openshift.io/v1/namespaces/test/deploymentconfigs/dc1")
                 .andReturn(200, new DeploymentConfigBuilder().withNewMetadata().withName("dc1")
                         .withResourceVersion("1").endMetadata().withNewSpec().withReplicas(5).endSpec().withNewStatus()
@@ -119,7 +175,6 @@ public class OpenshiftDeploymentConfigsProducerTest extends KubernetesTestSuppor
             exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_REPLICAS, 1);
         });
 
-        // Thread.sleep(3000);
         int replicas = ex.getMessage().getBody(Integer.class);
 
         assertEquals(5, replicas);
@@ -134,10 +189,12 @@ public class OpenshiftDeploymentConfigsProducerTest extends KubernetesTestSuppor
                         .toF("openshift-deploymentconfigs:///?kubernetesClient=#kubernetesClient&operation=listDeploymentConfigs");
                 from("direct:listByLabels")
                         .toF("openshift-deploymentconfigs:///?kubernetesClient=#kubernetesClient&operation=listDeploymentConfigsByLabels");
-                from("direct:delete")
-                        .toF("openshift-deploymentconfigs:///?kubernetesClient=#kubernetesClient&operation=deleteDeploymentConfig");
                 from("direct:create")
                         .toF("openshift-deploymentconfigs:///?kubernetesClient=#kubernetesClient&operation=createDeploymentConfig");
+                from("direct:replace")
+                        .toF("openshift-deploymentconfigs:///?kubernetesClient=#kubernetesClient&operation=replaceDeploymentConfig");
+                from("direct:delete")
+                        .toF("openshift-deploymentconfigs:///?kubernetesClient=#kubernetesClient&operation=deleteDeploymentConfig");
                 from("direct:scale")
                         .toF("openshift-deploymentconfigs:///?kubernetesClient=#kubernetesClient&operation=scaleDeploymentConfig");
             }