Skip to content

Configure Ingress

Helm creates the dashboard Ingress. The operator creates one Ingress for each controller that resolves an external host. The mite gateway remains cluster-internal.

ModeRouteUse when
subdomainhttps://<controller>.<root-domain>/Wildcard DNS and certificates are available.
pathhttps://<dashboard-host>/jenkins/<namespace>/<controller>/One hostname and shared ingress are preferred.

subdomain is the default. spec.ingressSpec.mode is immutable after controller creation.

Path mode uses the dashboard host and its TLS configuration. Do not set tlsSecretName on a path-mode controller. Varroa configures the Jenkins URL prefix automatically.

global:
domain: example.com
frontend:
host: app.example.com
ingress:
enabled: true
className: nginx
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
tls:
- hosts: [app.example.com]
secretName: varroa-dashboard-tls
auth:
dashboardUrl: https://app.example.com
cookieDomain: .example.com

Use HTTPS. Set auth.cookieDomain to the shared parent domain when dashboard authentication must work on controller subdomains.

The cluster-scoped object must be named varroa-defaults:

apiVersion: varroa.dev/v1alpha1
kind: ProvisioningDefaults
metadata:
name: varroa-defaults
spec:
rootDomain: example.com
ingressClassName: nginx
ingressAnnotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
Terminal window
kubectl apply -f defaults.yaml

A subdomain controller without an explicit host then uses <name>.example.com.

apiVersion: varroa.dev/v1alpha1
kind: Controller
metadata:
name: build
namespace: jenkins-platform
spec:
ingressSpec:
host: build.example.com
ingressClassName: nginx
tlsSecretName: build-tls
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: 512m

Controller annotations merge over ProvisioningDefaults.spec.ingressAnnotations. Controller values win on conflicts.

For path routing:

spec:
ingressSpec:
mode: path
host: app.example.com

If no host can be resolved, Varroa creates no controller Ingress and sets the informational NoExternalURL condition. The in-cluster Service and port forwarding remain available.

Terminal window
kubectl get ingress -A
kubectl get controller build -n jenkins-platform \
-o jsonpath='{.status.endpoint}{"\n"}'

Ingress host, class, annotations, and TLS changes converge without restarting Jenkins.

SymptomCheck
404 responseHost rule, ingress class, and ingress-controller events.
Login loopHTTPS, OIDC callback URL, and cookie domain.
No controller IngressrootDomain, controller host, and NoExternalURL.
Path route redirects incorrectlyDashboard host and immutable path mode.

See Network policies and Authentication.