This repository contains working descheduler configurations for Kubernetes w### 🚀 Main Deployment Files
kubernetes/base/
- Core RBAC and ConfigMap resourceskubernetes/cronjob/
- Recommended: Periodic deschedulingkubernetes/job/
- One-time descheduling operationskubernetes/deployment/
- Continuous descheduling
examples/policy.yaml
- Complete descheduler policy exampleexamples/*.yml
- Specific policy examples (node utilization, pod lifetime, etc.)examples/cronjob/
- CronJob-specific examplesexamples/deployment/
- Deployment examples
- Overview
- Quick Start
- Deployment Options
- Repository Structure
- Current Configuration
- Monitoring & Management
- Customization
- Troubleshooting
- Production Considerations
- Resources & References
- Contributing
The Kubernetes Descheduler helps improve cluster resource utilization by identifying and evicting pods based on configurable policies. This repository provides ready-to-use configurations for different deployment methods.
Choose your deployment method based on your needs:
# Deploy as a CronJob (runs periodically)
kubectl apply -k kubernetes/cronjob/
# Or deploy as a one-time Job
kubectl apply -k kubernetes/job/
# Or deploy as a continuous Deployment
kubectl apply -k kubernetes/deployment/
# Verify deployment
kubectl get cronjob,job,deployment -n kube-system -l app=descheduler
# Deploy RBAC and ConfigMap first
kubectl apply -f kubernetes/base/rbac.yaml
kubectl apply -f kubernetes/base/configmap.yaml
# Then choose your deployment type:
kubectl apply -f kubernetes/cronjob/cronjob.yaml
# OR
kubectl apply -f kubernetes/job/job.yaml
# OR
kubectl apply -f kubernetes/deployment/deployment.yaml
If you prefer to use the latest official descheduler images directly:
# Run as a Job
kustomize build 'github.com/kubernetes-sigs/descheduler/kubernetes/job?ref=release-1.33' | kubectl apply -f -
# Run as a CronJob
kustomize build 'github.com/kubernetes-sigs/descheduler/kubernetes/cronjob?ref=release-1.33' | kubectl apply -f -
# Run as a Deployment
kustomize build 'github.com/kubernetes-sigs/descheduler/kubernetes/deployment?ref=release-1.33' | kubectl apply -f -
Note: The upstream version uses default policies. Use the local configurations in this repository for customized policies and examples.
The descheduler can be run as a Job, CronJob, or Deployment inside a Kubernetes cluster. It runs as a critical pod in the kube-system namespace to avoid being evicted.
- Use case: Periodic optimization runs
- Schedule: Configurable (default: every minute for testing)
- Location:
kubernetes/cronjob/
- Use case: One-time descheduling operations
- Location:
kubernetes/job/
- Use case: Continuous monitoring and descheduling
- Location:
kubernetes/deployment/
├── kubernetes/ # Main deployment configurations
│ ├── base/ # Shared base resources
│ │ ├── configmap.yaml # Descheduler policy configuration
│ │ ├── rbac.yaml # Role-based access control
│ │ └── kustomization.yaml # Kustomize base configuration
│ ├── cronjob/ # CronJob deployment
│ │ ├── cronjob.yaml # CronJob resource definition
│ │ └── kustomization.yaml # Kustomize overlay
│ ├── job/ # One-time Job deployment
│ │ ├── job.yaml # Job resource definition
│ │ └── kustomization.yaml # Kustomize overlay
│ └── deployment/ # Continuous deployment
│ ├── deployment.yaml # Deployment resource definition
│ └── kustomization.yaml # Kustomize overlay
├── examples/ # Example configurations and policies
│ ├── policy.yaml # Complete policy example
│ ├── policy/ # Policy configurations
│ ├── cronjob/ # CronJob examples
│ ├── deployment/ # Deployment examples
│ ├── *.yml # Various policy examples
│ └── *.yaml # Additional examples
├── helm/ # Helm chart configurations
│ ├── values-cronjob.yaml # Helm values for CronJob
│ └── values-unified.yaml # Unified Helm values
└── assests/ # Documentation images
└── *.png # Architecture diagrams
kubernetes/base/
- Core RBAC and ConfigMap resourceskubernetes/cronjob/
- Recommended: Periodic deschedulingkubernetes/job/
- One-time descheduling operationskubernetes/deployment/
- Continuous descheduling
examples/policy.yaml
- Complete descheduler policy exampleexamples/*.yml
- Specific policy examples (node utilization, pod lifetime, etc.)examples/cronjob/
- CronJob-specific examplesexamples/deployment/
- Deployment examples
helm/values-cronjob.yaml
- Production-ready CronJob valueshelm/values-unified.yaml
- Comprehensive Helm configuration
The default configuration in kubernetes/base/configmap.yaml
includes:
- RemovePodsViolatingInterPodAntiAffinity - Removes pods violating anti-affinity rules
- RemoveDuplicates - Removes duplicate pods (multiple pods of same ReplicaSet on same node)
- LowNodeUtilization - Balances workload across nodes
- Thresholds: CPU: 20%, Memory: 20%, Pods: 20%
- Target Thresholds: CPU: 50%, Memory: 50%, Pods: 50%
- CronJob Schedule:
* * * * *
(every minute - adjust for production) - Security: Non-root user, read-only filesystem, dropped capabilities
- Priority: System-critical priority class
- Resources: 500m CPU request, 256Mi memory request
# CronJob status
kubectl get cronjob -n kube-system descheduler-cronjob
# Recent jobs and pods
kubectl get jobs -n kube-system -l app=descheduler
kubectl get pods -n kube-system -l app=descheduler
# Job details and events
kubectl describe cronjob -n kube-system descheduler-cronjob
# Get the latest pod name
LATEST_POD=$(kubectl get pods -n kube-system -l app=descheduler --sort-by=.metadata.creationTimestamp -o jsonpath='{.items[-1].metadata.name}')
# View logs
kubectl logs -n kube-system $LATEST_POD
# Follow logs for running pod
kubectl logs -n kube-system $LATEST_POD -f
# Create a manual job from the cronjob
kubectl create job -n kube-system manual-descheduler-$(date +%s) --from=cronjob/descheduler-cronjob
Edit the ConfigMap to customize descheduling behavior:
kubectl edit configmap -n kube-system descheduler-policy-configmap
Update the CronJob schedule:
kubectl patch cronjob -n kube-system descheduler-cronjob -p '{"spec":{"schedule":"0 */2 * * *"}}' # Every 2 hours
Check the examples/
directory for additional policy configurations:
high-node-utilization.yml
- Target high resource utilizationlow-node-utilization.yml
- Balance low utilizationnode-affinity.yml
- Handle node affinity violationspod-life-time.yml
- Remove long-running podstoo-many-restarts.yml
- Remove pods with excessive restartstopology-spread-constraint.yaml
- Handle topology spread violations
-
No Pods Evicted
- Check if workloads match the descheduling criteria
- Verify eviction policies in the ConfigMap
- Ensure pods don't have
descheduler.alpha.kubernetes.io/evict: "false"
annotation
-
Permission Errors
# Verify RBAC is applied kubectl get clusterrole descheduler-cluster-role kubectl get clusterrolebinding descheduler-cluster-role-binding
-
Pod Scheduling Issues
# Check pod events kubectl describe pod -n kube-system -l app=descheduler
-
High Resource Usage
- Adjust CPU/memory requests in the deployment
- Consider reducing descheduling frequency
Enable verbose logging by modifying the args in your deployment:
args:
- "--policy-config-file"
- "/policy-dir/policy.yaml"
- "--v"
- "4" # Increase verbosity (0-4)
- All deployments use non-root users and read-only filesystems
- Minimal required permissions via RBAC
- System-critical priority to prevent self-eviction
- Configure appropriate resource requests/limits
- Monitor descheduler resource usage
- Consider cluster size when setting schedules
- Development: Every few minutes for testing
- Staging: Every 30 minutes to 1 hour
- Production: Every 2-6 hours (depends on cluster dynamics)
Consider excluding critical namespaces by modifying the policy:
nodeSelector: "node.kubernetes.io/exclude-from-external-load-balancers!=true"
namespaces:
exclude:
- "kube-system"
- "kube-public"
- "kube-node-lease"
- "your-critical-namespace"
- Official Descheduler Documentation
- Descheduler Policies Guide
- Exploring Kubernetes Descheduler
- Descheduler Policy Examples
When contributing to this repository:
- Test configurations in a development cluster first
- Validate YAML syntax and Kubernetes resource definitions
- Update examples and documentation accordingly
- Follow Kubernetes best practices for security and resource management