Node placement
Turn placement on when you want to keep OpenLM Platform on its own nodes, for example to separate it from other workloads, or to give the data-processing jobs nodes of their own.
By default, Kubernetes runs a pod on any node with room for it. That's fine for most installations, and it's what this guide sets up: placement is off.
How the chart does it
Every component belongs to one of two groups:
| Group | Label value | What's in it |
|---|---|---|
| Services and UIs | main | Almost everything: about 100 components |
| Data processing | spark | The jobs that prepare reporting data: sparkmongo, sparkmssql, licenseconcurency, officetimecalculation, denialsaggregation and a few optional ones |
With placement on, each pod requires a node with the label openlm.com/role set to its group, and tolerates a taint with the same key and value:
# what the chart adds to every pod when placement is on (component in group "main")
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- { key: openlm.com/role, operator: In, values: [main] }
tolerations:
- { key: openlm.com/role, operator: Equal, value: main, effect: NoSchedule }
The two switches are independent:
| Setting | What it does |
|---|---|
global.affinity.enabled: true | Pods run only on nodes labeled openlm.com/role=main (or =spark). |
global.taints.enabled: true | Pods can run on nodes tainted openlm.com/role=main:NoSchedule (or spark). Other workloads are kept off those nodes by the taint. |
The usual combination is both on: dedicated nodes that only OpenLM Platform uses.
With global.affinity.enabled: true, a pod waits in Pending forever if no node carries its label. Label at least one node per group first. Both groups, main and spark, need nodes.
Turn placement on
To turn placement on:
-
Label (and, if you want exclusive nodes, taint) the nodes:
kubectl label node <node> openlm.com/role=mainkubectl taint node <node> openlm.com/role=main:NoSchedule # optional: keep other pods offkubectl label node <spark-node> openlm.com/role=sparkkubectl taint node <spark-node> openlm.com/role=spark:NoScheduleOn managed clusters, set labels and taints on the node group or node pool instead, so new nodes get them automatically. See EKS and AKS.
-
Turn both switches on in
openlm-values.yaml:global:affinity: { enabled: true }taints: { enabled: true } -
Apply the change with the same
helm upgrade --installcommand as in step 6.
main and sparkValues such as main-workload or reporting don't work. Node groups created from other templates often use different values. Check with kubectl get nodes -L openlm.com/role.
Your data services and placement
The placement settings apply only to the OpenLM Platform components. If you run MongoDB, Kafka or Redis inside the cluster, place them with their own charts' settings. The following table shows a common layout:
| Node group | Label | Runs |
|---|---|---|
| Platform | openlm.com/role=main | OpenLM services and UIs, API gateway |
| Data processing | openlm.com/role=spark | Reporting data jobs |
| Infrastructure | your own label | MongoDB, Kafka, Redis, ingress controller |
When you can't label nodes
On certain managed or shared clusters, for example a namespace on a shared OpenShift cluster, you don't have permission to label nodes. Leave both settings false. OpenLM Platform runs fine without placement.
The documentation team might draft this page using a large language model. A technical writer reviews every page and verifies it against the product before publishing it. A human makes the final decision.