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:
issuerUrltailscale.hostnametailscale.tagtailscale.oauthSecret.nametailscale.stateSecret.nameserviceAccount.*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
funnelnode attribute - single-replica installs use a
Recreatestrategy 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:
- confirm the pod reaches
Ready - fetch public discovery and JWKS
- compare public JWKS keys with the internal cluster JWKS
- retry one real
AssumeRoleWithWebIdentitypath