From 8b3332a833eea899cc7ecb0fb694e8bd3186fb99 Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Thu, 28 May 2026 18:15:31 +0200 Subject: [PATCH 1/5] fix(opencost): treat custom pricing as USD/month and lift memory limit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > πŸ€– Generated by the Daily AI Assistant Two issues caused Headlamp's OpenCost panel to stop reporting costs on prod. 1. **Costs were ~730Γ— too low.** The helm-chart `customPricing.costModel` fields `CPU`, `RAM`, `GPU`, `storage`, `spotCPU`, `spotRAM` are interpreted by OpenCost as **USD per month** and divided by `HoursPerMonth = 730` to derive an hourly rate (`opencost/pkg/cloud/provider/providerconfig.go:188`, `customprovider.go:95`). Our values were authored as hourly ($0.002125/vCPU/hr, $0.000797/GB/hr), so the resulting node prices landed at `node_cpu_hourly_cost = 3e-6` instead of ~$0.0021. Empirical match: `0.002125 / 730 β‰ˆ 2.91e-6`. Allocation queries returned non-zero but vanishingly small values that Headlamp surfaces as "$0.00", i.e. no cost data. Fix: convert to per-month USD derived from the same CX33 base price ($9.31/server/month, 50/50 CPU-RAM split): CPU = 1.5517, RAM = 0.5819, storage = 0.048 (Hetzner Cloud Volume). Network-egress fields are *not* in the divide-by-730 allowlist (they are per-GB transferred) so they stay at 0.001. 2. **OOMKilled while serving Headlamp's 14d query.** The exporter was capped at 256 MiB; the cost-model engine holds the aggregation window in memory and Headlamp issues `window=14d&aggregate=namespace` and `aggregate=deployment` queries. The pod hit exit code 137 mid-response, producing the intermittent 499s observed in the UI access log and leaving the panel empty after a restart. Lift the limit to 512 MiB (~7Γ— idle, still under the chart default of 1 GiB). Validated via `ksail workload validate` (local + prod overlays). Refs: https://github.com/opencost/opencost/blob/develop/pkg/cloud/provider/providerconfig.go#L188-L210 Refs: https://github.com/opencost/opencost-helm-chart/blob/main/charts/opencost/values.yaml --- .../controllers/opencost/helm-release.yaml | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml b/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml index dc74d977a..ff83b6fde 100644 --- a/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml +++ b/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml @@ -29,7 +29,7 @@ spec: # # Lightweight FinOps cost allocation. Points at the existing # kube-prometheus-stack Prometheus and uses custom pricing derived from - # Hetzner Cloud CX33 hourly rates (€0.0117/hr for 3 vCPU / 8 GB RAM). + # Hetzner Cloud CX33 rates (€0.0117/hr for 3 vCPU / 8 GB RAM). values: opencost: prometheus: @@ -40,8 +40,17 @@ spec: url: "http://kube-prometheus-stack-prometheus.monitoring.svc.cluster.local:9090" # Hetzner Cloud custom pricing β€” CX33 rates decomposed into - # per-resource-unit hourly USD costs (EUR/USD β‰ˆ 1.09). - # CX33: €0.0117/hr β†’ $0.01275/hr, 50/50 CPU-RAM split. + # per-resource-unit USD costs (EUR/USD β‰ˆ 1.09). + # CX33: €0.0117/hr β†’ $0.01275/hr β†’ $9.31/month per server, 50/50 CPU-RAM split. + # + # IMPORTANT: OpenCost interprets CPU / spotCPU / RAM / spotRAM / GPU / storage + # in the costModel ConfigMap as USD PER MONTH and divides by HoursPerMonth=730 + # to get an hourly rate (opencost providerconfig.go:188, customprovider.go:95). + # Network egress fields are passed through as-is (USD per GB transferred). + # Per-server monthly: $9.31 / 2 = $4.655 each for CPU and RAM. + # CPU: $4.655 / 3 vCPU β‰ˆ $1.5517 / vCPU-month + # RAM: $4.655 / 8 GB β‰ˆ $0.5819 / GB-month + # storage: Hetzner Cloud Volume β‰ˆ €0.044/GB-month β†’ β‰ˆ $0.048 / GB-month # https://www.hetzner.com/cloud#pricing # https://www.opencost.io/docs/configuration/on-prem#custom-pricing-using-the-opencost-helm-chart customPricing: @@ -49,13 +58,15 @@ spec: createConfigmap: true provider: custom costModel: - description: "Hetzner Cloud CX33 β€” 3 vCPU / 8 GB / 80 GB NVMe (50/50 CPU-RAM split)" - CPU: 0.002125 + description: "Hetzner Cloud CX33 β€” 3 vCPU / 8 GB / 80 GB NVMe (50/50 CPU-RAM split, USD/month)" + CPU: 1.5517 spotCPU: 0 - RAM: 0.000797 + RAM: 0.5819 spotRAM: 0 GPU: 0 - storage: 0.00008 + storage: 0.048 + # Egress: passed through as USD per GB transferred; CX33 includes + # 20 TB/month free, overage β‰ˆ $0.001/GB on Hetzner Cloud. zoneNetworkEgress: 0.001 regionNetworkEgress: 0.001 internetNetworkEgress: 0.001 @@ -66,8 +77,12 @@ spec: requests: cpu: 10m memory: 55Mi + # 256Mi OOM-killed when Headlamp issued the 14d allocation queries β€” + # the cost-model engine holds the full window in memory while + # aggregating. 512Mi gives ~7Γ— headroom over idle (~75 Mi) and is + # still well under the chart's 1Gi default. limits: - memory: 256Mi + memory: 512Mi ui: enabled: true From 8830296a03ecd3c5eec73e14d8b86866852872d4 Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Thu, 28 May 2026 19:28:53 +0200 Subject: [PATCH 2/5] fix(opencost): correct CX33 spec and re-derive pricing from current Hetzner rates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > πŸ€– Generated by the Daily AI Assistant The previous commit had three input errors that I'd silently inherited from the original 2025 comment block, even after fixing the per-month units bug: 1. CX33 has **4 vCPU**, not 3. Verified live: `kubectl get nodes` on prod reports `cpu: 4` on every CX33. 2. CX33 current monthly cap is **€6.49**, not €8.54 (which my old hourly-based math implied). Hetzner's price-adjustment doc raised CX33 from €4.99 β†’ €6.49/month effective 2026-04-01. 3. Hetzner Cloud Volume is now **€0.0572/GB-month**, not €0.044 (same 2026-04-01 adjustment). Re-derived from the authoritative source price (Hetzner's published cap) with explicit math: Server cost = €6.49/month β†’ $7.01/server/month (EUR/USD β‰ˆ 1.08) 50/50 split = $3.504 each for CPU and RAM CPU = $3.504 / 4 vCPU = $0.876 / vCPU-month RAM = $3.504 / 8 GB = $0.438 / GB-month Vol = €0.0572 Γ— 1.08 = $0.0618 / GB-month End-to-end check (1 vCPU running for 1 hour): ConfigMap CPU = 0.876 β†’ OpenCost /730 = $0.00120 / vCPU-hour Real cost = (€6.49 Γ— 0.5 / 4 vCPU / 730 hr) Γ— 1.08 = $0.00120 / vCPU-hour βœ“ Validated: `ksail workload validate` succeeds for both clusters/local and clusters/prod (256 files each). Refs: https://docs.hetzner.com/general/infrastructure-and-availability/price-adjustment/ --- .../controllers/opencost/helm-release.yaml | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml b/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml index ff83b6fde..8efe95c0d 100644 --- a/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml +++ b/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml @@ -29,7 +29,7 @@ spec: # # Lightweight FinOps cost allocation. Points at the existing # kube-prometheus-stack Prometheus and uses custom pricing derived from - # Hetzner Cloud CX33 rates (€0.0117/hr for 3 vCPU / 8 GB RAM). + # Hetzner Cloud CX33 rates (€6.49/month for 4 vCPU / 8 GB / 80 GB). values: opencost: prometheus: @@ -39,32 +39,40 @@ spec: enabled: true url: "http://kube-prometheus-stack-prometheus.monitoring.svc.cluster.local:9090" - # Hetzner Cloud custom pricing β€” CX33 rates decomposed into - # per-resource-unit USD costs (EUR/USD β‰ˆ 1.09). - # CX33: €0.0117/hr β†’ $0.01275/hr β†’ $9.31/month per server, 50/50 CPU-RAM split. + # Hetzner Cloud custom pricing β€” CX33 monthly cap decomposed into + # per-resource-unit USD costs. CX33 spec verified live with + # `kubectl get nodes`: 4 vCPU, 7916176 KiB RAM (8 GB nominal), 80 GB NVMe. + # Price source: Hetzner price-adjustment doc, effective 2026-04-01: + # https://docs.hetzner.com/general/infrastructure-and-availability/price-adjustment/ + # CX33 cap = €6.49 / server / month β†’ $7.01 at EUR/USD β‰ˆ 1.08 + # Volumes = €0.0572 / GB / month β†’ $0.0618 / GB / month # # IMPORTANT: OpenCost interprets CPU / spotCPU / RAM / spotRAM / GPU / storage # in the costModel ConfigMap as USD PER MONTH and divides by HoursPerMonth=730 # to get an hourly rate (opencost providerconfig.go:188, customprovider.go:95). # Network egress fields are passed through as-is (USD per GB transferred). - # Per-server monthly: $9.31 / 2 = $4.655 each for CPU and RAM. - # CPU: $4.655 / 3 vCPU β‰ˆ $1.5517 / vCPU-month - # RAM: $4.655 / 8 GB β‰ˆ $0.5819 / GB-month - # storage: Hetzner Cloud Volume β‰ˆ €0.044/GB-month β†’ β‰ˆ $0.048 / GB-month - # https://www.hetzner.com/cloud#pricing + # + # 50/50 CPU-RAM split of the $7.01/server/month server cost (Hetzner does + # not publish a CPU/RAM breakdown β€” this is an allocation convention): + # CPU: $7.01 Γ— 0.5 / 4 vCPU β‰ˆ $0.876 / vCPU-month + # RAM: $7.01 Γ— 0.5 / 8 GB β‰ˆ $0.438 / GB-month + # + # End-to-end sanity check (1 vCPU for 1 hour): + # ConfigMap CPU = 0.876 β†’ OpenCost / 730 = $0.00120 / vCPU-hour + # Real cost = (€6.49 Γ— 0.5 / 4 vCPU / 730 hr) Γ— 1.08 = $0.00120 / vCPU-hour βœ“ # https://www.opencost.io/docs/configuration/on-prem#custom-pricing-using-the-opencost-helm-chart customPricing: enabled: true createConfigmap: true provider: custom costModel: - description: "Hetzner Cloud CX33 β€” 3 vCPU / 8 GB / 80 GB NVMe (50/50 CPU-RAM split, USD/month)" - CPU: 1.5517 + description: "Hetzner Cloud CX33 β€” 4 vCPU / 8 GB / 80 GB NVMe (50/50 CPU-RAM split, USD/month)" + CPU: 0.876 spotCPU: 0 - RAM: 0.5819 + RAM: 0.438 spotRAM: 0 GPU: 0 - storage: 0.048 + storage: 0.0618 # Egress: passed through as USD per GB transferred; CX33 includes # 20 TB/month free, overage β‰ˆ $0.001/GB on Hetzner Cloud. zoneNetworkEgress: 0.001 From cb791c6f9d3a78d9f92eddfd358690374c2c0a20 Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Thu, 28 May 2026 19:32:04 +0200 Subject: [PATCH 3/5] fix(opencost): use Hetzner pricing API values and ECB FX rate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > πŸ€– Generated by the Daily AI Assistant Replaced hand-edited assumptions with values pulled directly from the Hetzner Cloud Pricing API (`GET /v1/pricing`, location fsn1) and the ECB EURβ†’USD reference rate for 2026-05-27. API-verified (net of VAT): CX33 cap = €6.49 / server / month (hourly €0.0104) Volumes = €0.0572 / GB / month Egress = €1.00 / TB overage (€0.001 / GB; 20 TiB incl. per server) FX (ECB reference, 2026-05-27): 1.1637 EUR/USD. The previous 1.08 assumption was 8% low. Re-derived (50/50 CPU-RAM split, unchanged convention): €6.49 Γ— 1.1637 = $7.5524 / server / month CPU = $7.5524 Γ— 0.5 / 4 vCPU β‰ˆ $0.9441 / vCPU-month (was 0.876) RAM = $7.5524 Γ— 0.5 / 8 GB β‰ˆ $0.4720 / GB-month (was 0.438) Vol = €0.0572 Γ— 1.1637 β‰ˆ $0.0666 / GB-month (was 0.0618) Egress = €0.001 Γ— 1.1637 β‰ˆ $0.001164 / GB (was 0.001 flat) End-to-end check (1 vCPU for 1 hour): ConfigMap CPU = 0.9441 β†’ OpenCost / 730 = $0.001293 / vCPU-hour Real cost = (€6.49 Γ— 0.5 / 4 vCPU / 730 hr) Γ— 1.1637 = €0.001112 Γ— 1.1637 = $0.001294 / vCPU-hour βœ“ Using net (excl. VAT) because VAT is location-dependent (DK = 25%) and typically reclaimable for businesses; tracking it would conflate compute cost with tax overhead. Gross is +25% on every figure. Validated with `ksail workload validate` on both clusters/local and clusters/prod (256 files each). --- .../controllers/opencost/helm-release.yaml | 45 +++++++++++-------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml b/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml index 8efe95c0d..525b4f652 100644 --- a/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml +++ b/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml @@ -42,42 +42,51 @@ spec: # Hetzner Cloud custom pricing β€” CX33 monthly cap decomposed into # per-resource-unit USD costs. CX33 spec verified live with # `kubectl get nodes`: 4 vCPU, 7916176 KiB RAM (8 GB nominal), 80 GB NVMe. - # Price source: Hetzner price-adjustment doc, effective 2026-04-01: - # https://docs.hetzner.com/general/infrastructure-and-availability/price-adjustment/ - # CX33 cap = €6.49 / server / month β†’ $7.01 at EUR/USD β‰ˆ 1.08 - # Volumes = €0.0572 / GB / month β†’ $0.0618 / GB / month + # Price source: Hetzner Cloud Pricing API (2026-05, location fsn1, net + # of VAT β€” gross is +25% but VAT is reclaimable / location-dependent and + # tracking it in OpenCost would conflate compute cost with tax overhead): + # curl -H "Authorization: Bearer $HCLOUD_TOKEN" \ + # https://api.hetzner.cloud/v1/pricing + # CX33 cap = €6.49 / server / month (hourly €0.0104) + # Volumes = €0.0572 / GB / month + # Egress = €1.00 / TB overage (€0.001 / GB; 20 TiB incl. per server) + # FX: ECB EURβ†’USD reference rate 2026-05-27 = 1.1637. # # IMPORTANT: OpenCost interprets CPU / spotCPU / RAM / spotRAM / GPU / storage # in the costModel ConfigMap as USD PER MONTH and divides by HoursPerMonth=730 # to get an hourly rate (opencost providerconfig.go:188, customprovider.go:95). # Network egress fields are passed through as-is (USD per GB transferred). # - # 50/50 CPU-RAM split of the $7.01/server/month server cost (Hetzner does - # not publish a CPU/RAM breakdown β€” this is an allocation convention): - # CPU: $7.01 Γ— 0.5 / 4 vCPU β‰ˆ $0.876 / vCPU-month - # RAM: $7.01 Γ— 0.5 / 8 GB β‰ˆ $0.438 / GB-month + # Derivation: + # €6.49/server/month Γ— 1.1637 = $7.5524/server/month + # 50/50 CPU-RAM split (Hetzner does not publish a breakdown β€” convention): + # CPU: $7.5524 Γ— 0.5 / 4 vCPU β‰ˆ $0.9441 / vCPU-month + # RAM: $7.5524 Γ— 0.5 / 8 GB β‰ˆ $0.4720 / GB-month + # Volume: €0.0572 Γ— 1.1637 β‰ˆ $0.0666 / GB-month + # Egress: €0.001 Γ— 1.1637 β‰ˆ $0.001164 / GB # # End-to-end sanity check (1 vCPU for 1 hour): - # ConfigMap CPU = 0.876 β†’ OpenCost / 730 = $0.00120 / vCPU-hour - # Real cost = (€6.49 Γ— 0.5 / 4 vCPU / 730 hr) Γ— 1.08 = $0.00120 / vCPU-hour βœ“ + # ConfigMap CPU = 0.9441 β†’ OpenCost / 730 = $0.001293 / vCPU-hour + # Real cost = (€6.49 Γ— 0.5 / 4 vCPU / 730 hr) Γ— 1.1637 + # = €0.001112 Γ— 1.1637 = $0.001294 / vCPU-hour βœ“ # https://www.opencost.io/docs/configuration/on-prem#custom-pricing-using-the-opencost-helm-chart customPricing: enabled: true createConfigmap: true provider: custom costModel: - description: "Hetzner Cloud CX33 β€” 4 vCPU / 8 GB / 80 GB NVMe (50/50 CPU-RAM split, USD/month)" - CPU: 0.876 + description: "Hetzner Cloud CX33 β€” 4 vCPU / 8 GB / 80 GB NVMe (50/50 CPU-RAM split, USD/month net of VAT)" + CPU: 0.9441 spotCPU: 0 - RAM: 0.438 + RAM: 0.4720 spotRAM: 0 GPU: 0 - storage: 0.0618 + storage: 0.0666 # Egress: passed through as USD per GB transferred; CX33 includes - # 20 TB/month free, overage β‰ˆ $0.001/GB on Hetzner Cloud. - zoneNetworkEgress: 0.001 - regionNetworkEgress: 0.001 - internetNetworkEgress: 0.001 + # 20 TiB/month free, overage β‰ˆ €1.00/TB = $0.001164/GB. + zoneNetworkEgress: 0.001164 + regionNetworkEgress: 0.001164 + internetNetworkEgress: 0.001164 exporter: replicas: 1 From ffee3d1afe8dc2aa4cffd49dcaf6d6e6cd9e03d3 Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Thu, 28 May 2026 19:37:18 +0200 Subject: [PATCH 4/5] fix(opencost): raise exporter memory request to observed baseline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > πŸ€– Generated by the Daily AI Assistant Per review: the request was 55Mi but the exporter idles ~75Mi (kubectl top), so the scheduler under-reserved its baseline and the pod would be a prime eviction candidate under node memory pressure. Raise the request to 128Mi (above observed idle, below the 512Mi limit). --- .../infrastructure/controllers/opencost/helm-release.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml b/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml index 525b4f652..f7e384b4e 100644 --- a/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml +++ b/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml @@ -93,10 +93,13 @@ spec: resources: requests: cpu: 10m - memory: 55Mi + # Observed steady-state ~75Mi (kubectl top). Request 128Mi so the + # scheduler reserves real baseline and the pod isn't first to be + # evicted under node memory pressure. + memory: 128Mi # 256Mi OOM-killed when Headlamp issued the 14d allocation queries β€” # the cost-model engine holds the full window in memory while - # aggregating. 512Mi gives ~7Γ— headroom over idle (~75 Mi) and is + # aggregating. 512Mi gives ~4Γ— headroom over the request and is # still well under the chart's 1Gi default. limits: memory: 512Mi From 28d83b6cfd20dc9bbca5f49e08192f7188996047 Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Thu, 28 May 2026 23:30:59 +0200 Subject: [PATCH 5/5] fix(opencost): zero-downtime rollout to clear the deploy-gate teardown warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > πŸ€– Generated by the Daily AI Assistant The merge-queue "Deploy to Prod" gate (check-event-warnings, fail-on-warning) failed for this PR on a benign OpenCost rollout artifact: Killing pod/opencost-…-m9r7j Stopping container opencost SuccessfulDelete Deleted pod: opencost-…-m9r7j Warning Unhealthy pod/opencost-…-m9r7j Readiness probe failed: …:9003/healthz: connect: no route to host Root cause: the chart default rollout is maxUnavailable:1 on a single replica, so the old pod is killed the instant the new one is created. kubelet fires one last readiness probe ~1s after Cilium removes the dead pod's route β†’ "no route to host". The event lands inside the gate's 90s settle window and trips it, even though nothing is actually wrong (the pod is gone). Any OpenCost rollout (incl. this PR's memory/pricing change) reproduces it. Add a postRenderer that: 1. sets maxUnavailable: 0 (surge newβ†’Ready before old terminates; zero-downtime, matches the homepage/headlamp convention), and 2. adds preStop.sleep: 15s on the opencost container so it keeps serving :9003 during drain β€” kubelet's probes land on a live endpoint instead of a torn-down route. Native sleep lifecycle action (GA since k8s 1.30; cluster is 1.32), so no shell is needed in the distroless image. Validated: `ksail workload validate` (local + prod, 256 files each); the strategy + preStop.sleep accepted by the live 1.32 API via `kubectl apply --dry-run=server`. --- .../controllers/opencost/helm-release.yaml | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml b/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml index f7e384b4e..ab4e7c98e 100644 --- a/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml +++ b/k8s/bases/infrastructure/controllers/opencost/helm-release.yaml @@ -25,6 +25,45 @@ spec: sourceRef: kind: HelmRepository name: opencost + postRenderers: + # Zero-downtime, gate-clean rollout. The chart default (maxUnavailable: 1 on + # a single replica) kills the old pod the instant the new one is created; + # kubelet then fires one last readiness probe ~1s after Cilium tears down + # the dead pod's route, emitting `Unhealthy: …:9003/healthz: connect: no + # route to host`. That one-shot teardown warning trips the merge-queue + # deploy gate (.github/actions/check-event-warnings) even though it is + # harmless. Two mitigations: + # 1. maxUnavailable: 0 β€” surge the new pod to Ready before the old is + # terminated (matches the homepage/headlamp convention). + # 2. preStop.sleep β€” keep the opencost container serving :9003 for 15s + # after it is marked for deletion, so kubelet's probes during drain + # land on a live endpoint instead of a torn-down route. Native sleep + # action (GA since k8s 1.30; cluster is 1.32) β€” no shell needed in the + # distroless image. + - kustomize: + patches: + - target: + kind: Deployment + name: opencost + patch: | + apiVersion: apps/v1 + kind: Deployment + metadata: + name: opencost + spec: + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + template: + spec: + containers: + - name: opencost + lifecycle: + preStop: + sleep: + seconds: 15 # https://github.com/opencost/opencost-helm-chart/blob/main/charts/opencost/values.yaml # # Lightweight FinOps cost allocation. Points at the existing