Skip to content

feat(kubernetes): expose tenant apiserver authentication in app values - #3123

Merged
Aleksei Sviridkin (lexfrei) merged 1 commit into
mainfrom
feat/kubernetes-apiserver-authentication
Jun 29, 2026
Merged

Aleksei Sviridkin (lexfrei) merged 1 commit into
mainfrom
feat/kubernetes-apiserver-authentication

Conversation

@lexfrei

@lexfrei Aleksei Sviridkin (lexfrei) commented Jun 28, 2026 •

Copy link
Copy Markdown
Contributor

What this PR does

The managed Kubernetes app (Kamaji-backed tenant control planes) exposed no way to configure the tenant kube-apiserver authentication through the application values — there was no knob for OIDC, the structured AuthenticationConfiguration, extra apiserver flags, or extra volumes. The only workaround was patching the underlying KamajiControlPlane out-of-band, which is invisible to GitOps and lost when the cluster is recreated from values.

This adds three opt-in fields under controlPlane.apiServer, all empty by default so existing clusters render unchanged:

  • extraArgs → KamajiControlPlane.spec.apiServer.extraArgs
  • extraVolumeMounts → spec.apiServer.extraVolumeMounts
  • extraVolumes → appended to spec.deployment.extraVolumes

This unblocks OIDC SSO via the --oidc-* flags and, more importantly, structured authentication: --authentication-config mounted from a ConfigMap/Secret plus --requestheader-uid-headers, which is the only way to map a user UID for aggregated/extension apiservers.

Because the control-plane Deployment runs on the management cluster, the passthrough is validated to keep tenant and management isolated: extraVolumes accept only configMap/secret sources (host-reaching sources such as hostPath/csi and token projection via projected are rejected); each volume needs a unique, non-empty name and exactly one source; the reserved talos-ca/talos-tls-cert names are rejected; and each extraVolumeMount must reference a user-declared extraVolume, so the chart-managed talos secret volumes cannot be mounted. Secret/ConfigMap references resolve in the tenant's own management-side namespace and are intentionally allowed — this stays within the tenant's existing security domain.

Generated artifacts (values.schema.json, README, Go types + deepcopy, ApplicationDefinition) are regenerated from the values annotations. Helm unit tests cover the default no-op render, each field's passthrough, and every rejection path.

Addresses #3074.

Screenshots

N/A — no UI changes.

Release note

feat(kubernetes): expose tenant apiserver authentication via controlPlane.apiServer.extraArgs / extraVolumes / extraVolumeMounts, enabling OIDC and structured AuthenticationConfiguration on tenant clusters

Summary by CodeRabbit

  • New Features

    • Added support for customizing the Kubernetes API server with extra command-line arguments, additional volume mounts, and extra volumes.
    • Updated chart values and schema so these options can be configured directly.
  • Bug Fixes

    • Added validation to prevent invalid or conflicting volume names and disallowed volume sources.
    • Ensured mounts only reference declared extra volumes and reserved control-plane names can’t be overridden.
  • Tests

    • Added coverage for default behavior, valid customization paths, and invalid configuration scenarios.

Tenant Kubernetes clusters had no way to configure the kube-apiserver
authentication through the app values: no knob for OIDC, the structured
AuthenticationConfiguration, extra apiserver flags, or extra volumes.
The only workaround was patching the underlying KamajiControlPlane
out-of-band, which is invisible to GitOps and lost on recreation.

Add three opt-in fields under controlPlane.apiServer, all empty by
default so existing clusters render unchanged:

- extraArgs        -> KamajiControlPlane spec.apiServer.extraArgs
- extraVolumeMounts -> spec.apiServer.extraVolumeMounts
- extraVolumes     -> appended to spec.deployment.extraVolumes

This unblocks OIDC SSO via the --oidc-* flags and, more importantly,
structured authentication: --authentication-config mounted from a
ConfigMap/Secret plus --requestheader-uid-headers, which is the only
way to map a user UID for aggregated/extension apiservers.

Because the control-plane Deployment runs on the management cluster,
the passthrough is validated to preserve tenant<->management isolation:

- extraVolumes allow only configMap and secret sources; host-reaching
  sources (hostPath, csi, nfs, persistentVolumeClaim) and token
  projection (projected) are rejected, so a tenant with self-service
  access to the Kubernetes CR cannot mount management-node paths or
  project arbitrary tokens into the apiserver pod.
