Skip to content

chart: sync the Ingress TLS certificate from Key Vault for estates without the app routing add-on #130

Open

Description

@sierragolflima

Situation

The chart's Ingress objects name ingress.tlsSecret and carry the annotation
kubernetes.azure.com/tls-cert-keyvault-uri. Only the AKS app routing add-on turns that annotation
into the Secret. An estate that serves the Ingress objects with ingress-nginx (its own controllers
behind internal load balancers) has no component that creates the Secret, so it is created by hand
from the vault certificate, and it is created again by hand after a reset (namespace deleted) and
at every certificate renewal.

The chart already runs the Key Vault CSI driver for the environment values: memex.keyVaultClasses
renders a SecretProviderClass per class with secretObjects of type Opaque
(templates/memex-portal/secretproviderclass.yaml).

Proposal

An opt-in value, for example ingress.tlsFromKeyVault.certificate: <vault certificate object>,
that renders a second SecretProviderClass (or extends the existing one) with a secretObjects
entry of type kubernetes.io/tls, mapping the certificate object (objectType secret, PEM) to
tls.crt and tls.key under the name ingress.tlsSecret, mounted on the portal pod so that the
driver creates and rotates the Secret. Renewal in the vault then reaches the Secret within the
driver's rotation interval, and a reset needs no hand step.

Acceptance

  • On an estate with ingress-nginx and the value set, a fresh namespace receives the TLS Secret from
    the chart alone, and the served chain includes the intermediate certificate.
  • A new version of the vault certificate reaches the Secret without a deploy.
  • Estates with the app routing add-on are unchanged (value unset by default).

Documented departure on the affected estate: its deviations record names the hand step and this
chart change as the route to retire it.

Activity

  1. added
    sev:MMedium - secondary path broken, or easy workaround
    on Nov 2, 2026
  2. rbuergi commented on Nov 5, 2026

    @rbuergi
    Contributor

    Status: the chart half is merged on main in #131 (merge commit e92f8ab).

    • Opt-in value ingress.tlsFromKeyVault.certificate renders templates/memex-portal/ingress-tls-secretproviderclass.yaml: a SecretProviderClass with a kubernetes.io/tls secretObject named ingress.tlsSecret. Both tls.key and tls.crt come from the certificate object read as objectType: secret, which is its PEM bundle including the chain. The portal pod mounts it.
    • Unset by default: estates on the app routing add-on render byte-identically.
    • check-chart-invariants.sh carries the fixture values.ingress-tls-keyvault.yaml with a by-name evidence check, plus refusal controls for a second writer (cert-manager issuer). Re-rendered locally from today's main: the SPC, the ingress-tls CSI volume and mount, and meshweaver.io/tls-secret: "key-vault" are all present.

    Still open, and not a code step: the acceptance on the affected estate. That estate sets ingress.tlsFromKeyVault.certificate (plus vaultName/tenantId/identityClientId, or relies on the keyVaultSecrets fallback) in its private overlay, confirms the Key Vault Secrets Provider runs with rotation enabled and the reader identity has secret GET, and deploys through its lane. Then verify that a fresh namespace gets the Secret and that the served chain includes the intermediate, and retire the hand step in its deviations record. Leaving this open until then.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestsev:MMedium - secondary path broken, or easy workaround

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions