Skip to content

Instantly share code, notes, and snippets.

@dharmab
Created February 17, 2019 16:19
Show Gist options
  • Save dharmab/914d6777e8a436f0eacc34b52ab686d2 to your computer and use it in GitHub Desktop.
Save dharmab/914d6777e8a436f0eacc34b52ab686d2 to your computer and use it in GitHub Desktop.
def drain_node(*, node: kubernetes.client.models.V1Node, k8s_client: kubernetes.client.CoreV1Api):
logger.info('Evicting all Pods from Node {node.metadata.name}')
# https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/#the-eviction-api
while True:
pod_list = k8s_client.list_pod_for_all_namespaces(
field_selector=f'spec.nodeName={node.metadata.name}'
)
if not pod_list.items:
return
for pod in pod_list.items:
pod_string = 'Pod {pod.metadata.name} in Namespace {pod.metadata.namespace}'
try:
logger.info('Evicting {pod_string} from Node {node.metadata.name}')
k8s_client.create_namespaced_pod_eviction(
namespace=pod.metadata.namespace,
name=pod.metadata.name,
body=kubernetes.client.models.V1beta1Eviction()
)
except kubernetes.client.rest.ApiException as e:
if e.status == 404:
logger.warning(f'{pod_string} was not found (deleted by race condition?)')
elif e.status == 429:
logger.warning(f'Unable to evict {pod_string} as it would violate a PodDisruptionBudget')
elif e.status == 500:
logger.warning(f'Unable to evict {pod_string} due to a server error (multiple PodDisruptionBudgets selecting this Pod?)')
else:
logger.exception(f'An error occurred while attempting to evict {pod_string}')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment