Skip to main content

Cluster types compared

OpenLM Platform installs the same way on every cluster type: same chart, same images, same steps. What changes is the cluster around it: how traffic comes in, which storage class you use, how you configure the nodes, and which managed data services you can use.

At a glance​

The following table compares the four cluster types:

Amazon EKSAKSRed Hat OpenShiftK3s
IngressTraefik or ingress-nginx behind an NLBingress-nginx or Traefik behind the Azure LBOpenShift Routes (router)Built-in Traefik
INGRESS_CLASStraefik / nginxnginx / traefik(not used)traefik
STORAGE_CLASSgp3 (EBS CSI)managed-csi (Azure Disk)cluster's block class, for example gp3-csi, managed-csi, thin-csilocal-path
TLS terminated atIngress controllerIngress controllerRouter (edge)Traefik
Pod user IDsSet by the chartSet by the chartAssigned by OpenShift (useOpenShift: true)Set by the chart
Node placementOptional (node group labels)Optional (node pool labels)Usually off (you can't label nodes)Usually off (one or few nodes)
SQL ServerRDS for SQL Server, or your ownAzure SQL Database / Elastic Pool, or your ownAny reachable SQL ServerYour own
RedisElastiCache (Redis/Valkey)Azure Managed Redis / Azure CacheAnyYour own
KafkaAmazon MSK or your ownYour own or Confluent CloudYour own (an operator, for example Strimzi)Your own
MongoDBMongoDB Atlas or your own (not DocumentDB)MongoDB Atlas or your own (not Cosmos DB)Atlas or your ownYour own
Extra stepsNLB, node file-watch limitFirewall rules for the NAT IPOpenShift values file, extra Routes, certificateRedirect, DNS rewrite

Each platform page covers the same topics in the same order: before you start, ingress, storage, node settings, values, data services, and platform-specific checks. Open the page for your cluster type:

Node settings that apply everywhere​

OpenLM Platform starts about 100 .NET services, so set two Linux file-watch limits on every node that runs them:

SettingMinimumWhy
fs.inotify.max_user_instances8192Each service watches its configuration files. The common default of 128 runs out, and pods fail with too many open files.
fs.inotify.max_user_watches524288Same reason

If you manage the nodes, set the limits in /etc/sysctl.d/. If you can't, set them on every node with a small DaemonSet. The DaemonSet runs privileged, which your cluster policy might forbid:

apiVersion: apps/v1
kind: DaemonSet
metadata: { name: openlm-node-sysctl, namespace: kube-system }
spec:
selector: { matchLabels: { app: openlm-node-sysctl } }
template:
metadata: { labels: { app: openlm-node-sysctl } }
spec:
initContainers:
- name: sysctl
image: public.ecr.aws/docker/library/busybox:stable
securityContext: { privileged: true }
command: ["sh", "-c", "sysctl -w fs.inotify.max_user_instances=8192 fs.inotify.max_user_watches=524288"]
containers:
- name: wait
image: public.ecr.aws/docker/library/busybox:stable
command: ["sleep", "2147483647"]
resources: { requests: { cpu: 1m, memory: 8Mi }, limits: { memory: 16Mi } }
tolerations: [{ operator: Exists }]

To check the value, run this command on a node or from a debug pod:

kubectl debug node/<node> -it --image=public.ecr.aws/docker/library/busybox:stable -- cat /proc/sys/fs/inotify/max_user_instances

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.