- each extraVolume must have a unique, non-empty name and exactly one
  source; the reserved names talos-ca and talos-tls-cert are rejected
  to avoid a duplicate volume name in the rendered podspec.
- each extraVolumeMount must reference a user-declared extraVolume; the
  chart-managed talos secret volumes cannot be mounted.

Regenerate values.schema.json, README, the Go types and deepcopy, and
the ApplicationDefinition. Add helm unittest coverage for the default
(no-op) render, each field's passthrough, the name/source guards, and
the mount-reference guard (valid and rejected inputs).

Assisted-By: Claude <[email protected]>
Signed-off-by: Aleksei Sviridkin <[email protected]>
@github-actions github-actions Bot added size/XL This PR changes 500-999 lines, ignoring generated files area/kubernetes Issues or PRs related to the tenant Kubernetes app kind/feature Categorizes issue or PR as related to a new feature labels Jun 28, 2026
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request enhances the managed Kubernetes app by providing necessary configuration knobs for tenant kube-apiserver authentication. By exposing extraArgs, extraVolumes, and extraVolumeMounts, users can now configure OIDC SSO and structured AuthenticationConfiguration directly through application values, eliminating the need for out-of-band patching. The changes include robust validation logic to maintain security boundaries between the management and tenant clusters.

Highlights

  • Configuration Exposure: Added three new fields to controlPlane.apiServer (extraArgs, extraVolumes, extraVolumeMounts) to allow configuration of tenant kube-apiserver authentication, enabling OIDC and structured AuthenticationConfiguration.
  • Security & Isolation: Implemented strict validation for extraVolumes and extraVolumeMounts to ensure tenant isolation, restricting volume sources to configMap and secret and preventing the mounting of reserved chart-managed volumes.
  • Testing & Documentation: Added comprehensive Helm unit tests to verify the new configuration passthrough and rejection paths, and updated the README and schema to reflect the new fields.
New Features

🧠 You can now enable Memory (public preview) to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Ignored Files
  • Ignored by pattern: **/zz_generated.*.go (1)
    • api/apps/v1alpha1/kubernetes/zz_generated.deepcopy.go
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment Gemini (@gemini-code-assist) Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize the Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counterproductive. You can react with 👍 and 👎 on Gemini (@gemini-code-assist) comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩

@coderabbitai

coderabbitai Bot commented Jun 28, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds three optional fields—extraArgs, extraVolumeMounts, and extraVolumes—to the APIServer configuration in the Kubernetes app. Changes span the Go API type and deepcopy, Helm chart values/schema/template with input validation guards, Helm chart tests, README documentation, and the kubernetes-rd ApplicationDefinition schema.

Changes

APIServer Extension Fields

Layer / File(s) Summary
Go type and deepcopy
api/apps/v1alpha1/kubernetes/types.go, api/apps/v1alpha1/kubernetes/zz_generated.deepcopy.go
Three fields (ExtraArgs []string, ExtraVolumeMounts []k8sRuntime.RawExtension, ExtraVolumes []k8sRuntime.RawExtension) added to APIServer struct with kubebuilder markers and JSON tags; deepcopy updated to handle all three.
Helm values, schema, and defaults
packages/apps/kubernetes/values.yaml, packages/apps/kubernetes/values.schema.json
Default empty arrays added in values.yaml for all three fields; values.schema.json extended with extraArgs (array of strings) and extraVolumeMounts/extraVolumes (arrays of objects with preserved unknown fields).
Helm template validation and rendering
packages/apps/kubernetes/templates/cluster.yaml
Pre-render guards validate name non-emptiness, reserved name conflicts (talos-ca, talos-tls-cert), uniqueness, allowed source types (configMap, secret only), exactly-one-source rule, and mount-to-volume reference integrity. Passing values are rendered into spec.apiServer.extraArgs, spec.apiServer.extraVolumeMounts, and spec.deployment.extraVolumes.
Helm chart tests
packages/apps/kubernetes/tests/apiserver_authentication_test.yaml
New test suite covering default rendering (fields absent), passthrough assertions for all three fields, and failedTemplate guard tests for all validation paths.
README docs and RD schema
packages/apps/kubernetes/README.md, packages/system/kubernetes-rd/cozyrds/kubernetes.yaml
README parameter table updated with new rows and constraint descriptions; kubernetes-rd openAPISchema and keysOrder updated to include the new fields.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

