Skip to content

[BUG] UI Next.js killed by SIGILL on ARMv8.0 (Raspberry Pi 4) in 0.9.12 #2425

Description

@hugolesta

📋 Prerequisites

  • I have searched the existing issues to avoid creating a duplicate
  • By submitting this issue, you agree to follow our Code of Conduct
  • I am using the latest version of the software
  • I have tried to clear cache/cookies or used incognito mode (if ui-related)
  • I can consistently reproduce this issue

🎯 Affected Service(s)

UI Service

🚦 Impact/Severity

High — the UI loads but cannot create or modify anything

🐛 Bug Description

The nextjs process in the kagent-ui pod is killed with SIGILL (illegal instruction) on a Raspberry Pi 4 (Cortex-A72). nginx loses its upstream and returns 502, which the browser surfaces as "An unexpected response was received from the server."

This is the same failure as #1505, which was closed as not_planned after it could not be reproduced on an ARM64 Mac. Reporting it again because it still occurs on 0.9.12 (that issue was 0.8.0-beta6), and because the CPU feature data below explains why an Apple Silicon machine would not reproduce it.

The crash is triggered by Server Actions, not at startup. The pod reports 1/1 Running and read-only pages work fine — the process only dies when a POST arrives. That distinction may be why this looked intermittent before:

Request Result
GET / 200
GET /models, GET /api/agents 200
POST /models/new 502
POST /mcp/new 502

🔍 Root cause evidence

The node's CPU does not implement the LSE atomics added in ARMv8.1:

Model    : Raspberry Pi 4 Model B Rev 1.4
Features : fp asimd evtstrm crc32 cpuid

Note the absence of atomics. Apple Silicon and most ARM64 servers (Graviton, Ampere) do implement it, so the published arm64 image runs there and fails only on older ARMv8.0 cores like the Cortex-A72. Node.js is v24.18.0 in the image.

supervisord shows the process being restarted on each POST:

WARN exited: nextjs (terminated by SIGILL; not expected)
INFO spawned: 'nextjs' with pid 8
✓ Ready in 0ms
WARN exited: nextjs (terminated by SIGILL; not expected)

And the corresponding nginx error:

[error] upstream prematurely closed connection while reading response header
from upstream, client: 10.42.0.72, request: "POST /models/new HTTP/1.1",
upstream: "http://127.0.0.1:8001/"

🔄 Steps To Reproduce

  1. Install kagent 0.9.12 on a k3s cluster whose nodes are Raspberry Pi 4 (arm64, Debian 12 bookworm, kernel 6.12.34+rpt-rpi-v8)
  2. Open the UI and load any page — this works
  3. Click through to any action that submits a form (for example New Model or New MCP Server)
  4. The browser shows "An unexpected response was received from the server", and the pod logs show the SIGILL above

✅ Expected Behaviour

Either the published linux/arm64 image runs on ARMv8.0 cores, or the constraint is documented and the image advertises a more specific platform so it is not silently pulled onto unsupported hardware.

💡 Possible direction

The likely culprit is a native dependency (or a Node build) compiled with -march targeting ARMv8.1+. Building the UI image for the ARMv8.0 baseline would cover Pi 4 and similar boards. I have not tried to isolate which module emits the trapping instruction — happy to run something specific in this environment if that would help.

🌍 Environment

  • kagent: 0.9.12 (chart and images)
  • Kubernetes: k3s v1.35.7+k3s1
  • Nodes: 2 × Raspberry Pi 4 Model B Rev 1.4, arm64, Debian 12 (bookworm), kernel 6.12.34+rpt-rpi-v8
  • containerd 2.2.5-k3s2
  • Node.js in image: v24.18.0
  • Everything else in kagent works: the controller, the agents and the A2A endpoints are all healthy on the same nodes, and the agents are usable through their A2A APIs. Only the UI's Next.js process is affected.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status
    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions