SAP Edge Integration Cell (EIC) - Solace Broker Pods Fail to Start with POST Violation (nofile Limit)
Environment
- SAP Integration Suite, Edge Integration Cell 8.48 or later (namespace
edge-icell-services) - Red Hat OpenShift Container Platform 4.x
The requirement applies to any OpenShift 4.x version. ARO and ROSA need a separate review of their configuration policies.
Issue
Installing or upgrading to EIC 8.48 or later fails while deploying edge-icell-services because the Solace broker container starts with a hard open-file limit below 1048576. The Solace pods never become ready, and the broker shuts down after its startup resource check:
ERROR POST Violation [022]:Required system resource missing, Hard resource limit nofile 1048576 is required, 524288 detected
WARN POST Violation [023]:Recommended system resource missing, Soft resource limit nofiles 2448 is recommended, 1024 detected
Management API not yet accessible
Determining platform type: [ FAIL ]
System shutdown complete (Version 10.25.0.208)
Resolution
Proposed resolution; success on the reported cluster is pending confirmation.
Raise the CRI-O default ulimits on the worker nodes with a MachineConfig, following Adjust default ulimits on CRI-O using MachineConfig. The drop-in content is:
[crio.runtime]
default_ulimits = ["nofile=4096:1048576"]
If existing drop-ins already set default_ulimits, keep their other entries.
Save the following as 96-worker-crio-limit-files.yaml. Check that the Ignition version matches the target OCP release:
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
name: 96-worker-crio-limit-files
labels:
machineconfiguration.openshift.io/role: worker
spec:
config:
ignition:
version: 3.2.0
storage:
files:
- path: /etc/crio/crio.conf.d/99-eic-nofile.conf
mode: 420
overwrite: true
contents:
source: "data:,%5Bcrio.runtime%5D%0Adefault_ulimits%20%3D%20%5B%22nofile%3D4096%3A1048576%22%5D%0A"
The data URL encodes the TOML above. This changes the defaults for all containers in the worker pool and any custom pools that inherit from it, not just Solace.
Apply to an existing cluster
Applying the MachineConfig drains and reboots each worker in turn:
oc apply -f 96-worker-crio-limit-files.yaml
oc get machineconfigpools
Wait until the pool reports UPDATED=True, UPDATING=False, and DEGRADED=False, then retry the EIC deployment.
Node drain blocked by failed Solace pods
The Solace PodDisruptionBudget requires two available pods. If the Solace pods are failing, for example after a failed installation or upgrade, no Solace pod can be evicted. The drain then hangs on the node that hosts them: the pool stays UPDATING=True, the node stays SchedulingDisabled, and the machine-config-controller keeps logging:
oc logs -n openshift-machine-config-operator deployment/machine-config-controller \
-c machine-config-controller | grep -i "disruption budget"
Cannot evict pod as it would violate the pod's disruption budget.
The pods are failing anyway, so delete them directly. A direct delete is not an eviction, so the PodDisruptionBudget does not block it:
oc get pods -n edge-icell-services -o wide \
--field-selector spec.nodeName=<draining-node> | grep solace
oc delete pod <solace-pod> -n edge-icell-services
The StatefulSet may recreate a pod on a worker that has not been updated yet, which blocks the drain again when the rollout reaches that worker. Repeat the deletion as needed until the pool has finished updating, then retry the EIC deployment.
Include during cluster provisioning
There is no nofile option in install-config.yaml. Run openshift-install create manifests, copy the MachineConfig into the generated openshift/ directory, then continue with create cluster (IPI) or create ignition-configs (UPI). See the installation configuration guide for the target release.
Root Cause
Starting with EIC 8.48, the included Solace broker requires a hard RLIMIT_NOFILE of at least 1048576 and recommends a soft/hard pair of 4096:1048576 (Solace system scaling documentation). The container limits on the reported cluster were below these values:
| Resource limit | Observed | Required |
|---|---|---|
| Soft nofile | 1024 | 4096 |
| Hard nofile | 524288 | 1048576 |
Diagnostic Steps
-
Find the Solace pods, their nodes, and the broker container name:
oc get pods -n edge-icell-services -o wide | grep solace oc get pod ssb-solace-0 -n edge-icell-services -o jsonpath='{.spec.containers[*].name}' -
While the broker container is running, check the
Max open fileslimit of PID 1:oc exec -n edge-icell-services ssb-solace-0 -c <broker-container> -- cat /proc/1/limitsIf the container exits too quickly, check the startup log instead:
oc logs -n edge-icell-services ssb-solace-0 -c <broker-container> --previous -
Before applying the fix, check whether existing MachineConfigs or CRI-O drop-ins under
/etc/crio/crio.conf.d/already setdefault_ulimits.
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.
Comments