The Issue
When deploying a Splunk instance using the Splunk Operator on Kubernetes, the default resource limits are set to 4 CPUs and 8GB of RAM. Users often want to increase these limits to better utilize available hardware resources. Additionally, users may want to schedule the Splunk pods on a specific Kubernetes node by using a nodeSelector.
However, attempts to set nodeSelector directly in the Splunk Operator’s Custom Resource (CR) manifest result in errors, and the operator does not apply the node selection as expected. This leads to deployment failures or pods not being scheduled on the desired node.
The Cause
The root cause is that the Splunk Operator’s Custom Resource Definition (CRD) for Standalone does not support the nodeSelector field inside the spec section of the CR manifest. When you try to add nodeSelector there, Kubernetes rejects the manifest with errors like:
The request is invalid: patch: Invalid value: ...: strict decoding error: unknown field "spec.nodeSelector"
This happens because nodeSelector is not defined in the manifest according to the CRD schema, and the Splunk Operator currently does not expose nodeSelector as a configurable field in the CR.
The Fix
To increase CPU and memory limits for your Splunk instance, update the resources section under spec in your Splunk Standalone manifest like this:
spec:
resources:
limits:
cpu: "6" # Max 6 CPUs allowed
memory: "12Gi" # Max 12 GB memory allowed
This change is supported by the operator and will apply the resource limits correctly.
For node selection, since the operator does not support setting nodeSelector in the CR, you need to manually patch the StatefulSet that the operator creates. Use the following kubectl patch command to restrict the pods to run only on a specific node (replace the hostname with your target node):
kubectl patch statefulset splunk-splunk-01-standalone -n splunk --type='merge' -p='{
"spec": {
"template": {
"spec": {
"nodeSelector": {
"kubernetes.io/hostname": "ip-10-1-1-15.us-east-2.compute.internal"
}
}
}
}
}'
This patch adds the nodeSelector to the pod template spec of the StatefulSet, ensuring pods are scheduled only on the specified node.