Eighteen containers had no memory limit at all, so nothing on the node could bound them. Three of the values files even claimed to set resources: Helm does not complain about a key it does not recognise, so the block sat there looking like a limit while the pod ran unbounded. alloy is the one that mattered. The chart reads `alloy.resources`; the file had `controller.resources`, so the DaemonSet that tails every pod log on the node shipped with nothing at all. `kubeStateMetrics` is the same trap in a different shape -- that is the condition key, the values live under `kube-state-metrics` -- and `configReloader` in the alloy chart sits at the top level rather than under `alloy`. Each one is verified by rendering the chart and reading the resources back off the containers, because a values key that is ignored looks exactly like one that works. reloader turned out to be set and still wrong: 64Mi request against a measured p95 of 73M, so the pod ran permanently above its own request and stayed a standing eviction candidate. That is the pod that restarts every other pod, so it is the last one that should be evicted. Raised to 96Mi. Requests are set at p95 throughout, grafana, playwright and alloy included. Left at the values first proposed they would have sat below their own p95 and queued for eviction ahead of everything smaller. CPU limits are deliberately absent: the node is I/O bound at 5% CPU, and CFS throttling would turn disk wait into runnable-throttled, which is the failure mode that took the node down. The prometheus and alertmanager configReloader sidecars are left open: chart 86.2.3 does not template the key, so reaching those two containers needs a postRenderer. Verified: all four charts render with the resources landing on the intended containers, and 16/16 local gates pass.
59 lines
1.2 KiB
YAML
59 lines
1.2 KiB
YAML
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: searxng-valkey-service
|
|
namespace: searxng
|
|
spec:
|
|
clusterIP: None
|
|
selector:
|
|
app: searxng-valkey
|
|
ports:
|
|
- port: 6379
|
|
targetPort: 6379
|
|
---
|
|
apiVersion: apps/v1
|
|
kind: StatefulSet
|
|
metadata:
|
|
name: searxng-valkey-statefulset
|
|
namespace: searxng
|
|
spec:
|
|
serviceName: searxng-valkey-service
|
|
replicas: 1
|
|
selector:
|
|
matchLabels:
|
|
app: searxng-valkey
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: searxng-valkey
|
|
spec:
|
|
containers:
|
|
- name: valkey
|
|
image: docker.io/valkey/valkey:9.1.2-alpine
|
|
# p95 15M, max 17M, no limit before. Matches the netbox valkey pod.
|
|
resources:
|
|
requests:
|
|
cpu: "50m"
|
|
memory: "64Mi"
|
|
limits:
|
|
memory: "256Mi"
|
|
command:
|
|
- valkey-server
|
|
- --save
|
|
- "30 1"
|
|
- --loglevel
|
|
- warning
|
|
ports:
|
|
- containerPort: 6379
|
|
volumeMounts:
|
|
- name: valkey-data
|
|
mountPath: /data
|
|
volumeClaimTemplates:
|
|
- metadata:
|
|
name: valkey-data
|
|
spec:
|
|
accessModes: ["ReadWriteOnce"]
|
|
resources:
|
|
requests:
|
|
storage: 1Gi
|