# kube-prometheus-stack values for the local kind cluster. # # NodePorts match the extraPortMappings in kind/cluster.yaml, so the UIs are # reachable on localhost without port-forwarding. grafana: service: type: NodePort nodePort: 30300 adminPassword: minus20 # Keep the footprint small — this runs alongside a local LLM. resources: requests: { cpu: 50m, memory: 128Mi } prometheus: service: type: NodePort nodePort: 30900 prometheusSpec: retention: 6h resources: requests: { cpu: 100m, memory: 512Mi } alertmanager: service: type: NodePort nodePort: 30903 alertmanagerSpec: resources: requests: { cpu: 25m, memory: 64Mi } # Route Kubernetes crash-loop alerts to the Minus20 ingest-api webhook. # Everything else goes to the null receiver, so only the alerts Minus20 # handles reach the pipeline. This is the real architecture: Alertmanager is # the source of truth for what is firing; Minus20 is an overlay on it. config: route: receiver: "null" group_by: ["alertname", "namespace", "pod"] group_wait: 10s group_interval: 30s repeat_interval: 1h routes: - receiver: "minus20" matchers: - alertname =~ "KubePodCrashLooping.*" receivers: - name: "null" - name: "minus20" webhook_configs: - url: "http://m20-ingest-api.minus20:8080/webhook/alertmanager" send_resolved: false # Not useful on kind, and they generate noise that pollutes fault-injection runs. kubeControllerManager: enabled: false kubeScheduler: enabled: false kubeEtcd: enabled: false kubeProxy: enabled: false