PodDisruptionBudget is a relatively new paradigm in Kubernetes.
At its core, it ensures a certain number or percentage of pods with an assigned label will not Voluntarily be evicted at any one point in time.
As an example, lets imagine we are draining a server for the purpose of a restart. There are 5 pods of the same application (with the same label) running on the Kubernetes cluster. Two of which are running on this server we intend to restart. If our PodDisruptionBudget requires a minimum of 80% of pods to be available, the budget would only allow for one pod to be down at a time.
Example:
apiVersion: policy/v1alpha1
kind: PodDisruptionBudget
metadata:
name: disruptme
spec:
selector:
matchLabels:
name: myapp5pods
minAvailable: 80%
Kubectl drain it will respect PodDisruptionBudget. Thus when we run drain on this node we intend to restart, the cluster will ensure only one pod comes down at a time and ensure the pod has been rescheduled and is running on another server before then bringing down the second pod that was running on this server.
disruption.json
{
"apiVersion": "policy/v1beta1",
"kind": "Eviction",
"metadata": {
"name": "myapp5pods-4050136386-d6ao9",
"namespace": "default"
}
}
At the time of this writing, I was unable to use kubectl to evict pods but curl is an option.
curl -v -H 'Content-type: application/json' https://10.253.92.16:8080/api/v1/namespaces/default/pods/myapp5pods-4050136386-d6ao9/eviction -d @disruption.json
PodDisruptionBudget is going to become very valuable as companies begin managing larger and larger clusters of Kubernetes.
Use cases:
Quorum based applications (assuming good shutdown procedures)
Applications requiring X number of pods to be available under load
