From bf013cb6fed46d1788633c6102a302022f48f2d1 Mon Sep 17 00:00:00 2001 From: Glen Messenger Date: Tue, 29 Sep 2026 16:54:45 -0700 Subject: [PATCH] feat(helm): optional runtime AI inventory via k8s-aibom (default off) Adds k8s-aibom as an optional, condition-gated OCI dependency of litellm-helm, following the chart's existing postgresql/redis pattern. Default off; when enabled, an unprivileged controller generates a CycloneDX 1.6 ML-BOM for AI workloads in opted-in namespaces, including the LiteLLM proxy this chart deploys. Chart.lock and the bundled archive updated via helm dependency update. Signed-off-by: Glen Messenger --- helm/litellm-helm/Chart.lock | 7 +++++-- helm/litellm-helm/Chart.yaml | 4 ++++ helm/litellm-helm/README.md | 2 ++ helm/litellm-helm/charts/k8s-aibom-1.5.1.tgz | Bin 0 -> 17019 bytes helm/litellm-helm/values.yaml | 9 +++++++++ 5 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 helm/litellm-helm/charts/k8s-aibom-1.5.1.tgz diff --git a/helm/litellm-helm/Chart.lock b/helm/litellm-helm/Chart.lock index d626fbb472b..89cf3d2a7cc 100644 --- a/helm/litellm-helm/Chart.lock +++ b/helm/litellm-helm/Chart.lock @@ -5,5 +5,8 @@ dependencies: - name: redis repository: oci://registry-1.docker.io/bitnamicharts version: 18.19.1 -digest: sha256:38962e231f6596b93f82a8412bbe4cf5de696caecf5775dfbbd163383eb1c009 -generated: "2026-07-28T10:21:22.511401-07:00" +- name: k8s-aibom + repository: oci://ghcr.io/googlecloudplatform/charts + version: 1.5.1 +digest: sha256:d4621c5d49e4bb7a107e67a5272056fbd4037c262495d8c31abc150de5198cb4 +generated: "2026-09-29T16:54:10.796253-07:00" diff --git a/helm/litellm-helm/Chart.yaml b/helm/litellm-helm/Chart.yaml index a3cb388ffc6..3421e8f619a 100644 --- a/helm/litellm-helm/Chart.yaml +++ b/helm/litellm-helm/Chart.yaml @@ -39,3 +39,7 @@ dependencies: version: "18.19.1" repository: oci://registry-1.docker.io/bitnamicharts condition: redis.enabled + - name: k8s-aibom + version: "1.5.1" + repository: oci://ghcr.io/googlecloudplatform/charts + condition: k8s-aibom.enabled diff --git a/helm/litellm-helm/README.md b/helm/litellm-helm/README.md index bf4089404db..028b228a991 100644 --- a/helm/litellm-helm/README.md +++ b/helm/litellm-helm/README.md @@ -132,6 +132,8 @@ Set `billingMetrics.caSecretName` only when the collector is a private or test o | `postgresql.auth.*` | If `db.deployStandalone` is `true`, care should be taken to ensure the default `password` and `postgres-password` values are **NOT** used. | `NoTaGrEaTpAsSwOrD` | | `postgresql.image.*` | If `db.deployStandalone` is `true`, the image for the bundled Postgres. Pinned to a `docker.io/bitnamilegacy` build because Bitnami retired the versioned tags under `docker.io/bitnami`. | `bitnamilegacy/postgresql:16.2.0-debian-12-r6` | | `redis.image.*` | If `redis.enabled` is `true`, the image for the bundled Redis. Pinned to a `docker.io/bitnamilegacy` build for the same reason. | `bitnamilegacy/redis:7.2.4-debian-12-r9` | +| `k8s-aibom.enabled` | Install [k8s-aibom](https://github.com/GoogleCloudPlatform/k8s-aibom), an unprivileged controller that generates a CycloneDX 1.6 ML-BOM per AI workload at runtime (model, runtime, image digests, each with evidence and a confidence tier). Namespace opt-in: also label the namespace `aibom.k8saibom.dev/enabled=true`. | `false` | +| `k8s-aibom.*` | If `k8s-aibom.enabled` is `true`, configuration passed to the k8s-aibom chart. See its [values](https://github.com/GoogleCloudPlatform/k8s-aibom/blob/main/charts/k8s-aibom/values.yaml). | See k8s-aibom [values.yaml](https://github.com/GoogleCloudPlatform/k8s-aibom/blob/main/charts/k8s-aibom/values.yaml) | #### Bundled Postgres image diff --git a/helm/litellm-helm/charts/k8s-aibom-1.5.1.tgz b/helm/litellm-helm/charts/k8s-aibom-1.5.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..8445119b8ea12cc1357886147f9e22d0f94f40f5 GIT binary patch literal 17019 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