[[kubernetes-nodes-component]]
= Kubernetes Nodes Component
//THIS FILE IS COPIED: EDIT THE SOURCE FILE:
:page-source: components/camel-kubernetes/src/main/docs/kubernetes-nodes-component.adoc
:docTitle: Kubernetes Nodes
:artifactId: camel-kubernetes
:description: Perform operations on Kubernetes Nodes and get notified on Node changes.
:since: 2.17
:supportLevel: Stable
:component-header: Both producer and consumer are supported
//Manually maintained attributes
:group: Kubernetes

*Since Camel {since}*

*{component-header}*

The Kubernetes Nodes component is one of xref:kubernetes-summary.adoc[Kubernetes Components] which
provides a producer to execute Kubernetes Node operations and a consumer to consume events related to Node objects.
 


== Component Options

// component options: START
The Kubernetes Nodes component supports 3 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
|===
// component options: END


== Endpoint Options

// endpoint options: START
The Kubernetes Nodes endpoint is configured using URI syntax:

----
kubernetes-nodes:masterUrl
----

with the following path and query parameters:

=== Path Parameters (1 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *masterUrl* | *Required* Kubernetes Master url |  | String
|===


=== Query Parameters (30 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *apiVersion* (common) | The Kubernetes API Version to use |  | String
| *dnsDomain* (common) | The dns domain, used for ServiceCall EIP |  | String
| *kubernetesClient* (common) | Default KubernetesClient to use if provided |  | KubernetesClient
| *portName* (common) | The port name, used for ServiceCall EIP |  | String
| *portProtocol* (common) | The port protocol, used for ServiceCall EIP | tcp | String
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
| *labelKey* (consumer) | The Consumer Label key when watching at some resources |  | String
| *labelValue* (consumer) | The Consumer Label value when watching at some resources |  | String
| *namespace* (consumer) | The namespace |  | String
| *poolSize* (consumer) | The Consumer pool size | 1 | int
| *resourceName* (consumer) | The Consumer Resource Name we would like to watch |  | String
| *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
| *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. The value can be one of: InOnly, InOut, InOptionalOut |  | ExchangePattern
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *operation* (producer) | Producer operation to do on Kubernetes |  | String
| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *connectionTimeout* (advanced) | Connection timeout in milliseconds to use when making requests to the Kubernetes API server. |  | Integer
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
| *caCertData* (security) | The CA Cert Data |  | String
| *caCertFile* (security) | The CA Cert File |  | String
| *clientCertData* (security) | The Client Cert Data |  | String
| *clientCertFile* (security) | The Client Cert File |  | String
| *clientKeyAlgo* (security) | The Key Algorithm used by the client |  | String
| *clientKeyData* (security) | The Client Key data |  | String
| *clientKeyFile* (security) | The Client Key file |  | String
| *clientKeyPassphrase* (security) | The Client Key Passphrase |  | String
| *oauthToken* (security) | The Auth Token |  | String
| *password* (security) | Password to connect to Kubernetes |  | String
| *trustCerts* (security) | Define if the certs we used are trusted anyway or not |  | Boolean
| *username* (security) | Username to connect to Kubernetes |  | String
|===
// endpoint options: END

== Supported producer operation

- listNodes
- listNodesByLabels
- getNode
- createNode
- deleteNode


== Kubernetes Nodes Producer Examples

- listNodes: this operation list the nodes on a kubernetes cluster

[source,java]
--------------------------------------------------------------------------------
from("direct:list").
    toF("kubernetes-nodes:///?kubernetesClient=#kubernetesClient&operation=listNodes").
    to("mock:result");
--------------------------------------------------------------------------------

This operation return a List of Nodes from your cluster

- listNodesByLabels:  this operation list the nodes by labels on a kubernetes cluster

[source,java]
--------------------------------------------------------------------------------
from("direct:listByLabels").process(new Processor() {

            @Override
            public void process(Exchange exchange) throws Exception {
                Map<String, String> labels = new HashMap<>();
                labels.put("key1", "value1");
                labels.put("key2", "value2");
                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NODES_LABELS, labels);
            }
        });
    toF("kubernetes-deployments:///?kubernetesClient=#kubernetesClient&operation=listNodesByLabels").
    to("mock:result");
--------------------------------------------------------------------------------

This operation return a List of Nodes from your cluster, using a label selector (with key1 and key2, with value value1 and value2)

== Kubernetes Nodes Consumer Example

[source,java]
--------------------------------------------------------------------------------
fromF("kubernetes-nodes://%s?oauthToken=%s&resourceName=test", host, authToken).process(new KubernertesProcessor()).to("mock:result");

    public class KubernertesProcessor implements Processor {
        @Override
        public void process(Exchange exchange) throws Exception {
            Message in = exchange.getIn();
            Node node = exchange.getIn().getBody(Node.class);
            log.info("Got event with configmap name: " + node.getMetadata().getName() + " and action " + in.getHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION));
        }
    }
--------------------------------------------------------------------------------

This consumer will return a list of events for the node test.


include::camel-spring-boot::page$kubernetes-starter.adoc[]