Suggested labels

kind/api-change

Suggested reviewers

  • kvaps
  • lllamnyp
  • androndo
  • IvanHunters
  • sircthulhu

🐇 Three new fields hop into the spec,
extraArgs, volumes, mounts — what's next?
Reserved names blocked, sources checked twice,
The rabbit ensures your config is nice.
Helm guards the gate, tests confirm the route —
No hostPath sneaks in, that's without a doubt! 🌿

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: adding tenant apiserver authentication-related configuration to app values.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/kubernetes-apiserver-authentication

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request adds support for custom API Server configuration in the tenant Kubernetes cluster by introducing extraArgs, extraVolumes, and extraVolumeMounts fields. These fields allow configuring OIDC SSO or structured authentication. Strict validation is added to the Helm templates to ensure tenant isolation by restricting volume sources to configMap and secret only, and rejecting host-reaching or token-projection sources. The changes are fully documented, reflected in the schemas, and covered by a new test suite. There are no review comments to address, so no additional feedback is provided.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/apps/kubernetes/templates/cluster.yaml`:
- Around line 212-239: The extra volume validation in cluster.yaml should reject
Kubernetes-invalid names during render, not just empty/reserved/duplicate ones.
In the extraVolumes loop, validate $volName against the pod-spec DNS_LABEL rules
before appending it to $userVolumeNames, and fail with a clear message if it is
invalid. Keep the check alongside the existing name validation in the
controlPlane.apiServer.extraVolumes block so malformed names are caught early.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: a3566319-2fe4-4e76-a7e9-6bac437bfd36

📥 Commits

Reviewing files that changed from the base of the PR and between f5c408d and 243ce65.

📒 Files selected for processing (8)
  • api/apps/v1alpha1/kubernetes/types.go
  • api/apps/v1alpha1/kubernetes/zz_generated.deepcopy.go
  • packages/apps/kubernetes/README.md
  • packages/apps/kubernetes/templates/cluster.yaml
  • packages/apps/kubernetes/tests/apiserver_authentication_test.yaml
  • packages/apps/kubernetes/values.schema.json
  • packages/apps/kubernetes/values.yaml
  • packages/system/kubernetes-rd/cozyrds/kubernetes.yaml

Comment on lines +212 to +239
{{- $volName := $vol.name | default "" | toString }}
{{- if eq $volName "" }}
{{- fail (printf "controlPlane.apiServer.extraVolumes[%d]: every volume must set a non-empty name" $i) }}
{{- end }}
{{- if has $volName $reservedVolumeNames }}
{{- fail (printf "controlPlane.apiServer.extraVolumes: volume name %q is reserved by the chart for the talos control-plane secrets — rename your volume to avoid a duplicate volume name in the control-plane Deployment" $volName) }}
{{- end }}
{{- if has $volName $userVolumeNames }}
{{- fail (printf "controlPlane.apiServer.extraVolumes: duplicate volume name %q — each extra volume must have a unique name" $volName) }}
{{- end }}
{{- $userVolumeNames = append $userVolumeNames $volName }}
{{- $sources := without (keys $vol) "name" | sortAlpha }}
{{- if ne (len $sources) 1 }}
{{- fail (printf "controlPlane.apiServer.extraVolumes: volume %q must declare exactly one volume source, got %d (%v)" $volName (len $sources) $sources) }}
{{- end }}
{{- range $source := $sources }}
{{- if not (has $source $allowedVolumeSources) }}
{{- fail (printf "controlPlane.apiServer.extraVolumes: volume %q uses a %q source, which is not permitted on a management-cluster control-plane pod — only configMap and secret sources are allowed" $volName $source) }}
{{- end }}
{{- end }}
{{- end }}
{{- range $i, $mount := .Values.controlPlane.apiServer.extraVolumeMounts }}
{{- $mountName := $mount.name | default "" | toString }}
{{- if eq $mountName "" }}
{{- fail (printf "controlPlane.apiServer.extraVolumeMounts[%d]: every mount must set a non-empty name" $i) }}
{{- end }}
{{- if not (has $mountName $userVolumeNames) }}
{{- fail (printf "controlPlane.apiServer.extraVolumeMounts: mount %q references no volume declared in controlPlane.apiServer.extraVolumes — the chart-managed talos volumes cannot be mounted" $mountName) }}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Reject invalid Kubernetes volume names during render.

extraVolumes only checks for non-empty, reserved, and duplicate names. Names that violate the pod-spec DNS_LABEL rules still render and then fail later during reconciliation, which weakens the whole “fail early” validation block. Validate $volName before adding it to $userVolumeNames.

Suggested fix
 {{-   $volName := $vol.name | default "" | toString }}
 {{-   if eq $volName "" }}
 {{-     fail (printf "controlPlane.apiServer.extraVolumes[%d]: every volume must set a non-empty name" $i) }}
 {{-   end }}
+{{-   if or (gt (len $volName) 63) (not (regexMatch "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" $volName)) }}
+{{-     fail (printf "controlPlane.apiServer.extraVolumes[%d]: volume name %q must be a valid DNS label" $i $volName) }}
+{{-   end }}
 {{-   if has $volName $reservedVolumeNames }}
 {{-     fail (printf "controlPlane.apiServer.extraVolumes: volume name %q is reserved by the chart for the talos control-plane secrets — rename your volume to avoid a duplicate volume name in the control-plane Deployment" $volName) }}
 {{-   end }}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{{- $volName := $vol.name | default "" | toString }}
{{- if eq $volName "" }}
{{- fail (printf "controlPlane.apiServer.extraVolumes[%d]: every volume must set a non-empty name" $i) }}
{{- end }}
{{- if has $volName $reservedVolumeNames }}
{{- fail (printf "controlPlane.apiServer.extraVolumes: volume name %q is reserved by the chart for the talos control-plane secrets — rename your volume to avoid a duplicate volume name in the control-plane Deployment" $volName) }}
{{- end }}
{{- if has $volName $userVolumeNames }}
{{- fail (printf "controlPlane.apiServer.extraVolumes: duplicate volume name %q — each extra volume must have a unique name" $volName) }}
{{- end }}
{{- $userVolumeNames = append $userVolumeNames $volName }}
{{- $sources := without (keys $vol) "name" | sortAlpha }}
{{- if ne (len $sources) 1 }}
{{- fail (printf "controlPlane.apiServer.extraVolumes: volume %q must declare exactly one volume source, got %d (%v)" $volName (len $sources) $sources) }}
{{- end }}
{{- range $source := $sources }}
{{- if not (has $source $allowedVolumeSources) }}
{{- fail (printf "controlPlane.apiServer.extraVolumes: volume %q uses a %q source, which is not permitted on a management-cluster control-plane pod — only configMap and secret sources are allowed" $volName $source) }}
{{- end }}
{{- end }}
{{- end }}
{{- range $i, $mount := .Values.controlPlane.apiServer.extraVolumeMounts }}
{{- $mountName := $mount.name | default "" | toString }}
{{- if eq $mountName "" }}
{{- fail (printf "controlPlane.apiServer.extraVolumeMounts[%d]: every mount must set a non-empty name" $i) }}
{{- end }}
{{- if not (has $mountName $userVolumeNames) }}
{{- fail (printf "controlPlane.apiServer.extraVolumeMounts: mount %q references no volume declared in controlPlane.apiServer.extraVolumes — the chart-managed talos volumes cannot be mounted" $mountName) }}
{{- $volName := $vol.name | default "" | toString }}
{{- if eq $volName "" }}
{{- fail (printf "controlPlane.apiServer.extraVolumes[%d]: every volume must set a non-empty name" $i) }}
{{- end }}
{{- if or (gt (len $volName) 63) (not (regexMatch "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" $volName)) }}
{{- fail (printf "controlPlane.apiServer.extraVolumes[%d]: volume name %q must be a valid DNS label" $i $volName) }}
{{- end }}
{{- if has $volName $reservedVolumeNames }}
{{- fail (printf "controlPlane.apiServer.extraVolumes: volume name %q is reserved by the chart for the talos control-plane secrets — rename your volume to avoid a duplicate volume name in the control-plane Deployment" $volName) }}
{{- end }}
{{- if has $volName $userVolumeNames }}
{{- fail (printf "controlPlane.apiServer.extraVolumes: duplicate volume name %q — each extra volume must have a unique name" $volName) }}
{{- end }}
{{- $userVolumeNames = append $userVolumeNames $volName }}
{{- $sources := without (keys $vol) "name" | sortAlpha }}
{{- if ne (len $sources) 1 }}
{{- fail (printf "controlPlane.apiServer.extraVolumes: volume %q must declare exactly one volume source, got %d (%v)" $volName (len $sources) $sources) }}
{{- end }}
{{- range $source := $sources }}
{{- if not (has $source $allowedVolumeSources) }}
{{- fail (printf "controlPlane.apiServer.extraVolumes: volume %q uses a %q source, which is not permitted on a management-cluster control-plane pod — only configMap and secret sources are allowed" $volName $source) }}
{{- end }}
{{- end }}
{{- end }}
{{- range $i, $mount := .Values.controlPlane.apiServer.extraVolumeMounts }}
{{- $mountName := $mount.name | default "" | toString }}
{{- if eq $mountName "" }}
{{- fail (printf "controlPlane.apiServer.extraVolumeMounts[%d]: every mount must set a non-empty name" $i) }}
{{- end }}
{{- if not (has $mountName $userVolumeNames) }}
{{- fail (printf "controlPlane.apiServer.extraVolumeMounts: mount %q references no volume declared in controlPlane.apiServer.extraVolumes — the chart-managed talos volumes cannot be mounted" $mountName) }}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/apps/kubernetes/templates/cluster.yaml` around lines 212 - 239, The
extra volume validation in cluster.yaml should reject Kubernetes-invalid names
during render, not just empty/reserved/duplicate ones. In the extraVolumes loop,
validate $volName against the pod-spec DNS_LABEL rules before appending it to
$userVolumeNames, and fail with a clear message if it is invalid. Keep the check
alongside the existing name validation in the
controlPlane.apiServer.extraVolumes block so malformed names are caught early.

