kdiff — Intelligent Kubernetes Resource Comparison Between Two Clusters
4.9K
Compare Kubernetes resources between clusters using Docker.
docker run --rm -it \
--pull always \
-v ~/.kube/config:/home/kdiff/.kube/config:ro \
-v $(pwd)/kdiff_output:/app/kdiff_output \
mabombo/kdiff:latest \
-c1 prod-cluster -c2 staging-cluster -n myapp
For easier usage, download and use the kdiff-docker wrapper script:
# Make it executable
chmod +x kdiff-docker
# Run kdiff
./kdiff-docker -c1 prod-cluster -c2 staging-cluster -n myapp
docker run --rm -it \
--pull always \
-v ~/.kube/config:/home/kdiff/.kube/config:ro \
-v $(pwd)/kdiff_output:/app/kdiff_output \
mabombo/kdiff:latest \
-c1 production -c2 staging -n myapp
docker run --rm -it \
--pull always \
-v ~/.kube/config:/home/kdiff/.kube/config:ro \
-v $(pwd)/kdiff_output:/app/kdiff_output \
mabombo/kdiff:latest \
-c1 prod -c2 staging -n myapp \
--include-resource-types deployment,configmap
docker run --rm -it \
--pull always \
-v ~/.kube/config:/home/kdiff/.kube/config:ro \
-v $(pwd)/kdiff_output:/app/kdiff_output \
mabombo/kdiff:latest \
-c1 prod -c2 staging -n myapp \
--include-services-ingress
docker run --rm -it \
--pull always \
-v ~/.kube/config:/home/kdiff/.kube/config:ro \
-v $(pwd)/kdiff_output:/app/kdiff_output \
mabombo/kdiff:latest \
-c1 prod -c2 staging -n myapp \
--show-metadata
/home/kdiff/.kube/config:ro (read-only)/app/kdiff_output to persist reportsKUBECONFIG: Path to kubeconfig file inside container (default: /home/kdiff/.kube/config)PYTHONUNBUFFERED=1: Ensures real-time outputusage: kdiff [-h] -c1 C1 -c2 C2 [-r R] [-n N] [-o O] [-f FORMAT]
[--include-volatile] [--include-services-ingress]
[--include-resource-types TYPES] [--exclude-resources RESOURCES]
[--show-metadata]
Required arguments:
-c1 C1 First Kubernetes context
-c2 C2 Second Kubernetes context
Optional arguments:
-n N Namespace to compare
-r R Resource type to compare
-o O Output directory (default: kdiff_output)
-f FORMAT Output format: html, json, md (default: html)
--include-volatile Include volatile fields in comparison
--include-services-ingress
Include service and ingress resources
--include-resource-types TYPES
Comma-separated list of resource types
--exclude-resources RESOURCES
Comma-separated list of resources to exclude
--show-metadata Show full metadata in diffs
Reports are generated in /app/kdiff_output/latest/:
diff-details.html - Interactive HTML report with visualizationssummary.json - JSON summary of all differencesdiff-details.json - Detailed JSON of all diffsdiffs/ - Individual diff files per resource# Clone the repository
git clone https://github.com/mabombo/kdiff.git
cd kdiff
# Build the Docker image
docker build -t kdiff:latest .
# Run
docker run --rm -it \
-v ~/.kube/config:/home/kdiff/.kube/config:ro \
-v $(pwd)/kdiff_output:/app/kdiff_output \
kdiff:latest -c1 context1 -c2 context2 -n namespace
On Linux systems, you may encounter kubeconfig permission errors when the file is mounted with restrictive permissions (typically 600). The container user cannot read files owned by your host user with these permissions.
Solution 1: Adjust file permissions (Recommended)
# Make your kubeconfig readable by all users (safe for single-user systems)
chmod 644 ~/.kube/config
# Then run kdiff normally
docker run --rm -it \
--pull always \
-v ~/.kube/config:/home/kdiff/.kube/config:ro \
-v $(pwd)/kdiff_output:/app/kdiff_output \
mabombo/kdiff:latest \
-c1 prod -c2 staging -n myapp
Solution 2: Run as current user
# Run container with your user ID (most reliable method)
docker run --rm -it \
--pull always \
--user $(id -u):$(id -g) \
-v ~/.kube/config:/home/kdiff/.kube/config:ro \
-v $(pwd)/kdiff_output:/app/kdiff_output \
mabombo/kdiff:latest \
-c1 prod -c2 staging -n myapp
Solution 3: Use a temporary copy
# Create a temporary copy with appropriate permissions
cp ~/.kube/config /tmp/kube-config-kdiff
chmod 644 /tmp/kube-config-kdiff
# Mount the temporary file
docker run --rm -it \
--pull always \
-v /tmp/kube-config-kdiff:/home/kdiff/.kube/config:ro \
-v $(pwd)/kdiff_output:/app/kdiff_output \
mabombo/kdiff:latest \
-c1 prod -c2 staging -n myapp
# Clean up after use
rm /tmp/kube-config-kdiff
If you see errors about contexts not existing:
[ERROR] CRITICAL ERROR: Context 'my-cluster' does not exist
Solution:
Verify available contexts:
kubectl config get-contexts
Use the exact context name from the list:
docker run --rm -it \
--pull always \
-v ~/.kube/config:/home/kdiff/.kube/config:ro \
-v $(pwd)/kdiff_output:/app/kdiff_output \
mabombo/kdiff:latest \
-c1 CORRECT-CONTEXT-NAME -c2 OTHER-CONTEXT -n myapp
Ensure your kubeconfig contains all required contexts and is properly mounted
MIT License - see LICENSE file for details
For issues, questions, or contributions, please visit:
Current version: 1.7.5
Content type
Image
Digest
sha256:89f44d950…
Size
45.6 MB
Last updated
26 days ago
docker pull mabombo/kdiff