11# Run a3s-observer on every node. It writes NDJSON to stdout; a node-level OpenTelemetry
22# Collector then tails the container log and ships OTLP (see deploy/otel-collector.yaml).
33#
4- # docker build -f deploy/Dockerfile -t <registry>/a3s-observer:0.2.0 . && docker push ...
54# kubectl apply -f deploy/daemonset.yaml
65#
76# No k8s API access / RBAC is needed: pod-UID + container-id come from /proc/<pid>/cgroup.
@@ -14,14 +13,19 @@ metadata:
1413spec :
1514 selector :
1615 matchLabels : { app: a3s-observer }
16+ updateStrategy :
17+ type : RollingUpdate
18+ rollingUpdate : { maxUnavailable: 1 } # controlled node-by-node rollout
1719 template :
1820 metadata :
1921 labels : { app: a3s-observer }
2022 spec :
2123 hostPID : true # resolve /proc/<pid> for host processes (identity)
24+ priorityClassName : system-node-critical # observability shouldn't be evicted under pressure
25+ terminationGracePeriodSeconds : 30 # the collector flushes a final report on SIGTERM
2226 containers :
2327 - name : a3s-observer
24- image : 10.12.111.133:49164/a3s/observer:0.2.4 # A3S OCI Registry (built from deploy/Dockerfile)
28+ image : 10.12.111.133:49164/a3s/observer:0.5.1 # mirror of ghcr.io/a3s-lab/observer:0.5.1
2529 securityContext :
2630 # eBPF load + tracepoint attach requires privileged. (Verified: a non-root
2731 # process with only CAP_BPF+CAP_PERFMON fails to attach — the tracefs tracepoint
@@ -30,12 +34,23 @@ spec:
3034 env :
3135 - { name: A3S_OBSERVER_JSON, value: "1" }
3236 # - { name: A3S_OBSERVER_FILES, value: "1" } # opt in to file-write capture
37+ # - { name: A3S_OBSERVER_SSL, value: "1" } # opt in to OpenSSL content (uprobe)
3338 volumeMounts :
3439 - { name: sys, mountPath: /sys, readOnly: true } # tracepoint ids under /sys
3540 resources :
41+ # No CPU limit on purpose: a tracing agent should not be CPU-throttled into
42+ # dropping events. Memory is bounded; the rings are fixed-size.
3643 requests : { cpu: 50m, memory: 64Mi }
3744 limits : { memory: 256Mi }
45+ livenessProbe :
46+ # Restart a wedged collector: it refreshes /run/a3s-observer.alive at startup and
47+ # every 60s report tick, so a stale (>180s) heartbeat means it stopped pumping.
48+ exec :
49+ command :
50+ ["sh", "-c", "test $(( $(date +%s) - $(stat -c %Y /run/a3s-observer.alive) )) -lt 180"]
51+ initialDelaySeconds : 20
52+ periodSeconds : 60
3853 volumes :
3954 - { name: sys, hostPath: { path: /sys } }
4055 tolerations :
41- - operator : Exists # run on every node, including control-plane
56+ - operator : Exists # run on every node, including control-plane / tainted nodes
0 commit comments