@myasnikovdaniil myasnikovdaniil left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM on the code.

Default render is unchanged: every new block is {{- with <empty list> }} or a range over an empty list, so with the default values the rendered KamajiControlPlane/Deployment is identical to main. The volume source allow-list (configMap/secret only; rejects hostPath/csi/nfs/pvc/projected/emptyDir) is the isolation control that matters, and each rejection path is unit-tested; secret/configMap references are namespace-local, so there is no cross-tenant reach. Generated code is in sync.

Note on CI: the earlier E2E failure was the kubernetes-latest bringup (apiserver readyz connection-refused / liveness 403), which is unrelated to this change — the e2e tenant never sets the new fields, so its render is byte-identical to main. It is re-running now; please confirm it goes green before merge.

Non-blocking:

  • The CodeRabbit suggestion to validate volume names as DNS labels at render time is worth taking — it keeps the fail-early block from letting a malformed name through to an opaque apply-time error.
  • extraArgs is an unvalidated passthrough. Acceptable (it is the tenant's own control plane, and the pod is NetworkPolicy-restricted to etcd), but a docs note that it is an advanced, unguarded knob would help.
  • See the inline note on the reserved-name guard.

{{- if eq $volName "" }}
{{- fail (printf "controlPlane.apiServer.extraVolumes[%d]: every volume must set a non-empty name" $i) }}
{{- end }}
{{- if has $volName $reservedVolumeNames }}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Observation, not a blocker. This rejects the volume names talos-ca/talos-tls-cert, but not the referenced secretName — a tenant can still mount the chart-managed secrets (<release>-talos-ca, <release>-talos-tls-cert, <release>-talos-secrets) from a differently-named volume. I could not turn this into an exfiltration: the control-plane pod runs on the management cluster where the tenant has no exec/filesystem access, and these are the tenant's own cluster secrets, so mounting is not reading. Worth either a one-line note documenting the trust boundary, or also rejecting references to the reserved secret names, as defense-in-depth.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/kubernetes Issues or PRs related to the tenant Kubernetes app kind/feature Categorizes issue or PR as related to a new feature size/XL This PR changes 500-999 lines, ignoring generated files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants