Configuration Guide
Overview
The CDN Manager is the Helm release cdn-platform, configured by Helm values. The release is installed and updated only by deploy, which builds the values from three layers:
- The preset on the installation ISO:
values-production.yamlorvalues-lab.yaml, chosen withdeploy init. - Your overrides in
/etc/acd/deploy/values.override.yaml: only the settings you want to change. - Derived settings worked out from your site settings in
/etc/acd/deploy/group_vars/all.yamland thecerts/folder. These always win.
deploy merges them into /etc/acd/deploy/values.yaml, which is what the cluster receives. See Application Settings.
This guide is the reference for the Helm values.
Applying Configuration
To change a value:
Write the setting in
/etc/acd/deploy/values.override.yaml, with the same nesting as below. For example:cdn-manager: manager: logLevel: debugRun
deploy:/mnt/esb3027/deploy
Do not run helm install, helm upgrade or helm rollback yourself: the next deploy replaces the release with what the configuration says. To undo a change, revert it in values.override.yaml and run deploy again.
helm list -A shows six more releases, which the cluster itself runs on. They come from the installation ISO and k3s, not from your values, so leave them alone too:
| Release | What it is |
|---|---|
acd-cluster | The PostgreSQL database cluster |
cloudnative-pg | The operator that runs the PostgreSQL cluster |
longhorn | Persistent storage |
descheduler | Moves pods to even out the load on the nodes |
traefik, traefik-crd | The ingress controller, part of k3s |
Set through site settings, not values: the manager hostnames (
global.hosts.managerand Zitadel’sExternalDomain), the CDN Directors (global.hosts.routers, whenexternal_directorsis not empty) and the TLS certificate secret are derived bydeploy, and override anything invalues.override.yaml. Set them withmanager_hostnames,external_directorsand thecerts/folder.
Reference Files
The installation ISO provides the presets and a complete reference at /mnt/esb3027/:
| File | Purpose |
|---|---|
values-production.yaml | The production preset, for clusters of three or more machines |
values-lab.yaml | The lab preset, for a single machine |
values.yaml | Every configurable option with its default and inline comments |
Hardware requirements: For per-node hardware specifications, refer to the System Requirements Guide. The System Requirements Guide is the authoritative source — the hardware comments in the header of
values-production.yamlmay not reflect the current requirements.
Configuration Reference
Global Settings
The global section contains cluster-wide settings. The most critical configuration is global.hosts.
global:
hosts:
manager:
- host: manager.local
routers:
- name: default
address: 127.0.0.1
edns_proxy: []
geoip: []
| Key | Type | Description |
|---|---|---|
global.hosts.manager | Array | External IP addresses or DNS hostnames for all Manager cluster nodes |
global.hosts.routers | Array | ESB3024 CDN Director instances |
global.hosts.edns_proxy | Array | EDNS Proxy addresses (currently unused) |
global.hosts.geoip | Array | GeoIP Proxy addresses for Frontend GUI |
Important: deploy sets global.hosts.manager, Zitadel’s ExternalDomain and global.hosts.routers from manager_hostnames and external_directors in Site Settings. Do not set them in values.override.yaml.
Manager Configuration
Core Manager API server settings:
| Key | Type | Default | Description |
|---|---|---|---|
cdn-manager.manager.image.registry | String | ghcr.io | Container image registry |
cdn-manager.manager.image.repository | String | edgeware/acd-manager | Container image repository |
cdn-manager.manager.image.tag | String | Image tag override (uses latest if empty) | |
cdn-manager.manager.logLevel | String | info | Log level (trace, debug, info, warn, error) |
cdn-manager.manager.replicaCount | Number | 1 | Number of replicas (HPA manages this when enabled) |
cdn-manager.manager.containerPorts.http | Number | 80 | HTTP container port |
cdn-manager.manager.maxmindDbVolume | String | Name of PVC containing MaxMind GeoIP databases |
Manager Resources
The chart supports both resource presets and explicit resource specifications:
| Key | Type | Default | Description |
|---|---|---|---|
cdn-manager.manager.resourcesPreset | String | `` (empty) | Resource preset (see Resource Presets table). Ignored if cdn-manager.manager.resources is set. |
cdn-manager.manager.resources.requests.cpu | String | 300m | CPU request |
cdn-manager.manager.resources.requests.memory | String | 512Mi | Memory request |
cdn-manager.manager.resources.limits.cpu | String | 1 | CPU limit |
cdn-manager.manager.resources.limits.memory | String | 4Gi | Memory limit |
Note: For production workloads, explicitly set cdn-manager.manager.resources rather than using presets.
Manager Datastore
cdn-manager:
manager:
datastore:
type: redis
namespace: "cdn_manager_ds"
default_ttl: ""
compression: zstd
| Key | Type | Default | Description |
|---|---|---|---|
cdn-manager.manager.datastore.type | String | redis | Datastore backend type |
cdn-manager.manager.datastore.namespace | String | cdn_manager_ds | Redis namespace for manager data |
cdn-manager.manager.datastore.default_ttl | String | `` (empty) | Default TTL for entries |
cdn-manager.manager.datastore.compression | String | zstd | Compression algorithm (none, zstd, etc.) |
Manager Database
The manager keeps its own data, including the subnet map, in a manager database in the PostgreSQL cluster. The manager creates the database if it is absent.
cdn-manager:
manager:
database:
name: manager
host: acd-cluster-postgresql-rw
port: 5432
user: app
provision:
enabled: true
| Key | Type | Default | Description |
|---|---|---|---|
cdn-manager.manager.database.name | String | manager | Database name |
cdn-manager.manager.database.host | String | acd-cluster-postgresql-rw | PostgreSQL read-write service |
cdn-manager.manager.database.port | Number | 5432 | PostgreSQL port |
cdn-manager.manager.database.user | String | app | Role the manager connects as |
cdn-manager.manager.database.provision.enabled | Boolean | true | Create the database when it is absent. Set to false when the manager uses an external database that you create yourself |
Manager Discovery
cdn-manager:
manager:
discovery: []
# Example:
# - namespace: "other"
# hosts:
# - other-host1
# - other-host2
# pattern: "other-.*"
| Key | Type | Description |
|---|---|---|
cdn-manager.manager.discovery | Array | Array of discovery host configurations. Each entry can specify hosts (list of hostnames), pattern (regex pattern), or both |
Manager Tuning
cdn-manager:
manager:
tuning:
enable_cache_control: true
cache_control_max_age: "5m"
cache_control_miss_max_age: ""
subnet:
mutation_lock:
wait: ""
postgres:
retry_min: ""
retry_max: ""
acquire_timeout: ""
pool_size: ""
| Key | Type | Default | Description |
|---|---|---|---|
cdn-manager.manager.tuning.enable_cache_control | Boolean | true | Enable cache control headers in responses |
cdn-manager.manager.tuning.cache_control_max_age | String | 5m | Maximum age for cache control headers |
cdn-manager.manager.tuning.cache_control_miss_max_age | String | `` (empty) | Maximum age for cache control headers on cache misses |
cdn-manager.manager.tuning.subnet.mutation_lock.wait | String | `` (empty) | How long a subnet change waits for another to finish before reporting 503. Empty uses the default of 2s |
cdn-manager.manager.tuning.postgres.retry_min | String | `` (empty) | First pause before retrying a failed connection to the manager’s database. Each pause doubles, up to retry_max. Empty uses the default of 100ms |
cdn-manager.manager.tuning.postgres.retry_max | String | `` (empty) | Longest pause between those retries. Empty uses the default of 5s |
cdn-manager.manager.tuning.postgres.acquire_timeout | String | `` (empty) | How long a request waits for a database connection before reporting 503. Empty uses the default of 2s |
cdn-manager.manager.tuning.postgres.pool_size | String | `` (empty) | Most database connections each manager pod opens. Raise it if requests report 503 while waiting for a database connection. Empty uses the default of 5 |
Manager Container Arguments
cdn-manager:
manager:
args:
- --config-file=/etc/manager/config.toml
- http-server
Gateway Configuration
NGinx Gateway settings:
| Key | Type | Default | Description |
|---|---|---|---|
cdn-manager.gateway.replicaCount | Number | 1 | Number of gateway replicas |
cdn-manager.gateway.resources.requests.cpu | String | 100m | CPU request |
cdn-manager.gateway.resources.requests.memory | String | 128Mi | Memory request |
cdn-manager.gateway.resources.limits.cpu | String | 150m | CPU limit |
cdn-manager.gateway.resources.limits.memory | String | 192Mi | Memory limit |
cdn-manager.gateway.service.type | String | ClusterIP | Service type |
MIB Frontend Configuration
Web-based configuration GUI settings:
| Key | Type | Default | Description |
|---|---|---|---|
cdn-manager.mibFrontend.enabled | Boolean | true | Enable the frontend GUI |
cdn-manager.mibFrontend.resourcesPreset | String | nano | Resource preset |
cdn-manager.mibFrontend.autoscaling.hpa.enabled | Boolean | true | Enable HPA |
cdn-manager.mibFrontend.autoscaling.hpa.minReplicas | Number | 2 | Minimum replicas |
cdn-manager.mibFrontend.autoscaling.hpa.maxReplicas | Number | 4 | Maximum replicas |
Confd Configuration
Confd settings for configuration management:
| Key | Type | Default | Description |
|---|---|---|---|
confd.enabled | Boolean | true | Enable Confd |
confd.service.ports.internal | Number | 15000 | Internal service port |
VictoriaMetrics Configuration
Time-series database for metrics:
| Key | Type | Default | Description |
|---|---|---|---|
acd-metrics.enabled | Boolean | true | Enable metrics components |
acd-metrics.victoria-metrics-single.enabled | Boolean | true | Enable VictoriaMetrics |
acd-metrics.grafana.enabled | Boolean | true | Enable Grafana |
acd-metrics.telegraf.enabled | Boolean | true | Enable Telegraf |
acd-metrics.prometheus.enabled | Boolean | true | Enable Prometheus metrics |
Ingress Configuration
Traffic exposure settings:
| Key | Type | Default | Description |
|---|---|---|---|
cdn-manager.ingress.enabled | Boolean | true | Enable ingress record generation |
cdn-manager.ingress.pathType | String | Prefix | Ingress path type |
cdn-manager.ingress.hostname | String | `` (empty) | Primary hostname (defaults to manager.local via global.hosts) |
cdn-manager.ingress.path | String | /api | Default path for ingress |
cdn-manager.ingress.tls | Boolean | false | Enable TLS configuration |
cdn-manager.ingress.selfSigned | Boolean | false | Generate self-signed certificate via Helm |
cdn-manager.ingress.secrets | Array | Custom TLS certificate secrets |
Ingress Extra Paths
The chart includes default extra paths for Confd and GeoIP:
cdn-manager:
ingress:
extraPaths:
- path: /confd
pathType: Prefix
backend:
service:
name: cdn-platform-cdn-manager-gateway
port:
name: http
- path: /geoip
pathType: Prefix
backend:
service:
name: cdn-platform-cdn-manager-gateway
port:
name: http
TLS Certificate Secrets
Note: With
deploy, put the certificate and key in/etc/acd/deploy/certs/instead:deploycreates the secret and wires it to every ingress. See TLS Certificates. The settings below are for reference.
For production TLS certificates:
cdn-manager:
ingress:
secrets:
- name: manager.local-tls
key: |-
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
certificate: |-
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
tls: true
Resource Configuration
Resource Presets
Predefined resource configurations for common deployment sizes:
| Preset | Request CPU | Request Memory | Limit CPU | Limit Memory | Ephemeral Storage Limit |
|---|---|---|---|---|---|
nano | 100m | 128Mi | 150m | 192Mi | 2Gi |
micro | 250m | 256Mi | 375m | 384Mi | 2Gi |
small | 500m | 512Mi | 750m | 768Mi | 2Gi |
medium | 500m | 1024Mi | 750m | 1536Mi | 2Gi |
large | 1000m | 2048Mi | 1500m | 3072Mi | 2Gi |
xlarge | 1000m | 3072Mi | 3000m | 6144Mi | 2Gi |
2xlarge | 1000m | 3072Mi | 6000m | 12288Mi | 2Gi |
Note: Limits are calculated as requests plus 50% (except for xlarge/2xlarge and ephemeral-storage).
Custom Resources
Override preset with custom values:
cdn-manager:
manager:
resources:
requests:
cpu: "300m"
memory: "512Mi"
limits:
cpu: "1"
memory: "1Gi"
Note:
- CPU values use millicores (1000m = 1 core)
- Memory values use binary SI units (1024Mi = 1GiB)
- Requests represent minimum guaranteed resources
- Limits represent maximum consumable resources
Capacity Planning
When sizing resources:
- Requests determine scheduling (node must have available capacity)
- Limits prevent resource starvation
- Maintain 20-30% cluster headroom for scaling
- Total capacity = sum of all requests × replica count + headroom
Security Contexts
Pod Security Context
cdn-manager:
manager:
podSecurityContext:
enabled: true
fsGroup: 1001
fsGroupChangePolicy: Always
sysctls: []
supplementalGroups: []
Container Security Context
cdn-manager:
manager:
containerSecurityContext:
enabled: true
runAsUser: 1001
runAsGroup: 1001
runAsNonRoot: true
readOnlyRootFilesystem: true
privileged: false
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
seccompProfile:
type: "RuntimeDefault"
Health Probes
Probe Types
| Probe | Purpose | Failure Action |
|---|---|---|
startupProbe | Initial startup verification | Container restart |
readinessProbe | Traffic readiness check | Remove from load balancer |
livenessProbe | Health monitoring | Container restart |
Default Probe Configuration
Liveness Probe
cdn-manager:
manager:
livenessProbe:
enabled: true
initialDelaySeconds: 5
periodSeconds: 30
timeoutSeconds: 10
failureThreshold: 5
successThreshold: 1
httpGet:
path: /api/v1/health/alive
port: http
Readiness Probe
cdn-manager:
manager:
readinessProbe:
enabled: true
initialDelaySeconds: 5
periodSeconds: 10
timeoutSeconds: 7
failureThreshold: 3
successThreshold: 1
httpGet:
path: /api/v1/health/ready
port: http
Startup Probe
cdn-manager:
manager:
startupProbe:
enabled: true
initialDelaySeconds: 0
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 10
successThreshold: 1
httpGet:
path: /api/v1/health/alive
port: http
Autoscaling Configuration
Horizontal Pod Autoscaler (HPA)
cdn-manager:
manager:
autoscaling:
hpa:
enabled: true
minReplicas: 3
maxReplicas: 8
targetCPU: 50
targetMemory: 80
| Key | Type | Default | Description |
|---|---|---|---|
cdn-manager.manager.autoscaling.hpa.enabled | Boolean | true | Enable HPA |
cdn-manager.manager.autoscaling.hpa.minReplicas | Number | 3 | Minimum number of replicas |
cdn-manager.manager.autoscaling.hpa.maxReplicas | Number | 8 | Maximum number of replicas |
cdn-manager.manager.autoscaling.hpa.targetCPU | Number | 50 | Target CPU utilization percentage |
cdn-manager.manager.autoscaling.hpa.targetMemory | Number | 80 | Target Memory utilization percentage |
Network Policy
cdn-manager:
networkPolicy:
enabled: true
allowExternal: true
allowExternalEgress: true
addExternalClientAccess: true
| Key | Type | Default | Description |
|---|---|---|---|
cdn-manager.networkPolicy.enabled | Boolean | true | Enable NetworkPolicy |
cdn-manager.networkPolicy.allowExternal | Boolean | true | Allow connections from any source (don’t require pod label) |
cdn-manager.networkPolicy.allowExternalEgress | Boolean | true | Allow pod to access any range of port and destinations |
cdn-manager.networkPolicy.addExternalClientAccess | Boolean | true | Allow access from pods with client label set to “true” |
Pod Affinity and Anti-Affinity
cdn-manager:
manager:
podAffinityPreset: ""
podAntiAffinityPreset: soft
nodeAffinityPreset:
type: ""
key: ""
values: []
affinity: {}
| Key | Type | Default | Description |
|---|---|---|---|
cdn-manager.manager.podAffinityPreset | String | `` (empty) | Pod affinity preset (soft or hard). Ignored if affinity is set |
cdn-manager.manager.podAntiAffinityPreset | String | soft | Pod anti-affinity preset (soft or hard). Ignored if affinity is set |
cdn-manager.manager.nodeAffinityPreset.type | String | `` (empty) | Node affinity preset type (soft or hard) |
cdn-manager.manager.affinity | Object | {} | Custom affinity rules (overrides presets) |
Service Configuration
cdn-manager:
service:
type: ClusterIP
ports:
http: 80
annotations:
service.kubernetes.io/topology-mode: Auto
externalTrafficPolicy: Cluster
sessionAffinity: None
| Key | Type | Default | Description |
|---|---|---|---|
service.type | String | ClusterIP | Service type |
service.ports.http | Number | 80 | HTTP service port |
service.annotations | Object | service.kubernetes.io/topology-mode: Auto | Service annotations |
service.externalTrafficPolicy | String | Cluster | External traffic policy |
Persistence Configuration
Warning: Set volume sizes before the first
deploy. Helm cannot change the size of a persistent volume claim that already exists, so changing asizeorpersistencesetting invalues.override.yamlon an installed cluster does not resize the volume, and can make the upgrade fail. This applies to every component with storage, such as Kafka, VictoriaMetrics, PostgreSQL and Redis. Raising a retention setting also uses more disk, so check the volume has room first.
cdn-manager:
persistence:
enabled: false
mountPath: /agiletv/manager/data
storageClass: ""
accessModes:
- ReadWriteOnce
size: 8Gi
| Key | Type | Default | Description |
|---|---|---|---|
persistence.enabled | Boolean | false | Enable persistence using PVC |
persistence.mountPath | String | /agiletv/manager/data | Mount path |
persistence.storageClass | String | `` (empty) | Storage class (uses cluster default if empty) |
persistence.size | String | 8Gi | Size of data volume |
RBAC and Service Account
cdn-manager:
rbac:
create: false
rules: []
serviceAccount:
create: true
name: ""
automountServiceAccountToken: true
annotations: {}
Metrics
cdn-manager:
metrics:
enabled: false
serviceMonitor:
enabled: false
namespace: ""
annotations: {}
labels: {}
interval: ""
scrapeTimeout: ""
| Key | Type | Default | Description |
|---|---|---|---|
metrics.enabled | Boolean | false | Enable Prometheus metrics export |
metrics.serviceMonitor.enabled | Boolean | false | Create Prometheus Operator ServiceMonitor |
Next Steps
After configuration:
- Installation Guide - Deploy with your configuration
- Operations Guide - Day-to-day management
- Performance Tuning Guide - Optimize system performance
- Architecture Guide - Understand component relationships