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