Skip to main content

Helm

Use this guide when you already understand the end-to-end setup and need to deploy or update the bridge in an existing cluster.

What matters in real deployments​

The chart is intentionally small. The values that matter most are:

  • issuerUrl
  • tailscale.hostname
  • tailscale.tag
  • tailscale.oauthSecret.name
  • tailscale.stateSecret.name
  • serviceAccount.*
  • sourceIpAllowlist.*

The chart assumes:

  • the API server issuer is already configured to match issuerUrl
  • the OAuth secret already exists
  • the Tailscale tag is already allowed by the tailnet policy and has the funnel node attribute
  • single-replica installs use a Recreate strategy by default

Minimal install​

helm upgrade --install oidc-bridge oci://ghcr.io/meigma/k8s-aws-oidc-chart \
--namespace oidc-system \
--create-namespace \
--set issuerUrl=https://oidc.example.tailnet.ts.net \
--set tailscale.hostname=oidc-example \
--set tailscale.tag=tag:cat-k8s-oidc \
--set tailscale.oauthSecret.name=tailscale-oauth

Use the published OCI chart for production installs. It embeds the release image digest so the deployed image is pinned by default. A local ./chart install is still useful for development, but it falls back to the chart appVersion tag unless you set image.digest yourself.

Common adaptations​

Reuse an existing service account​

--set serviceAccount.create=false \
--set serviceAccount.name=oidc-bridge

Pin the state secret name​

--set tailscale.stateSecret.name=oidc-bridge-state

Do this if you want the bridge identity to survive redeployments cleanly and be easy to inspect.

Turn on active/passive HA​

--set replicaCount=2 \
--set leaderElection.enabled=true \
--set podDisruptionBudget.enabled=true

This keeps one active Funnel owner and one warm standby. Readiness reports healthy standbys as ready, while GET /leaderz identifies the current public-serving pod.

Turn on request allowlisting​

The bridge supports source CIDR filtering on the public listener, but it is off by default.

--set sourceIpAllowlist.enabled=true \
--set-json 'sourceIpAllowlist.cidrs=["1.2.3.0/24"]'

Use it only if you are confident the callers you care about are stable enough to allowlist.

Enforce image provenance with Kyverno​

If Kyverno 1.13 or newer is already installed, the chart can render a namespaced Policy which verifies the workload image signature and SLSA provenance before admission.

--set kyverno.enabled=true

Start with --set kyverno.validationFailureAction=Audit if you want to inspect policy results before switching to Enforce.

Upgrade checks​

Before and after an upgrade:

  1. confirm the pod reaches Ready
  2. fetch public discovery and JWKS
  3. compare public JWKS keys with the internal cluster JWKS
  4. retry one real AssumeRoleWithWebIdentity path