From 96d4cd01035e5c26fc1c5c6ddc1df1f74f107891 Mon Sep 17 00:00:00 2001 From: gspark-etri Date: Mon, 19 Oct 2026 14:04:18 +0900 Subject: [PATCH 1/4] chart: site extension points (command, extraEnv, initContainers, extraVolumes, extraVolumeMounts) Lets a site run the daemon from a stock Python image until the rm-abstract-node image is published. All empty by default; chart 0.4.2. Co-Authored-By: Claude Opus 5.5 --- deploy/helm/rm-abstract-node/Chart.yaml | 2 +- .../rm-abstract-node/templates/daemonset.yaml | 20 +++++++++++++++++++ deploy/helm/rm-abstract-node/values.yaml | 9 +++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/deploy/helm/rm-abstract-node/Chart.yaml b/deploy/helm/rm-abstract-node/Chart.yaml index de0ef03..df1e03f 100644 --- a/deploy/helm/rm-abstract-node/Chart.yaml +++ b/deploy/helm/rm-abstract-node/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v2 name: rm-abstract-node description: ai-rm L1 node daemon - publishes each node's accelerators as AcceleratorProfiles and node labels type: application -version: 0.4.1 +version: 0.4.2 appVersion: "0.4.1" diff --git a/deploy/helm/rm-abstract-node/templates/daemonset.yaml b/deploy/helm/rm-abstract-node/templates/daemonset.yaml index e71cdca..cdde3fa 100644 --- a/deploy/helm/rm-abstract-node/templates/daemonset.yaml +++ b/deploy/helm/rm-abstract-node/templates/daemonset.yaml @@ -29,11 +29,20 @@ spec: tolerations: {{- toYaml . | nindent 8 }} {{- end }} + {{- with .Values.initContainers }} + initContainers: + {{- toYaml . | nindent 8 }} + {{- end }} containers: - name: daemon image: "{{ required "image.repository is required" .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- if .Values.command }} + command: + {{- toYaml .Values.command | nindent 12 }} + {{- else }} command: ["python", "-m", "rm_abstract.airm.daemon"] + {{- end }} env: - name: AIRM_NODE_NAME valueFrom: @@ -47,6 +56,9 @@ spec: value: {{ .Values.removeAfter | quote }} - name: AIRM_METRICS_PORT value: {{ .Values.airm.metricsPort | quote }} + {{- with .Values.extraEnv }} + {{- toYaml . | nindent 12 }} + {{- end }} {{- if .Values.airm.metricsPort }} ports: - name: metrics @@ -59,4 +71,12 @@ spec: resources: {{- toYaml . | nindent 12 }} {{- end }} + {{- with .Values.extraVolumeMounts }} + volumeMounts: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.extraVolumes }} + volumes: + {{- toYaml . | nindent 8 }} + {{- end }} {{- end }} diff --git a/deploy/helm/rm-abstract-node/values.yaml b/deploy/helm/rm-abstract-node/values.yaml index f25134b..37ede16 100644 --- a/deploy/helm/rm-abstract-node/values.yaml +++ b/deploy/helm/rm-abstract-node/values.yaml @@ -24,6 +24,15 @@ serviceAccount: create: true name: "" +# Site extension points (all empty by default). A site without the published image can run a +# stock Python image: an init container installs rm-abstract[k8s] into a volume on PYTHONPATH, +# and the host's vendor tools are mounted read-only and appended to PATH. +command: [] # default: python -m rm_abstract.airm.daemon +extraEnv: [] # [{name, value}] appended to the daemon's env +initContainers: [] # pod initContainers, verbatim +extraVolumes: [] # pod volumes, verbatim +extraVolumeMounts: [] # daemon volumeMounts, verbatim + nodeAffinity: {} # default: every node; restrict with airm.ai-computing.io/. labels tolerations: - operator: Exists # run on tainted accelerator nodes too From 1404ea2663076d0262b4155e789ffcbe9fae7dbd Mon Sep 17 00:00:00 2001 From: gspark-etri Date: Mon, 19 Oct 2026 14:10:54 +0900 Subject: [PATCH 2/4] chart: writable /tmp for the read-only root (rbln-stat unpacks under TMPDIR) Without it rbln-stat fails with 'Could not create temporary directory' and the node publishes no ATOM profiles. Co-Authored-By: Claude Opus 5.5 --- .../helm/rm-abstract-node/templates/daemonset.yaml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/deploy/helm/rm-abstract-node/templates/daemonset.yaml b/deploy/helm/rm-abstract-node/templates/daemonset.yaml index cdde3fa..955c924 100644 --- a/deploy/helm/rm-abstract-node/templates/daemonset.yaml +++ b/deploy/helm/rm-abstract-node/templates/daemonset.yaml @@ -71,12 +71,17 @@ spec: resources: {{- toYaml . | nindent 12 }} {{- end }} - {{- with .Values.extraVolumeMounts }} volumeMounts: + # read-only root: rbln-stat (PyInstaller) unpacks itself under $TMPDIR + - name: tmp + mountPath: /tmp + {{- with .Values.extraVolumeMounts }} {{- toYaml . | nindent 12 }} - {{- end }} - {{- with .Values.extraVolumes }} + {{- end }} volumes: + - name: tmp + emptyDir: {} + {{- with .Values.extraVolumes }} {{- toYaml . | nindent 8 }} - {{- end }} + {{- end }} {{- end }} From 8a2077086609e4d5c684545270dd7e5a8b3a9bd2 Mon Sep 17 00:00:00 2001 From: gspark-etri Date: Mon, 19 Oct 2026 14:33:29 +0900 Subject: [PATCH 3/4] chart: mount host /dev live (hostDev, default on) A privileged container sees /dev as it was at start. On etri-001 an ATOM that the device plugin allocated and released was re-created by the driver, dropped out of rbln-stat inside the daemon, and its profile was removed after 3 rounds. Co-Authored-By: Claude Opus 5.5 --- deploy/helm/rm-abstract-node/templates/daemonset.yaml | 9 +++++++++ deploy/helm/rm-abstract-node/values.yaml | 3 +++ 2 files changed, 12 insertions(+) diff --git a/deploy/helm/rm-abstract-node/templates/daemonset.yaml b/deploy/helm/rm-abstract-node/templates/daemonset.yaml index 955c924..bb91e84 100644 --- a/deploy/helm/rm-abstract-node/templates/daemonset.yaml +++ b/deploy/helm/rm-abstract-node/templates/daemonset.yaml @@ -75,12 +75,21 @@ spec: # read-only root: rbln-stat (PyInstaller) unpacks itself under $TMPDIR - name: tmp mountPath: /tmp + {{- if .Values.hostDev }} + - name: dev + mountPath: /dev + {{- end }} {{- with .Values.extraVolumeMounts }} {{- toYaml . | nindent 12 }} {{- end }} volumes: - name: tmp emptyDir: {} + {{- if .Values.hostDev }} + - name: dev + hostPath: + path: /dev + {{- end }} {{- with .Values.extraVolumes }} {{- toYaml . | nindent 8 }} {{- end }} diff --git a/deploy/helm/rm-abstract-node/values.yaml b/deploy/helm/rm-abstract-node/values.yaml index 37ede16..08d5459 100644 --- a/deploy/helm/rm-abstract-node/values.yaml +++ b/deploy/helm/rm-abstract-node/values.yaml @@ -19,6 +19,9 @@ removeAfter: 3 # remove a device's profile after this many discoveries w # Vendor tools read the device nodes, which needs a privileged container. privileged: true +# Mount the host's /dev live. A privileged container otherwise sees /dev as it was at start, and a +# device that a driver re-creates (e.g. after a pod releases an ATOM) drops out of discovery. +hostDev: true serviceAccount: create: true From b224eafc528901d250e862ebd1c4a9c80f46d780 Mon Sep 17 00:00:00 2001 From: gspark-etri Date: Mon, 19 Oct 2026 14:43:01 +0900 Subject: [PATCH 4/4] CHANGELOG: chart 0.4.2 Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a8381b5..bc5ae19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## Chart 0.4.2 — 2026-10-19 + +Found while running the daemon on the live cluster (ai-rm end-to-end run). + +### Fixed +- Writable `/tmp` under the read-only root: `rbln-stat` (PyInstaller) unpacks itself under `TMPDIR` + and failed with "Could not create temporary directory", so no ATOM was published. +- `hostDev` (default on) mounts the host's `/dev` live. A privileged container sees `/dev` as it was at + start; an ATOM that the driver re-created after a pod released it dropped out of discovery. + +### Added +- Site extension points, all empty by default: `command`, `extraEnv`, `initContainers`, + `extraVolumes`, `extraVolumeMounts` (run the daemon from a stock Python image until the + `rm-abstract-node` image is published). + ## 0.4.1 — 2026-10-19 ### Fixed