-
Notifications
You must be signed in to change notification settings - Fork 1.2k
adds back runAsRoot in helm chart (explicit disable for OpenShift deployments) #5215
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,14 @@ | ||
| --- | ||
| title: "v2.1.28" | ||
| description: "Helm v2.1.28 changelog - 2026-07-14" | ||
| --- | ||
|
|
||
| <Update label="Bifrost Helm" description="v2.1.28"> | ||
|
|
||
| ## Changelog | ||
|
|
||
| - Restored `runAsUser: 1000` defaults in `podSecurityContext` and `securityContext` (dropped in 2.1.27). Images before v1.6.4 use a non-numeric `USER appuser`, so kubelet could not verify `runAsNonRoot: true` and pods failed with CreateContainerConfigError. OpenShift (restricted-v2) users unset the pins with explicit nulls: `podSecurityContext.runAsUser: null`, `podSecurityContext.fsGroup: null`, `securityContext.runAsUser: null`. | ||
| - Added `project_id` to `bifrost.providers.bedrock.keys[*].bedrock_key_config` (renders into `bedrock_key_config.project_id`) and `bifrost.providers.bedrock_mantle.keys[*].bedrock_mantle_key_config` (renders into `bedrock_mantle_key_config.project_id`) for AWS project scoping via the OpenAI-Project / anthropic-workspace-id headers. | ||
| - Updated the per-alias `project_id` description: it is now a shared cross-provider override (Vertex GCP project; Bedrock/Bedrock Mantle AWS project header). | ||
|
|
||
| </Update> |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -4,12 +4,30 @@ | |||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| Official Helm charts for deploying [Bifrost](https://github.com/maximhq/bifrost) - a high-performance AI gateway with unified interface for multiple providers. | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| **Latest Version:** 2.1.27 | ||||||||||||||||||||||||||||||||||||||||||||||
| **Latest Version:** 2.1.28 | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| ## Changelog | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| ### 2.1.28 | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - Restored `runAsUser: 1000` defaults in `podSecurityContext` and `securityContext` (dropped in 2.1.27). Images before v1.6.4 use a non-numeric `USER appuser`, so kubelet could not verify `runAsNonRoot: true` and pods failed with CreateContainerConfigError. OpenShift (restricted-v2) users unset the pins with explicit nulls: `podSecurityContext.runAsUser: null`, `podSecurityContext.fsGroup: null`, `securityContext.runAsUser: null`. | ||||||||||||||||||||||||||||||||||||||||||||||
| - Added `project_id` to `bifrost.providers.bedrock.keys[*].bedrock_key_config` (renders into `bedrock_key_config.project_id`) and `bifrost.providers.bedrock_mantle.keys[*].bedrock_mantle_key_config` (renders into `bedrock_mantle_key_config.project_id`) for AWS project scoping via the OpenAI-Project / anthropic-workspace-id headers. | ||||||||||||||||||||||||||||||||||||||||||||||
| - Updated the per-alias `project_id` description: it is now a shared cross-provider override (Vertex GCP project; Bedrock/Bedrock Mantle AWS project header). | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| ### 2.1.27 | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| > **Known issue - use 2.1.28 instead.** This version dropped `runAsUser: 1000` | ||||||||||||||||||||||||||||||||||||||||||||||
| > from the default security contexts. With any image before v1.6.4 (including | ||||||||||||||||||||||||||||||||||||||||||||||
| > the chart's default), kubelet cannot verify `runAsNonRoot: true` against the | ||||||||||||||||||||||||||||||||||||||||||||||
| > image's non-numeric `USER appuser` and pods fail with | ||||||||||||||||||||||||||||||||||||||||||||||
| > `CreateContainerConfigError: container has runAsNonRoot and image has | ||||||||||||||||||||||||||||||||||||||||||||||
| > non-numeric user (appuser)`. If you must stay on 2.1.27, set | ||||||||||||||||||||||||||||||||||||||||||||||
| > `podSecurityContext.runAsUser: 1000` and `securityContext.runAsUser: 1000` | ||||||||||||||||||||||||||||||||||||||||||||||
| > in your values, or use image v1.6.4+. On OpenShift (restricted-v2), 2.1.27 | ||||||||||||||||||||||||||||||||||||||||||||||
| > works as-is since the SCC injects a numeric UID; pair it with image v1.6.4+ | ||||||||||||||||||||||||||||||||||||||||||||||
| > and `podSecurityContext.fsGroup: null` (see the OpenShift section under | ||||||||||||||||||||||||||||||||||||||||||||||
| > Installation). | ||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+19
to
+29
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win Correct the 2.1.27 OpenShift guidance. This says 2.1.27 “works as-is,” but the next lines require Proposed wording-> On OpenShift (restricted-v2), 2.1.27
-> works as-is since the SCC injects a numeric UID; pair it with image v1.6.4+
-> and `podSecurityContext.fsGroup: null` (see the OpenShift section under
-> Installation).
+> On OpenShift (restricted-v2), 2.1.27 still requires
+> `podSecurityContext.fsGroup: null` because its default `fsGroup: 1000` may
+> be rejected by the SCC. Use image v1.6.4+ as described in the OpenShift
+> section under Installation.📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - Added `bifrost.auditLogs.objectStorage` for archiving audit events to S3/GCS. Supports `type` (s3/gcs), `bucket`, `prefix`, `compress`, and full S3 credential fields (`region`, `endpoint`, `accessKeyId`, `secretAccessKey`, `sessionToken`, `roleArn`, `forcePathStyle`) and GCS fields (`projectId`, `credentialsJson`). Renders into `audit_logs.object_storage`. | ||||||||||||||||||||||||||||||||||||||||||||||
| - Added `bifrost.schemaUrl` to override the generated `config.json` `$schema` location for isolated deployments. It accepts HTTP(S), `file://`, or filesystem paths. When set, it is also exported as `BIFROST_SCHEMA_URL` in the pod; when empty (default), the env var is not injected and the public schema URL is used. | ||||||||||||||||||||||||||||||||||||||||||||||
| - Added `force_single_region` to `bifrost.providers.vertex.keys[*].vertex_key_config`. When `true`, skips automatic promotion of multi-region-only models to a multi-region endpoint. Enable for provisioned throughput. Renders into `vertex_key_config.force_single_region`. | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -458,24 +476,54 @@ cd bifrost/helm-charts/bifrost | |||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| ### OpenShift (restricted-v2 SCC) | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| The default install sets `podSecurityContext.fsGroup: 1000`. OpenShift's | ||||||||||||||||||||||||||||||||||||||||||||||
| `restricted-v2` SCC enforces `MustRunAs` against the namespace's allocated | ||||||||||||||||||||||||||||||||||||||||||||||
| group range and rejects that value at admission: | ||||||||||||||||||||||||||||||||||||||||||||||
| The default install pins `runAsUser: 1000` (pod and container level) and | ||||||||||||||||||||||||||||||||||||||||||||||
| `podSecurityContext.fsGroup: 1000`. The UID pin is required on vanilla | ||||||||||||||||||||||||||||||||||||||||||||||
| Kubernetes: images before v1.6.4 declare a non-numeric `USER appuser`, so | ||||||||||||||||||||||||||||||||||||||||||||||
| kubelet cannot verify `runAsNonRoot: true` without an explicit numeric UID and | ||||||||||||||||||||||||||||||||||||||||||||||
| rejects the container with: | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| ```text | ||||||||||||||||||||||||||||||||||||||||||||||
| container has runAsNonRoot and image has non-numeric user (appuser), cannot verify user is non-root | ||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| OpenShift's `restricted-v2` SCC enforces `MustRunAsRange` / `MustRunAs` | ||||||||||||||||||||||||||||||||||||||||||||||
| against the namespace's allocated UID/GID ranges and rejects those pinned | ||||||||||||||||||||||||||||||||||||||||||||||
| values at admission: | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| ```text | ||||||||||||||||||||||||||||||||||||||||||||||
| fsGroup: Invalid value: []int64{1000}: 1000 is not an allowed group | ||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| To deploy on OpenShift, clear the default `fsGroup` so the SCC can assign an | ||||||||||||||||||||||||||||||||||||||||||||||
| To deploy on OpenShift, clear all three pins so the SCC can assign an | ||||||||||||||||||||||||||||||||||||||||||||||
| in-range UID/GID: | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| ```yaml | ||||||||||||||||||||||||||||||||||||||||||||||
| podSecurityContext: | ||||||||||||||||||||||||||||||||||||||||||||||
| # Helm merges maps, so `{}` does NOT clear this — you must use null. | ||||||||||||||||||||||||||||||||||||||||||||||
| # Helm merges maps, so `{}` does NOT clear these - you must use null. | ||||||||||||||||||||||||||||||||||||||||||||||
| runAsUser: null | ||||||||||||||||||||||||||||||||||||||||||||||
| fsGroup: null | ||||||||||||||||||||||||||||||||||||||||||||||
| runAsNonRoot: true | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| securityContext: | ||||||||||||||||||||||||||||||||||||||||||||||
| runAsUser: null | ||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| Or equivalently on the command line: | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| ```bash | ||||||||||||||||||||||||||||||||||||||||||||||
| helm install bifrost bifrost/bifrost \ | ||||||||||||||||||||||||||||||||||||||||||||||
| --set image.tag=v1.6.4 \ | ||||||||||||||||||||||||||||||||||||||||||||||
| --set podSecurityContext.runAsUser=null \ | ||||||||||||||||||||||||||||||||||||||||||||||
| --set podSecurityContext.fsGroup=null \ | ||||||||||||||||||||||||||||||||||||||||||||||
| --set securityContext.runAsUser=null | ||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| Use image v1.6.4 or later on OpenShift. The SCC injects an arbitrary in-range | ||||||||||||||||||||||||||||||||||||||||||||||
| UID at admission (so `runAsNonRoot` verification always passes there), but | ||||||||||||||||||||||||||||||||||||||||||||||
| only v1.6.4+ images make the data directory group-0-owned and group-writable | ||||||||||||||||||||||||||||||||||||||||||||||
| at build time; earlier images assume UID 1000 owns `/app/data` and fail to | ||||||||||||||||||||||||||||||||||||||||||||||
| write `config.db` under an arbitrary UID. | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| The Bifrost image supports arbitrary UIDs with group 0: the data directory is | ||||||||||||||||||||||||||||||||||||||||||||||
| owned by group 0 and group-writable at build time, so the restricted-v2 UID | ||||||||||||||||||||||||||||||||||||||||||||||
| (with GID 0) can write `config.db` and `logs.db` — no custom SCC or `anyuid` is | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
Repository: maximhq/bifrost
Length of output: 11897
🌐 Web query:
AWS Bedrock workspace anthropic-work header OpenAI-Project anthropic-workspace docs💡 Result:
In Amazon Bedrock, the headers anthropic-workspace and OpenAI-Project are used to associate inference requests with specific Amazon Bedrock projects [1][2]. These headers are primarily utilized when interacting with the Bedrock Mantle (Anthropic-compatible) or OpenAI-compatible API endpoints [2][3]. Specifically: - anthropic-workspace: This header is used on the Anthropic Messages API (e.g., when calling /anthropic/v1/messages) to associate a request with a Bedrock workspace or project [2][3]. - OpenAI-Project: This header is used similarly on OpenAI-compatible API endpoints within Amazon Bedrock to associate requests with a project [2]. In the context of Amazon Bedrock, projects and workspaces are effectively the same resource [2]. These identifiers allow users to manage, organize, and track inference workloads [1][2]. It is important to distinguish this from the anthropic-beta header. While native Anthropic APIs use the anthropic-beta header, Amazon Bedrock typically requires beta features to be handled differently. For instance, many integrations and AWS SDK implementations move beta parameters into the request body (e.g., under additionalModelRequestFields or specific JSON fields) rather than passing them as HTTP headers, as headers may conflict with AWS SigV4 signing requirements [4][5].
Citations:
🏁 Script executed:
Repository: maximhq/bifrost
Length of output: 3385
Use
anthropic-workspacehere, notanthropic-workspace-id. Keep the README andhelm-charts/bifrost/values.yaml:444aligned with AWS’s header names:OpenAI-Projectfor the OpenAI-compatible surface andanthropic-workspacefor native Anthropic requests.🤖 Prompt for AI Agents
Sources: Path instructions, MCP tools
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You're right that AWS documents the header as
anthropic-workspace(https://docs.aws.amazon.com/bedrock/latest/userguide/workspaces.html: "reference them in Messages API requests using theanthropic-workspaceheader"). However, this README line intentionally documents the header Bifrost core actually sends today:core/providers/bedrock/mantle.godefinesMantleAnthropicProjectHeader = "anthropic-workspace-id", used on all native-Anthropic Mantle calls.Changing only the README would make the docs describe behavior the shipped code doesn't have. The header-name discrepancy needs to be verified and fixed core-side first (this PR only touches the helm chart); the README will be updated in lockstep with that core change. Flagging the
anthropic-workspace-idvsanthropic-workspacequestion for a follow-up core PR.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@akshaydeo, that makes sense — thanks for tracing it toMantleAnthropicProjectHeaderincore/providers/bedrock/mantle.go. Agreed this is a core-side fix, and keeping the README aligned with actual shipped behavior for now is the right call. This PR is scoped to the Helm chart, so I won't push further on this here.Would you like me to open a follow-up issue to track reconciling
anthropic-workspace-idwith AWS's documentedanthropic-workspaceheader incore/providers/bedrock/mantle.go(and updating the Helm README/values docs once that lands)? Happy to file it if so.✏️ Learnings added