Configuration reference
Glowpod is configured with command-line flags. Every flag can also be set as
an environment variable: GLOWPOD_ plus the flag name in upper case with _
for -, e.g. -oidc-client-secret → GLOWPOD_OIDC_CLIENT_SECRET. A flag on
the command line wins over the variable. Put secrets in variables (from a
Kubernetes Secret), never in arguments, which other processes can read.
The Helm chart sets these variables from its values; the last column says
which value. Anything without a value can go in extraEnv or extraArgs.
glowpod -h # every flag with its default
glowpod -version
General
| Flag | Default | Helm value | What it does |
|---|---|---|---|
-mode |
local |
always server |
local: your kubeconfig, on your machine. server: in the cluster, people sign in |
-addr |
local 127.0.0.1:7171, server :8080 |
fixed :8080 |
Address to listen on. Local mode only accepts loopback addresses |
-kubeconfig |
$KUBECONFIG or ~/.kube/config |
— | Local mode: which kubeconfig. Server mode: use it instead of the in-cluster config (for testing server mode on a laptop) |
-context |
current context | — | Kubeconfig context |
-no-browser |
false |
— | Local mode: don't open the browser |
-prometheus-url |
discover | prometheusURL |
Prometheus base URL for the network gauge. Without it Glowpod looks for a Prometheus Service in the cluster, and hides the gauge if there is none |
-log-format |
text |
logs.format (json) |
text or json |
-log-level |
info |
logs.level |
debug, info, warn, error |
-version |
Print the version and exit | ||
-dev |
false |
— | Development: serve the API only; Vite serves the UI |
Server mode
| Flag | Default | Helm value | What it does |
|---|---|---|---|
-public-url |
publicURL |
The URL people open, e.g. https://glowpod.example.com. Needed for SSO. Glowpod then only answers that host and sends HSTS when it's https:// |
|
-cluster-name |
clusterName |
The cluster's name in the UI | |
-trusted-proxies |
trustedProxies (list) |
Comma-separated CIDRs or addresses whose X-Forwarded-For Glowpod believes, for rate limits and logs |
|
-session-ttl |
12h |
session.ttl |
Sign people out this long after they signed in |
-session-idle |
2h |
session.idle |
Sign people out after this long without use |
-insecure-cookies |
false |
extraArgs: [-insecure-cookies] |
Allow the session cookie over plain HTTP. Testing only |
Token sign-in
| Flag | Default | Helm value | What it does |
|---|---|---|---|
-auth-token |
true |
auth.token.enabled |
Allow signing in with a bearer token |
SSO (OpenID Connect)
SSO is on when -oidc-issuer is set (Helm: auth.oidc.enabled).
| Flag | Default | Helm value | What it does |
|---|---|---|---|
-oidc-issuer |
auth.oidc.issuer |
Issuer URL | |
-oidc-client-id |
auth.oidc.clientID |
Client ID | |
-oidc-client-secret |
auth.oidc.existingSecret + existingSecretKey, or clientSecret |
Client secret | |
-oidc-scopes |
openid,email,profile |
auth.oidc.scopes (list) |
Scopes to request |
-oidc-username-claim |
email |
auth.oidc.usernameClaim |
ID token claim used as the Kubernetes username |
-oidc-groups-claim |
groups |
auth.oidc.groupsClaim |
Claim with the groups (a list or one string) |
-oidc-username-prefix |
auth.oidc.usernamePrefix |
Prefix for usernames | |
-oidc-groups-prefix |
(chart: oidc:) |
auth.oidc.groupsPrefix |
Prefix for groups |
-oidc-pass-token |
false |
auth.oidc.passToken |
Send the ID token to the API server instead of impersonating |
-oidc-name |
SSO |
auth.oidc.name |
Provider name on the sign-in button |
The redirect URI is always <public-url>/auth/oidc/callback.
LDAP / Active Directory
LDAP is on when -ldap-url is set (Helm: auth.ldap.enabled).
| Flag | Default | Helm value | What it does |
|---|---|---|---|
-ldap-url |
auth.ldap.url |
ldaps://host:636 or ldap://host:389 |
|
-ldap-bind-dn |
anonymous | auth.ldap.bindDN |
Account Glowpod searches with |
-ldap-bind-password |
auth.ldap.existingSecret + existingSecretKey, or bindPassword |
Its password | |
-ldap-user-base |
auth.ldap.userBase |
Where to search for users (required) | |
-ldap-user-filter |
(uid={username}) |
auth.ldap.userFilter |
Filter that finds exactly one user |
-ldap-username-attribute |
uid |
auth.ldap.usernameAttribute |
Attribute used as the Kubernetes username |
-ldap-group-base |
no groups | auth.ldap.groupBase |
Where to search for groups |
-ldap-group-filter |
(member={dn}) |
auth.ldap.groupFilter |
Filter for the user's groups; {dn} and {username} |
-ldap-group-attribute |
cn |
auth.ldap.groupAttribute |
Attribute used as the group name |
-ldap-groups-prefix |
(chart: ldap:) |
auth.ldap.groupsPrefix |
Prefix for groups |
-ldap-start-tls |
false |
auth.ldap.startTLS |
Upgrade ldap:// with StartTLS |
-ldap-ca-file |
system roots | auth.ldap.caSecret (Secret with ca.crt) |
CA bundle for the directory's certificate |
-ldap-insecure-skip-verify |
false |
auth.ldap.insecureSkipVerify |
Don't check the certificate. Testing only |
Helm-only values
| Value | Default | What it does |
|---|---|---|
image.repository, image.tag, image.digest, image.pullPolicy |
chart's appVersion | Which image. A digest (sha256:…) wins over the tag |
imagePullSecrets |
[] |
For a private registry |
replicaCount |
1 |
Keep at 1: sessions are in memory |
allowManyReplicas |
false |
Allow more replicas; needs sticky sessions at the ingress |
rbac.create |
true |
Create the impersonation ClusterRole (only when SSO without passToken, or LDAP, is on) |
serviceAccount.create, .name, .annotations |
create | Glowpod's service account |
service.type, service.port |
ClusterIP, 80 |
The Service |
ingress.enabled, .className, .host, .annotations, .tls |
off | An Ingress for publicURL |
networkPolicy.enabled, .from |
off | Only let these peers reach Glowpod |
resources |
50m CPU, 64Mi request; 256Mi limit | Enough for a few dozen people; raise memory for big clusters |
podSecurityContext, securityContext |
non-root 65532, read-only root, no capabilities, RuntimeDefault seccomp |
Restricted Pod Security Standard |
nodeSelector, tolerations, affinity, topologySpreadConstraints, priorityClassName |
Scheduling | |
podAnnotations, podLabels |
Extra metadata | |
extraEnv, extraArgs |
[] |
More settings |
command |
image entrypoint | Replace the entrypoint |
extraVolumes, extraVolumeMounts, extraInitContainers |
[] |
E.g. a corporate CA bundle |
tests.image |
busybox:1.37 |
Image for helm test |
The chart ships a values.schema.json, so a typo in a value name fails the
install instead of being ignored.
Trusting a corporate CA (for SSO)
If your identity provider uses a private CA, mount it and point Go at it:
extraVolumes:
- name: corp-ca
configMap:
name: corp-ca # key: ca.crt
extraVolumeMounts:
- name: corp-ca
mountPath: /etc/glowpod/ca
readOnly: true
extraEnv:
- name: SSL_CERT_DIR
value: /etc/glowpod/ca:/etc/ssl/certs
Local mode
Local mode takes no sign-in settings: it uses your kubeconfig's user, listens
on 127.0.0.1:7171 only, and opens the browser with a one-time sign-in link.
glowpod # current context
glowpod -context staging # another context
glowpod -no-browser -addr 127.0.0.1:9000