KubeCon EUBooth 1151, Amsterdam. March 23-26
Scheduler

Configuration

Configure the DevZero Scheduler plugins -- target utilization, overprovision limits, cost scoring, and checkpoint restore.

Configuration

The Scheduler is configured via a KubeSchedulerConfiguration stored in a ConfigMap (dz-scheduler-config in kube-system). Each plugin has its own arguments section.

Plugin Weights

Scoring plugins are weighted to control their influence on the final scheduling decision:

PluginWeightPurpose
TaintToleration6Kubernetes built-in
NodeAffinity5Kubernetes built-in
PodTopologySpread5Kubernetes built-in
InterPodAffinity5Kubernetes built-in
NodeCost4Cost optimization
TargetAllocated3Utilization targeting
LimitOverProvisionControl2Overprovision safety

Higher weights mean the plugin has more influence. Kubernetes built-in plugins keep the highest weights to respect standard scheduling constraints first.

TargetAllocated

Controls the target resource utilization for node bin-packing.

FieldTypeRangeDefaultDescription
cpuAllocatedPercentint1--10080Target CPU allocation percentage
memoryAllocatedPercentint1--10080Target memory allocation percentage
pluginConfig:
  - name: TargetAllocated
    args:
      cpuAllocatedPercent: 80
      memoryAllocatedPercent: 80

Setting both values to 99 maximizes bin-packing density. This is useful for batch workloads but may leave less headroom for burst traffic.

LimitOverProvisionControl

Prevents scheduling pods on nodes where total pod limits far exceed the node's capacity.

FieldTypeRangeDefaultDescription
cpuOverProvisionPenalizeRatioint>100180CPU limits-to-capacity ratio above which nodes are penalized
memoryOverProvisionPenalizeRatioint>100180Memory limits-to-capacity ratio above which nodes are penalized
pluginConfig:
  - name: LimitOverProvisionControl
    args:
      cpuOverProvisionPenalizeRatio: 180
      memoryOverProvisionPenalizeRatio: 180

A ratio of 180 means nodes are penalized when the sum of all pod CPU (or memory) limits exceeds 1.8x the node's total capacity. Lower values are more conservative; higher values allow more overcommit.

NodeCost

Scores nodes based on pricing data from the DevZero control plane.

FieldTypeRequiredDescription
controlPlaneAddressstringYesURL of the metrics collector (e.g., https://dakr.devzero.dev)
controlPlaneTokenstringNoDirect bearer token (highest priority)
tokenFromSecretobjectNoReference to a Kubernetes Secret containing the token
tokenFromConfigMapobjectNoReference to a ConfigMap containing the token

Token resolution priority: controlPlaneToken > tokenFromSecret > tokenFromConfigMap.

pluginConfig:
  - name: NodeCost
    args:
      controlPlaneAddress: "https://dakr.devzero.dev"
      tokenFromSecret:
        name: "devzero-zxporter-token"
        namespace: "kube-system"
        key: "CLUSTER_TOKEN"

At least one token source must be configured. The Scheduler validates this at startup and will fail to start if no token is available.

Token from Secret

tokenFromSecret:
  name: "devzero-zxporter-token"
  namespace: "kube-system"
  key: "CLUSTER_TOKEN"

Token from ConfigMap

tokenFromConfigMap:
  name: "devzero-zxporter-env-config"
  namespace: "devzero-zxporter"
  key: "CLUSTER_TOKEN"

CheckpointRestore

The CheckpointRestore plugin has no configuration. It operates based on annotations and labels:

ResourceKeyValuePurpose
Pod annotationcheckpoint-shim.io/try-restore"true"Marks a pod for checkpoint restore
Node labeldakr.devzero.io/checkpoint-node"true"Marks a node as checkpoint-capable

Full Configuration Example

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: dz-scheduler
    plugins:
      filter:
        enabled:
          - name: CheckpointRestore
      preScore:
        enabled:
          - name: TaintToleration
            weight: 6
          - name: NodeAffinity
            weight: 5
          - name: PodTopologySpread
            weight: 5
          - name: InterPodAffinity
            weight: 5
          - name: NodeCost
            weight: 4
          - name: TargetAllocated
            weight: 3
          - name: LimitOverProvisionControl
            weight: 2
      score:
        enabled:
          - name: TaintToleration
            weight: 6
          - name: NodeAffinity
            weight: 5
          - name: PodTopologySpread
            weight: 5
          - name: InterPodAffinity
            weight: 5
          - name: NodeCost
            weight: 4
          - name: TargetAllocated
            weight: 3
          - name: LimitOverProvisionControl
            weight: 2
        disabled:
          - name: NodeResourcesFit
          - name: NodeResourcesBalancedAllocation
    pluginConfig:
      - name: TargetAllocated
        args:
          cpuAllocatedPercent: 80
          memoryAllocatedPercent: 80
      - name: LimitOverProvisionControl
        args:
          cpuOverProvisionPenalizeRatio: 180
          memoryOverProvisionPenalizeRatio: 180
      - name: NodeCost
        args:
          controlPlaneAddress: "https://dakr.devzero.dev"
          tokenFromSecret:
            name: "devzero-zxporter-token"
            namespace: "kube-system"
            key: "CLUSTER_TOKEN"
      - name: PodTopologySpread
        args:
          defaultingType: "List"

Deployment Resources

The Scheduler deployment defaults:

SettingValue
Replicas1
CPU request200m
Node selectorkubernetes.io/os: linux
Priority classsystem-cluster-critical
Health checkHTTPS on port 10259
TolerationsAll taints

On this page