Configuration Guide

Helm chart configuration reference
You're viewing a development version of manager, the latest released version is 1.6.2
Go to the latest released version

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:

  1. The preset on the installation ISO: values-production.yaml or values-lab.yaml, chosen with deploy init.
  2. Your overrides in /etc/acd/deploy/values.override.yaml: only the settings you want to change.
  3. Derived settings worked out from your site settings in /etc/acd/deploy/group_vars/all.yaml and the certs/ 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:

  1. Write the setting in /etc/acd/deploy/values.override.yaml, with the same nesting as below. For example:

    cdn-manager:
      manager:
        logLevel: debug
    
  2. Run 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:

ReleaseWhat it is
acd-clusterThe PostgreSQL database cluster
cloudnative-pgThe operator that runs the PostgreSQL cluster
longhornPersistent storage
deschedulerMoves pods to even out the load on the nodes
traefik, traefik-crdThe ingress controller, part of k3s

Set through site settings, not values: the manager hostnames (global.hosts.manager and Zitadel’s ExternalDomain), the CDN Directors (global.hosts.routers, when external_directors is not empty) and the TLS certificate secret are derived by deploy, and override anything in values.override.yaml. Set them with manager_hostnames, external_directors and the certs/ folder.

Reference Files

The installation ISO provides the presets and a complete reference at /mnt/esb3027/:

FilePurpose
values-production.yamlThe production preset, for clusters of three or more machines
values-lab.yamlThe lab preset, for a single machine
values.yamlEvery 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.yaml may 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: []
KeyTypeDescription
global.hosts.managerArrayExternal IP addresses or DNS hostnames for all Manager cluster nodes
global.hosts.routersArrayESB3024 CDN Director instances
global.hosts.edns_proxyArrayEDNS Proxy addresses (currently unused)
global.hosts.geoipArrayGeoIP 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:

KeyTypeDefaultDescription
cdn-manager.manager.image.registryStringghcr.ioContainer image registry
cdn-manager.manager.image.repositoryStringedgeware/acd-managerContainer image repository
cdn-manager.manager.image.tagStringImage tag override (uses latest if empty)
cdn-manager.manager.logLevelStringinfoLog level (trace, debug, info, warn, error)
cdn-manager.manager.replicaCountNumber1Number of replicas (HPA manages this when enabled)
cdn-manager.manager.containerPorts.httpNumber80HTTP container port
cdn-manager.manager.maxmindDbVolumeStringName of PVC containing MaxMind GeoIP databases

Manager Resources

The chart supports both resource presets and explicit resource specifications:

KeyTypeDefaultDescription
cdn-manager.manager.resourcesPresetString`` (empty)Resource preset (see Resource Presets table). Ignored if cdn-manager.manager.resources is set.
cdn-manager.manager.resources.requests.cpuString300mCPU request
cdn-manager.manager.resources.requests.memoryString512MiMemory request
cdn-manager.manager.resources.limits.cpuString1CPU limit
cdn-manager.manager.resources.limits.memoryString4GiMemory 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
KeyTypeDefaultDescription
cdn-manager.manager.datastore.typeStringredisDatastore backend type
cdn-manager.manager.datastore.namespaceStringcdn_manager_dsRedis namespace for manager data
cdn-manager.manager.datastore.default_ttlString`` (empty)Default TTL for entries
cdn-manager.manager.datastore.compressionStringzstdCompression 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
KeyTypeDefaultDescription
cdn-manager.manager.database.nameStringmanagerDatabase name
cdn-manager.manager.database.hostStringacd-cluster-postgresql-rwPostgreSQL read-write service
cdn-manager.manager.database.portNumber5432PostgreSQL port
cdn-manager.manager.database.userStringappRole the manager connects as
cdn-manager.manager.database.provision.enabledBooleantrueCreate 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-.*"
KeyTypeDescription
cdn-manager.manager.discoveryArrayArray 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: ""
KeyTypeDefaultDescription
cdn-manager.manager.tuning.enable_cache_controlBooleantrueEnable cache control headers in responses
cdn-manager.manager.tuning.cache_control_max_ageString5mMaximum age for cache control headers
cdn-manager.manager.tuning.cache_control_miss_max_ageString`` (empty)Maximum age for cache control headers on cache misses
cdn-manager.manager.tuning.subnet.mutation_lock.waitString`` (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_minString`` (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_maxString`` (empty)Longest pause between those retries. Empty uses the default of 5s
cdn-manager.manager.tuning.postgres.acquire_timeoutString`` (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_sizeString`` (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:

KeyTypeDefaultDescription
cdn-manager.gateway.replicaCountNumber1Number of gateway replicas
cdn-manager.gateway.resources.requests.cpuString100mCPU request
cdn-manager.gateway.resources.requests.memoryString128MiMemory request
cdn-manager.gateway.resources.limits.cpuString150mCPU limit
cdn-manager.gateway.resources.limits.memoryString192MiMemory limit
cdn-manager.gateway.service.typeStringClusterIPService type

MIB Frontend Configuration

Web-based configuration GUI settings:

KeyTypeDefaultDescription
cdn-manager.mibFrontend.enabledBooleantrueEnable the frontend GUI
cdn-manager.mibFrontend.resourcesPresetStringnanoResource preset
cdn-manager.mibFrontend.autoscaling.hpa.enabledBooleantrueEnable HPA
cdn-manager.mibFrontend.autoscaling.hpa.minReplicasNumber2Minimum replicas
cdn-manager.mibFrontend.autoscaling.hpa.maxReplicasNumber4Maximum replicas

Confd Configuration

Confd settings for configuration management:

KeyTypeDefaultDescription
confd.enabledBooleantrueEnable Confd
confd.service.ports.internalNumber15000Internal service port

VictoriaMetrics Configuration

Time-series database for metrics:

KeyTypeDefaultDescription
acd-metrics.enabledBooleantrueEnable metrics components
acd-metrics.victoria-metrics-single.enabledBooleantrueEnable VictoriaMetrics
acd-metrics.grafana.enabledBooleantrueEnable Grafana
acd-metrics.telegraf.enabledBooleantrueEnable Telegraf
acd-metrics.prometheus.enabledBooleantrueEnable Prometheus metrics

Ingress Configuration

Traffic exposure settings:

KeyTypeDefaultDescription
cdn-manager.ingress.enabledBooleantrueEnable ingress record generation
cdn-manager.ingress.pathTypeStringPrefixIngress path type
cdn-manager.ingress.hostnameString`` (empty)Primary hostname (defaults to manager.local via global.hosts)
cdn-manager.ingress.pathString/apiDefault path for ingress
cdn-manager.ingress.tlsBooleanfalseEnable TLS configuration
cdn-manager.ingress.selfSignedBooleanfalseGenerate self-signed certificate via Helm
cdn-manager.ingress.secretsArrayCustom 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: deploy creates 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:

PresetRequest CPURequest MemoryLimit CPULimit MemoryEphemeral Storage Limit
nano100m128Mi150m192Mi2Gi
micro250m256Mi375m384Mi2Gi
small500m512Mi750m768Mi2Gi
medium500m1024Mi750m1536Mi2Gi
large1000m2048Mi1500m3072Mi2Gi
xlarge1000m3072Mi3000m6144Mi2Gi
2xlarge1000m3072Mi6000m12288Mi2Gi

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

ProbePurposeFailure Action
startupProbeInitial startup verificationContainer restart
readinessProbeTraffic readiness checkRemove from load balancer
livenessProbeHealth monitoringContainer 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
KeyTypeDefaultDescription
cdn-manager.manager.autoscaling.hpa.enabledBooleantrueEnable HPA
cdn-manager.manager.autoscaling.hpa.minReplicasNumber3Minimum number of replicas
cdn-manager.manager.autoscaling.hpa.maxReplicasNumber8Maximum number of replicas
cdn-manager.manager.autoscaling.hpa.targetCPUNumber50Target CPU utilization percentage
cdn-manager.manager.autoscaling.hpa.targetMemoryNumber80Target Memory utilization percentage

Network Policy

cdn-manager:
  networkPolicy:
    enabled: true
    allowExternal: true
    allowExternalEgress: true
    addExternalClientAccess: true
KeyTypeDefaultDescription
cdn-manager.networkPolicy.enabledBooleantrueEnable NetworkPolicy
cdn-manager.networkPolicy.allowExternalBooleantrueAllow connections from any source (don’t require pod label)
cdn-manager.networkPolicy.allowExternalEgressBooleantrueAllow pod to access any range of port and destinations
cdn-manager.networkPolicy.addExternalClientAccessBooleantrueAllow 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: {}
KeyTypeDefaultDescription
cdn-manager.manager.podAffinityPresetString`` (empty)Pod affinity preset (soft or hard). Ignored if affinity is set
cdn-manager.manager.podAntiAffinityPresetStringsoftPod anti-affinity preset (soft or hard). Ignored if affinity is set
cdn-manager.manager.nodeAffinityPreset.typeString`` (empty)Node affinity preset type (soft or hard)
cdn-manager.manager.affinityObject{}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
KeyTypeDefaultDescription
service.typeStringClusterIPService type
service.ports.httpNumber80HTTP service port
service.annotationsObjectservice.kubernetes.io/topology-mode: AutoService annotations
service.externalTrafficPolicyStringClusterExternal 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 a size or persistence setting in values.override.yaml on 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
KeyTypeDefaultDescription
persistence.enabledBooleanfalseEnable persistence using PVC
persistence.mountPathString/agiletv/manager/dataMount path
persistence.storageClassString`` (empty)Storage class (uses cluster default if empty)
persistence.sizeString8GiSize 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: ""
KeyTypeDefaultDescription
metrics.enabledBooleanfalseEnable Prometheus metrics export
metrics.serviceMonitor.enabledBooleanfalseCreate Prometheus Operator ServiceMonitor

Next Steps

After configuration:

  1. Installation Guide - Deploy with your configuration
  2. Operations Guide - Day-to-day management
  3. Performance Tuning Guide - Optimize system performance
  4. Architecture Guide - Understand component relationships