{"id":17325,"date":"2025-07-17T17:47:42","date_gmt":"2025-07-18T00:47:42","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=17325"},"modified":"2025-07-18T11:56:18","modified_gmt":"2025-07-18T18:56:18","slug":"node-drains-webhook-pod-removal","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/node-drains-webhook-pod-removal\/","title":{"rendered":"Replanteamiento de los drenajes de nodos: Un Enfoque Basado en Webhooks para la Eliminaci\u00f3n Gratuita de Nodos"},"content":{"rendered":"<p>Por qu\u00e9 y c\u00f3mo construimos un controlador de admisi\u00f3n para hacer m\u00e1s seguros los drenajes de nodos al ejecutar aplicaciones con estado en Kubernetes.<\/p>\n<hr \/>\n<p data-renderer-start-pos=\"124\">La ejecuci\u00f3n de aplicaciones con estado en Kubernetes es cada vez m\u00e1s com\u00fan y a menudo se gestionan mediante recursos y operadores personalizados. Sin embargo, la naturaleza din\u00e1mica de Kubernetes implica que los pods, especialmente los de cargas de trabajo con estado, no tienen garantizada una larga vida \u00fatil. Eventos como el mantenimiento o la presi\u00f3n sobre los recursos pueden desencadenar desalojos de pods, que corren el riesgo de interrumpir los servicios si no se gestionan con cuidado.<\/p>\n<p>Eviction Reschedule Hook es un proyecto de c\u00f3digo abierto que pretende resolver este problema utilizando los controladores de admisi\u00f3n de Kubernetes para interceptar y rechazar las solicitudes de desalojo de pods gestionados por operadores, al tiempo que notifica al operador que un pod necesita ser trasladado. Su objetivo es ayudar a preservar la disponibilidad del servicio y reducir las interrupciones durante eventos como el mantenimiento de nodos.<\/p>\n<p>Siga leyendo:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>El problema que abordamos<\/li>\n<li>Por qu\u00e9 las opciones existentes no son suficientes<\/li>\n<li>Introducci\u00f3n a la reprogramaci\u00f3n de proyectos gancho<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Aunque cierta familiaridad con Kubernetes <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/extend-kubernetes\/operator\/\">operadores<\/a>Nodo <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/administer-cluster\/safely-drain-node\/\">vaciado<\/a>admisi\u00f3n <a href=\"https:\/\/kubernetes.io\/docs\/reference\/access-authn-authz\/admission-controllers\/\">control<\/a> y din\u00e1mica <a href=\"https:\/\/kubernetes.io\/docs\/reference\/access-authn-authz\/extensible-admission-controllers\/\">webhooks<\/a> ser\u00eda \u00fatil, intentar\u00e9 cubrir los conceptos clave a lo largo del camino.<span class=\"Apple-converted-space\"> En <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/operator\/\">Couchbase<\/a> Tambi\u00e9n se har\u00e1 referencia a Autonomous Operator como Operator para abreviar, y la mayor\u00eda de los ejemplos y demostraciones incluir\u00e1n recursos Couchbase de alg\u00fan tipo.<\/p>\n<p>Aunque originalmente se desarroll\u00f3 pensando en la plataforma de datos Couchbase, el proyecto de gancho de reprogramaci\u00f3n pretende ser flexible y puede configurarse para proteger otras aplicaciones con estado gestionadas por el operador.<\/p>\n<hr \/>\n<h2 style=\"font-weight: 400;\">Parte 1 - Por qu\u00e9 los desalojos son un reto para las aplicaciones con estado gestionadas por el operador<\/h2>\n<h3 style=\"font-weight: 200;\">Comprender los desahucios de las vainas<\/h3>\n<p>En Kubernetes, para desalojar un pod es necesario activar el comando <code>PreStop<\/code> hook y luego enviar un <code>SIGTERM<\/code> tras su finalizaci\u00f3n. Si el pod no ha salido despu\u00e9s de un per\u00edodo de gracia, esto es seguido por un <code>SIGKILL<\/code>. Los desalojos se producen tanto voluntaria como involuntariamente por multitud de razones, desde la presi\u00f3n de los nodos hasta el autoescalado, pero este proyecto se centra en los desalojos voluntarios que se desencadenan al vaciar los nodos. Este es el proceso por el cual los pods se eliminan de los nodos utilizando la API de desalojo de Kubernetes, que a menudo es necesaria para despejar el camino para operaciones como el mantenimiento o las actualizaciones.<\/p>\n<p>Ejecutar <code>kubectl drenar<\/code> es una forma com\u00fan de preparar un nodo para su mantenimiento en Kubernetes. Marca el nodo como no programable y env\u00eda solicitudes de desalojo simult\u00e1neamente para todos los pods que se ejecutan en ese nodo.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17326\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/nodedrains.png\" alt=\"\" width=\"616\" height=\"444\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/nodedrains.png 616w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/nodedrains-300x216.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/nodedrains-18x12.png 18w\" sizes=\"auto, (max-width: 616px) 100vw, 616px\" \/><\/p>\n<hr \/>\n<h3 style=\"font-weight: 200;\">Por qu\u00e9 las aplicaciones con estado son un reto<\/h3>\n<p>Las cargas de trabajo con estado a\u00f1aden complejidad a la gesti\u00f3n de los desalojos:<\/p>\n<p style=\"padding-left: 40px;\"><strong data-renderer-mark=\"true\">Tiempos de cierre impredecibles:<\/strong> Estas cargas de trabajo pueden implicar procesos de larga duraci\u00f3n, como consultas en vuelo, que deben finalizar antes de que un pod pueda cerrarse de forma segura.<\/p>\n<p style=\"padding-left: 40px;\"><strong data-renderer-mark=\"true\">Coordinaci\u00f3n de aplicaciones:<\/strong> A menudo es necesario notificar a la propia aplicaci\u00f3n antes de eliminar el pod para garantizar la coherencia de los datos y un reequilibrio adecuado.<\/p>\n<p style=\"padding-left: 40px;\"><strong data-renderer-mark=\"true\">Gesti\u00f3n de operadores:<\/strong> Los operadores que gestionan la aplicaci\u00f3n necesitan tiempo para coordinar la retirada de vainas con el estado interno del operador<\/p>\n<p style=\"padding-left: 40px;\"><strong>Movimiento de volumen:<\/strong> La migraci\u00f3n de vol\u00famenes Kubernetes de un nodo a otro puede llevar un tiempo considerable que supere el tiempo de vida del pod. <code>terminationGracePeriodSeconds<\/code><\/p>\n<p>Un Operador automatiza el ciclo de vida de aplicaciones complejas reconciliando continuamente su estado real con el estado deseado definido en recursos personalizados.<\/p>\n<p>Tomemos Couchbase como ejemplo. Un cluster de Couchbase se compone de m\u00faltiples pods, cada uno ejecutando una instancia de Couchbase Server, normalmente repartidos en diferentes nodos y zonas de disponibilidad. El Operador se asegura de que el estado del cluster coincide con el estado definido en un <code>CouchbaseCluster<\/code> recurso. Cuando un pod necesita ser eliminado, el Operador debe notificar al cluster para reequilibrar los datos y manejar cualquier proceso en ejecuci\u00f3n con gracia.<\/p>\n<h3 style=\"font-weight: 200;\">Retos organizativos<\/h3>\n<p>Otro reto com\u00fan es la separaci\u00f3n de responsabilidades en las grandes organizaciones:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Los administradores de Kubernetes gestionan la infraestructura<\/li>\n<li>Los equipos de aplicaciones gestionan las aplicaciones con estado que se ejecutan en esa infraestructura<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Esto significa que los administradores de Kubernetes necesitan formas de vaciar nodos de forma segura para realizar tareas de mantenimiento sin tener que coordinarse constantemente con los propietarios de las aplicaciones ni afectar a la disponibilidad o el estado de la aplicaci\u00f3n subyacente.<\/p>\n<hr role=\"presentation\" \/>\n<h3 style=\"font-weight: 200;\">Protecciones existentes de Kubernetes: por qu\u00e9 no son suficientes<\/h3>\n<p>Kubernetes proporciona herramientas como <strong>Ganchos PreStop<\/strong> y <strong>Presupuestos Pod Disruption<\/strong> para ayudar con los cierres graceful y la disponibilidad de las aplicaciones durante los desalojos.<\/p>\n<p><strong>Ganchos PreStop<\/strong> ejecutar scripts dentro del contenedor antes del <code>SIGTERM<\/code> dando al pod la oportunidad de apagarse. Para aplicaciones sin estado, esto suele ser suficiente. Pero para aplicaciones con estado, los operadores a menudo necesitan coordinar la eliminaci\u00f3n del pod antes de la terminaci\u00f3n para evitar los problemas descritos anteriormente, lo que es dif\u00edcil de hacer dentro de los ganchos preStop.<\/p>\n<p>Un enfoque ingenioso que hemos visto consiste en a\u00f1adir un script preStop a las plantillas de pod utilizadas por el Operador. Este script hace que el pod se a\u00f1ada a s\u00ed mismo la anotaci\u00f3n de reprogramaci\u00f3n (de la que hablaremos m\u00e1s adelante) para notificar al Operador que debe ser movido, y luego hace un bucle hasta que ha sido expulsado de forma segura del cl\u00faster.<\/p>\n<p><strong>Esquema b\u00e1sico del gui\u00f3n, no exacto:<\/strong><\/p>\n<pre class=\"nums:false lang:default decode:true\">preStop:\r\n  exec:\r\n    command:\r\n    - \/bin\/sh\r\n      \/mnt\/kubectl annotate pod $SELF_POD_NAME cao.couchbase.com\/reschedule=true \\\\\r\n      while \/opt\/couchbase\/bin\/couchbase-cli server-list -c couchbases:\/\/localhost\\\\\\_nombre_del_pod\r\n      do\r\n        sleep 1; \\\r\n      hecho\r\n<\/pre>\n<p>Sin embargo, para ello es necesario montar <code>kubectl<\/code> y <code>couchbase-cli<\/code> en cada pod, aumentando la complejidad y el tama\u00f1o de la imagen. Los problemas de red o de otro tipo tambi\u00e9n podr\u00edan interrumpir la secuencia de comandos y provocar la finalizaci\u00f3n prematura del pod.<\/p>\n<p><strong>Presupuestos de disrupci\u00f3n de vainas (PDB)<\/strong> aseguran que un n\u00famero m\u00ednimo de pods permanezca disponible durante interrupciones voluntarias. Pero solo limitan el n\u00famero de m\u00f3dulos que pueden desalojarse simult\u00e1neamente, lo que significa que seguimos enfrent\u00e1ndonos a la situaci\u00f3n en la que un operador no es capaz de gestionar correctamente la retirada de m\u00f3dulos.<\/p>\n<hr role=\"presentation\" \/>\n<h3 style=\"font-weight: 200;\">\u00bfQu\u00e9 ocurre si hoy se desalojan las c\u00e1psulas?<\/h3>\n<p>El Operador crea PDBs para Couchbase para limitar cu\u00e1ntos pods pueden ser desalojados a la vez. Aunque esto asegura un nivel m\u00ednimo de disponibilidad para la aplicaci\u00f3n, los pods que sean desalojados ser\u00e1n eliminados de forma insegura del cl\u00faster de Couchbase mediante failover.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17327\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/currentDrain_terminal.gif\" alt=\"\" width=\"800\" height=\"172\" \/><\/p>\n<p>Tambi\u00e9n podemos ver c\u00f3mo Operator maneja esto observando lo que ocurre en la interfaz de usuario del administrador de Couchbase.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17328\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/currentDrain_gui.gif\" alt=\"\" width=\"800\" height=\"319\" \/><\/p>\n<p>Incluso cuando los desalojos ocurren un pod a la vez, una vez que un pod se reinicia en un nuevo nodo, Kubernetes puede permitir desalojos en el siguiente pod antes de que el nuevo pod se haya a\u00f1adido de forma segura a la aplicaci\u00f3n con estado. En Couchbase, evitamos esto con una puerta de preparaci\u00f3n en los pods.<\/p>\n<p>Para solucionar estos problemas, hemos introducido el <code>cao.couchbase.com\/rechedule<\/code> en CAO v2.7.0. Cuando se a\u00f1ade a un pod, indica al Operador que debe ser recreado. Sin embargo, acordonar manualmente los nodos y a\u00f1adir esta anotaci\u00f3n es tedioso, no se escala bien, y s\u00f3lo afecta a los pods de Couchbase - otros pods todav\u00eda requieren un drenaje normal.<\/p>\n<hr \/>\n<h3 style=\"font-weight: 200;\">\u00bfPor qu\u00e9 no gestionar todo esto dentro del Operador?<\/h3>\n<p>Nos planteamos integrar la l\u00f3gica de validaci\u00f3n del desalojo en el propio Operador, pero:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Es un anti-patr\u00f3n en el dise\u00f1o de operadores Kubernetes. Los operadores funcionan a trav\u00e9s de bucles de reconciliaci\u00f3n, no de controladores de admisi\u00f3n<\/li>\n<li>A\u00f1adir puntos finales de control de admisi\u00f3n a los operadores complica la implantaci\u00f3n y el mantenimiento<\/li>\n<li>Los webhooks de validaci\u00f3n son recursos de \u00e1mbito de cl\u00faster y, por tanto, requieren permisos de \u00e1mbito de cl\u00faster. El Operador es de \u00e1mbito de espacio de nombres y requerir\u00eda una gran expansi\u00f3n de sus permisos requeridos.<\/li>\n<li>La construcci\u00f3n de esta l\u00f3gica en un proyecto propio permite el \"open sourcing\" e invita a la comunidad a contribuir en casos de uso similares.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr role=\"presentation\" \/>\n<h2 style=\"font-weight: 400;\">Parte 2 - aprovechamiento de Kubernetes Webhooks para desalojos inteligentes de pods<\/h2>\n<p>El Eviction Reschedule Hook es un controlador de admisi\u00f3n de Kubernetes de c\u00f3digo abierto dise\u00f1ado para mejorar la forma en que se gestionan los desalojos durante los vaciados de nodos para evitar los problemas descritos en la primera parte. Trabajando en t\u00e1ndem con un Operador, automatiza la reprogramaci\u00f3n del pod interceptando las peticiones de desalojo antes de que lleguen al pod. Estas solicitudes se rechazan de forma selectiva, de manera que se sigue permitiendo la reprogramaci\u00f3n est\u00e1ndar de los nodos. <code>kubectl drenar<\/code> funcione como es debido.<\/p>\n<p>En lugar de terminar inmediatamente los pods o probar los l\u00edmites del presupuesto de interrupci\u00f3n de pods (PDB), el controlador de admisi\u00f3n notifica al operador que es necesario mover un pod mediante el comando <code>cao.couchbase.com\/rechedule<\/code> anotaci\u00f3n.<\/p>\n<hr \/>\n<h3 style=\"font-weight: 200;\">Comprender el control de admisi\u00f3n<\/h3>\n<p>El control de admisi\u00f3n es una etapa clave en el ciclo de vida de las solicitudes de la API de Kubernetes que se produce despu\u00e9s de que una solicitud haya sido autenticada y autorizada, pero antes de que persista en el cl\u00faster.<\/p>\n<p>Los controladores de admisi\u00f3n pueden validar o mutar estas solicitudes bas\u00e1ndose en una l\u00f3gica personalizada.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17329\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/nodeDrains_webhook.png\" alt=\"\" width=\"516\" height=\"296\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/nodeDrains_webhook.png 516w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/nodeDrains_webhook-300x172.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/nodeDrains_webhook-18x10.png 18w\" sizes=\"auto, (max-width: 516px) 100vw, 516px\" \/><\/p>\n<p>Cuando se vac\u00eda un nodo en Kubernetes, cada intento de desalojo de un pod desencadena un <code>CREAR<\/code> solicitud de <code>vainas\/desahucios<\/code> subrecurso. Aqu\u00ed es donde entra en juego nuestro controlador de admisi\u00f3n. Intercepta estas solicitudes de desalojo antes de que lleguen a los pods y determina si deben permitirse. En nuestro caso, la l\u00f3gica de admisi\u00f3n implica se\u00f1alar al Operador que un pod debe ser reprogramado de forma segura a\u00f1adiendo la anotaci\u00f3n de reprogramaci\u00f3n.<\/p>\n<p>Estamos utilizando un webhook de validaci\u00f3n en lugar de un webhook de mutaci\u00f3n porque nuestro objetivo principal es evaluar si la solicitud de desalojo est\u00e1 permitida. Aunque podemos anotar el pod como parte del proceso de decisi\u00f3n, el webhook en s\u00ed est\u00e1 realizando la validaci\u00f3n, no la mutaci\u00f3n, de la solicitud de desalojo.<\/p>\n<hr \/>\n<h3 style=\"font-weight: 200;\">Gesti\u00f3n de drenajes de nodos<\/h3>\n<p>Como el t\u00edtulo de este art\u00edculo deja claro, el objetivo principal de este proyecto es permitir un manejo elegante de los drenajes de nodos. Con el Eviction Reschedule Hook en su lugar, el flujo est\u00e1ndar de drenaje de nodos se modifica para soportar una migraci\u00f3n de pods m\u00e1s segura.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-17330\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/nodeDrains_advanced-1024x486.png\" alt=\"\" width=\"900\" height=\"427\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/nodeDrains_advanced-1024x486.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/nodeDrains_advanced-300x142.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/nodeDrains_advanced-768x364.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/nodeDrains_advanced-18x9.png 18w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/nodeDrains_advanced.png 1096w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>Las solicitudes de desalojo se interceptan antes de que el <code>PreStop<\/code> se ejecuta. En lugar de terminar el pod, se rechaza la solicitud de desalojo y se anota el pod. El Operator comprueba si aparece la anotaci\u00f3n de reprogramaci\u00f3n durante cada bucle de reconciliaci\u00f3n. Si aparece la anotaci\u00f3n, se encargar\u00e1 de volver a crear el pod de forma segura.<\/p>\n<p>Como drenar un nodo lo mancha con <code>node.kubernetes.io\/unschedulable<\/code>Suponiendo que exista otro nodo en el cl\u00faster Kubernetes que cumpla los requisitos de programaci\u00f3n del pod, cuando el Operador cree el nuevo pod, \u00e9ste existir\u00e1 en otro nodo.<\/p>\n<p>Es importante destacar que el controlador de admisi\u00f3n est\u00e1 dise\u00f1ado para filtrar selectivamente s\u00f3lo los pods relevantes. Todas las dem\u00e1s cargas de trabajo en el nodo contin\u00faan siguiendo el proceso de desalojo por defecto.<\/p>\n<hr \/>\n<h3 style=\"font-weight: 200;\">Trabajar con Kubectl<\/h3>\n<p>Para integrarse sin problemas con <code>kubectl<\/code>es importante entender lo que ocurre bajo el cap\u00f3 cuando se ejecuta <code>kubectl drain<\/code>. Mirando el <code>vaciar.ir<\/code> <a href=\"https:\/\/github.com\/kubernetes\/kubectl\/blob\/master\/pkg\/cmd\/drain\/drain.go\">fuente<\/a>Una vez acordonado el nodo, se genera una goroutine independiente para cada pod de ese nodo para gestionar su desalojo.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-17331\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-1024x375.png\" alt=\"\" width=\"900\" height=\"330\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-1024x375.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-300x110.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-768x281.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-1536x562.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-18x7.png 18w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-1320x483.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain.png 1912w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>Si <code>kubectl<\/code> contin\u00faa intentando desalojar un pod depende de la respuesta del controlador de admisi\u00f3n. Si la solicitud de desalojo tiene \u00e9xito (es decir, no se devuelve ning\u00fan error), se sale del bucle en el que se env\u00edan las solicitudes de desalojo. A continuaci\u00f3n, se realiza una comprobaci\u00f3n de seguimiento en la que <code>kubectl<\/code> espera a que se elimine el pod. Sin embargo, para los pods gestionados por Operator, queremos <code>kubectl<\/code> para seguir reintentando hasta que se hayan reprogramado de forma segura, momento en el que deber\u00edamos finalizar la goroutina antes de realizar m\u00e1s comprobaciones.<\/p>\n<p>Por dise\u00f1o, <code>kubectl<\/code> trata a <code>429 DemasiadasPeticiones<\/code> a la solicitud de desalojo en la goroutine como se\u00f1al para hacer una pausa de 5 segundos antes de volver a intentarlo. Podemos aprovechar este comportamiento en nuestro controlador de admisi\u00f3n: despu\u00e9s de la l\u00f3gica de selecci\u00f3n de pods, devolvemos un <code>429<\/code> si el pod est\u00e1 siendo anotado para reprogramaci\u00f3n o si ya est\u00e1 anotado y esperando a ser movido.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-17332\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-2-1024x233.png\" alt=\"\" width=\"900\" height=\"205\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-2-1024x233.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-2-300x68.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-2-768x175.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-2-1536x349.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-2-18x4.png 18w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-2-1320x300.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-2.png 1540w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p data-renderer-start-pos=\"11160\">Despu\u00e9s de que el pod haya sido reprogramado con \u00e9xito, tendr\u00e1 un nombre diferente y, por lo tanto, el controlador de admisi\u00f3n ya no podr\u00e1 localizarlo por nombre y espacio de nombres. En ese momento, podemos devolver un <code>404 No encontrado<\/code> para salir de la goroutine.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-17333\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-3-1024x266.png\" alt=\"\" width=\"900\" height=\"234\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-3-1024x266.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-3-300x78.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-3-768x199.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-3-18x5.png 18w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-3-1320x342.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/kubectl-drain-3.png 1342w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<hr \/>\n<h3 style=\"font-weight: 200;\">Reprogramaci\u00f3n de pods in situ<\/h3>\n<p>En algunos casos, el Operador puede eliminar y volver a crear un pod utilizando el mismo nombre.<\/p>\n<p>En Couchbase, el <code>upgradeProcess<\/code> en un campo <code>CouchbaseCluster<\/code> puede cambiarse a <a href=\"https:\/\/docs.couchbase.com\/operator\/current\/resource\/couchbasecluster.html#couchbaseclusters-spec-upgradeprocess\">control<\/a> la forma en que el operador sustituye las c\u00e1psulas. El valor predeterminado es <strong>SwapRebalance<\/strong>que indica al operador que debe crear un nuevo pod con un nombre diferente, reequilibrarlo en el cl\u00faster y, a continuaci\u00f3n, eliminar el pod antiguo. <strong data-renderer-mark=\"true\">InPlaceUpgrade<\/strong> es una alternativa m\u00e1s r\u00e1pida pero menos flexible, por la que el Operador borrar\u00e1 el pod y lo volver\u00e1 a crear con el mismo nombre, reutilizando los vol\u00famenes existentes. Esto supone un reto para el controlador de admisi\u00f3n.<\/p>\n<p>Las solicitudes de desalojo enviadas por la goroutine en <code>kubectl<\/code> s\u00f3lo incluyen el nombre y el espacio de nombres del pod. Debido a este contexto limitado, el controlador de admisi\u00f3n no puede asumir que un pod que carece de una anotaci\u00f3n de reprogramaci\u00f3n necesita ser movido - puede ser simplemente una instancia reci\u00e9n recreada de un pod que ya fue reprogramado.<\/p>\n<p>Para ello, el controlador de admisi\u00f3n mantiene un mecanismo de seguimiento ligero que se utiliza cuando se reprograman pods con el mismo nombre. Cuando se anota un pod para su reprogramaci\u00f3n, tambi\u00e9n se anota otro recurso, denominado recurso de seguimiento, con el atributo <code>reprogramar.hook\/. clave<\/code>.<\/p>\n<p>Si se intercepta una solicitud de desalojo posterior para un pod sin la anotaci\u00f3n de reprogramaci\u00f3n, la presencia de esta anotaci\u00f3n en el recurso de seguimiento indica que el pod ya ha sido reprogramado. Cuando esto ocurra, el webhook limpiar\u00e1 la anotaci\u00f3n de seguimiento para ese pod antes de devolver un <code>404 No encontrado<\/code> para salir de la goroutine.<\/p>\n<p>Mientras que el tipo de recurso de seguimiento ser\u00e1 por defecto <code>CouchbaseCluster<\/code>el webhook tambi\u00e9n permite utilizar el pod <code>Espacio de nombres<\/code>. Si los pods nunca se reprogramar\u00e1n con el mismo nombre, esta funci\u00f3n puede desactivarse.<\/p>\n<hr role=\"presentation\" \/>\n<h3 style=\"font-weight: 200;\">Ejecutar el gancho de reprogramaci\u00f3n de desahucios<\/h3>\n<p>Desplegar el gancho de reprogramaci\u00f3n de desalojos y sus componentes de apoyo es sencillo. La direcci\u00f3n <a href=\"https:\/\/github.com\/couchbaselabs\/eviction-reschedule-hook\/blob\/master\/README.md\" data-renderer-mark=\"true\">L\u00c9AME<\/a> ofrece instrucciones detalladas para crear la imagen y desplegar la pila completa.<\/p>\n<p>Los principales componentes del gancho de reprogramaci\u00f3n son:<\/p>\n<p style=\"padding-left: 40px;\"><strong>ValidatingWebhookConfiguration: <\/strong>Indica al servidor API de Kubernetes que reenv\u00ede <code>CREAR<\/code> solicitudes de <code>vainas\/desahucios<\/code> a nuestro servicio webhook<\/p>\n<p style=\"padding-left: 40px;\"><strong>Servicio: <\/strong>Enruta las peticiones entrantes de webhook al pod del controlador de admisi\u00f3n.<\/p>\n<p style=\"padding-left: 40px;\"><strong>Controlador de admisiones: <\/strong>Ejecuta el gancho de reprogramaci\u00f3n dentro de un contenedor, normalmente desplegado como un despliegue de Kubernetes.<\/p>\n<p style=\"padding-left: 40px;\"><strong>ServiceAccount, ClusterRole y ClusterRoleBinding: <\/strong>Conceden al controlador de admisi\u00f3n los permisos necesarios. Como m\u00ednimo, <code>consiga<\/code> y <code>parche<\/code> se necesitan permisos para los pods. Si se utiliza un recurso de seguimiento, <code>consiga<\/code> y <code>parche<\/code> tambi\u00e9n deben a\u00f1adirse permisos para el recurso de seguimiento<\/p>\n<p>Una vez desplegado, el vaciado de un nodo en el que residen pods de Couchbase demuestra c\u00f3mo el Reschedule Hook intercepta y rechaza las peticiones de desalojo hasta que el Operator recrea y equilibra de forma segura los pods de nuevo en el cl\u00faster:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17334\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/safeDrain_terminal.gif\" alt=\"\" width=\"800\" height=\"163\" \/><\/p>\n<p>El manejo elegante de las solicitudes de desalojo tambi\u00e9n se puede ver en la interfaz de usuario del administrador de Couchbase. Los pods ya no fallan y son reemplazados con cero tiempo de inactividad:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17335\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/safeDrain_gui.gif\" alt=\"\" width=\"800\" height=\"225\" \/><\/p>\n<hr \/>\n<h3 style=\"font-weight: 200;\">Pru\u00e9balo, participa<\/h3>\n<p>El gancho de reprogramaci\u00f3n de desalojos hace que los vaciados de nodos sean m\u00e1s seguros y predecibles para las aplicaciones con estado que se ejecutan en Kubernetes. Al coordinar la gesti\u00f3n de desalojos con un operador, permite una reprogramaci\u00f3n elegante sin interrumpir la aplicaci\u00f3n subyacente.<\/p>\n<p>El proyecto es de c\u00f3digo abierto. Visite la p\u00e1gina <a href=\"https:\/\/github.com\/couchbaselabs\/eviction-reschedule-hook\" data-renderer-mark=\"true\">repositorio<\/a> en GitHub para empezar y echa un vistazo al <a href=\"https:\/\/github.com\/couchbaselabs\/eviction-reschedule-hook\/blob\/master\/CONTRIBUTE.md\">Contribuci\u00f3n<\/a> si est\u00e1s interesado en ayudar. Comentarios, problemas y pull requests son bienvenidos.<\/p>","protected":false},"excerpt":{"rendered":"<p>Why and how we built an admission controller to make node drains safer when running stateful applications in Kubernetes. Running stateful applications in Kubernetes is increasingly common and these are often managed using custom resources and operators. However, the dynamic [&hellip;]<\/p>","protected":false},"author":85555,"featured_media":17336,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[9284,2322],"tags":[],"ppma_author":[10068,9590],"class_list":["post-17325","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-autonomous-operator","category-kubernetes"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Rethinking Node Drains: A Webhook Based Approach to Graceful Pod Removal - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"The Eviction Reschedule Hook project uses Kubernetes Admission Controllers to intercept and reject eviction requests for operator-managed pods.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/node-drains-webhook-pod-removal\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rethinking Node Drains: A Webhook Based Approach to Graceful Pod Removal\" \/>\n<meta property=\"og:description\" content=\"The Eviction Reschedule Hook project uses Kubernetes Admission Controllers to intercept and reject eviction requests for operator-managed pods.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/node-drains-webhook-pod-removal\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-18T00:47:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-18T18:56:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-nodedrain.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1256\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Ben Mottershead, Software Engineer, Justin Ashworth - Senior Software Engineer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ben Mottershead, Software Engineer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/\"},\"author\":{\"name\":\"Ben Mottershead, Software Engineer\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2e3f0eb06846472e4fb9fa87e924eb1b\"},\"headline\":\"Rethinking Node Drains: A Webhook Based Approach to Graceful Pod Removal\",\"datePublished\":\"2025-07-18T00:47:42+00:00\",\"dateModified\":\"2025-07-18T18:56:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/\"},\"wordCount\":2256,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-nodedrain.png\",\"articleSection\":[\"Couchbase Autonomous Operator\",\"Kubernetes\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/\",\"name\":\"Rethinking Node Drains: A Webhook Based Approach to Graceful Pod Removal - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-nodedrain.png\",\"datePublished\":\"2025-07-18T00:47:42+00:00\",\"dateModified\":\"2025-07-18T18:56:18+00:00\",\"description\":\"The Eviction Reschedule Hook project uses Kubernetes Admission Controllers to intercept and reject eviction requests for operator-managed pods.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-nodedrain.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-nodedrain.png\",\"width\":2400,\"height\":1256},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Rethinking Node Drains: A Webhook Based Approach to Graceful Pod Removal\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2e3f0eb06846472e4fb9fa87e924eb1b\",\"name\":\"Ben Mottershead, Software Engineer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/e61125d073286ff4deda9445d38fa03a\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/1719955373757.jpeg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/1719955373757.jpeg\",\"caption\":\"Ben Mottershead, Software Engineer\"},\"description\":\"Ben is a software engineer who works out of Couchbase's Manchester office. He's been a part of the autonomous operator team since August, which introduced him to the data on Kubernetes ecosystem. Ben has been developing applications for the cloud since he finished university in 2021 and has worked with a number of languages and technologies, more recently focusing on Go, K8s and Couchbase Server.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/benmottershead\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Rethinking Node Drains: A Webhook Based Approach to Graceful Pod Removal - The Couchbase Blog","description":"El proyecto Eviction Reschedule Hook utiliza Kubernetes Admission Controllers para interceptar y rechazar solicitudes de desalojo de pods gestionados por operadores.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/node-drains-webhook-pod-removal\/","og_locale":"es_MX","og_type":"article","og_title":"Rethinking Node Drains: A Webhook Based Approach to Graceful Pod Removal","og_description":"The Eviction Reschedule Hook project uses Kubernetes Admission Controllers to intercept and reject eviction requests for operator-managed pods.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/node-drains-webhook-pod-removal\/","og_site_name":"The Couchbase Blog","article_published_time":"2025-07-18T00:47:42+00:00","article_modified_time":"2025-07-18T18:56:18+00:00","og_image":[{"width":2400,"height":1256,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-nodedrain.png","type":"image\/png"}],"author":"Ben Mottershead, Software Engineer, Justin Ashworth - Senior Software Engineer","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Ben Mottershead, Software Engineer","Est. reading time":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/"},"author":{"name":"Ben Mottershead, Software Engineer","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2e3f0eb06846472e4fb9fa87e924eb1b"},"headline":"Rethinking Node Drains: A Webhook Based Approach to Graceful Pod Removal","datePublished":"2025-07-18T00:47:42+00:00","dateModified":"2025-07-18T18:56:18+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/"},"wordCount":2256,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-nodedrain.png","articleSection":["Couchbase Autonomous Operator","Kubernetes"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/","url":"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/","name":"Rethinking Node Drains: A Webhook Based Approach to Graceful Pod Removal - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-nodedrain.png","datePublished":"2025-07-18T00:47:42+00:00","dateModified":"2025-07-18T18:56:18+00:00","description":"El proyecto Eviction Reschedule Hook utiliza Kubernetes Admission Controllers para interceptar y rechazar solicitudes de desalojo de pods gestionados por operadores.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-nodedrain.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-nodedrain.png","width":2400,"height":1256},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/node-drains-webhook-pod-removal\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Rethinking Node Drains: A Webhook Based Approach to Graceful Pod Removal"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2e3f0eb06846472e4fb9fa87e924eb1b","name":"Ben Mottershead, Ingeniero de software","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/e61125d073286ff4deda9445d38fa03a","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/1719955373757.jpeg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/1719955373757.jpeg","caption":"Ben Mottershead, Software Engineer"},"description":"Ben is a software engineer who works out of Couchbase's Manchester office. He's been a part of the autonomous operator team since August, which introduced him to the data on Kubernetes ecosystem. Ben has been developing applications for the cloud since he finished university in 2021 and has worked with a number of languages and technologies, more recently focusing on Go, K8s and Couchbase Server.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/benmottershead\/"}]}},"authors":[{"term_id":10068,"user_id":85555,"is_guest":0,"slug":"benmottershead","display_name":"Ben Mottershead, Software Engineer","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/1719955373757.jpeg","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/1719955373757.jpeg"},"author_category":"","last_name":"Mottershead, Software Engineer","first_name":"Ben","job_title":"Software Engineer","user_url":"","description":"Ben es un ingeniero de software que trabaja en la oficina de Couchbase en Manchester. Forma parte del equipo de operadores aut\u00f3nomos desde agosto, lo que le introdujo en el ecosistema de datos en Kubernetes. Ben ha estado desarrollando aplicaciones para la nube desde que termin\u00f3 la universidad en 2021 y ha trabajado con varios lenguajes y tecnolog\u00edas, centr\u00e1ndose m\u00e1s recientemente en Go, K8s y Couchbase Server."},{"term_id":9590,"user_id":81274,"is_guest":0,"slug":"justin-ashworth","display_name":"Justin Ashworth - Senior Software Engineer","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/f8d9f3bd93c0cdd95cbe3e125a15ad07c4cc276956d641a724306dc519fe14fa?s=96&d=mm&r=g","author_category":"","last_name":"Ashworth","first_name":"Justin","job_title":"","user_url":"https:\/\/couchbase.com","description":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/17325","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/85555"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=17325"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/17325\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/17336"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=17325"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=17325"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=17325"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=17325"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}