|
| 1 | +--- |
| 2 | +reviewers: |
| 3 | +- electrocucaracha |
| 4 | +- raelga |
| 5 | +- gamba47 |
| 6 | +title: Interrupciones |
| 7 | +content_type: concept |
| 8 | +weight: 60 |
| 9 | +--- |
| 10 | + |
| 11 | +<!-- overview --> |
| 12 | +Esta guía es para los dueños de aplicaciones que quieren crear |
| 13 | +aplicaciones con alta disponibilidad y que necesitan entender |
| 14 | +que tipos de interrupciones pueden suceder en los Pods. |
| 15 | + |
| 16 | +También es para los administradores de clústers que quieren aplicar acciones |
| 17 | +automatizadas en sus clústers, cómo actualizar o autoescalar los clústers. |
| 18 | + |
| 19 | +<!-- body --> |
| 20 | + |
| 21 | +## Interrupciones voluntarias e involuntarias |
| 22 | + |
| 23 | +Los Pods no desaparecen hasta que algo (una persona o un controlador) los destruye |
| 24 | +ó hay problemas de hardware ó software que son inevitables. |
| 25 | + |
| 26 | +Nosotros llamamos a esos casos inevitables *interrupciones involuntarias* de |
| 27 | +una aplicación. Algunos ejemplos: |
| 28 | + |
| 29 | +- Una falla en hardware de la máquina física del nodo |
| 30 | +- Un administrador del clúster borra una VM (instancia) por error |
| 31 | +- El proveedor de la nube o el hipervisor falla y hace desaparecer la VM |
| 32 | +- Un kernel panic |
| 33 | +- El nodo desaparece del clúster por un problema de red que lo separa del clúster |
| 34 | +- Una remoción del Pod porque el nodo [no tiene recursos suficientes](/docs/concepts/scheduling-eviction/node-pressure-eviction/). |
| 35 | + |
| 36 | +A excepción de la condición sin recursos suficientes, todas estas condiciones |
| 37 | +deben ser familiares para la mayoría de los usuarios, no son específicas |
| 38 | +de Kubernetes |
| 39 | + |
| 40 | +Nosotros llamamos a los otros casos *interrupciones voluntarias*. Estas incluyen |
| 41 | +las acciones iniciadas por el dueño de la aplicación y aquellas iniciadas por el Administrador |
| 42 | +del Clúster. Las acciones típicas de los dueños de la aplicación incluye: |
| 43 | + |
| 44 | +- borrar el Deployment u otro controlador que maneja el Pod |
| 45 | +- actualizar el Deployment del Pod que causa un reinicio |
| 46 | +- borrar un Pod (por ejemplo, por accidente) |
| 47 | + |
| 48 | +Las acciones del administrador del clúster incluyen: |
| 49 | + |
| 50 | +- [Drenar un nodo](/docs/tasks/administer-cluster/safely-drain-node/) para reparar o actualizar. |
| 51 | +- Drenar un nodo del clúster para reducir el clúster (aprenda acerca de [Autoescalamiento de Clúster](https://github.com/kubernetes/autoscaler/#readme) |
| 52 | +). |
| 53 | +- Remover un Pod de un nodo para permitir que otra cosa pueda ingresar a ese nodo. |
| 54 | + |
| 55 | +Estas acciones pueden ser realizadas directamente por el administrador del clúster, por |
| 56 | +tareas automatizadas del administrador del clúster ó por el proveedor del clúster. |
| 57 | + |
| 58 | +Consulte al administrador de su clúster, a su proveedor de la nube ó a la documentación de su distribución |
| 59 | +para determinar si alguna de estas interrupciones voluntarias están habilitadas en su clúster. |
| 60 | +Si ninguna se encuentra habilitada, puede omitir la creación del presupuesto de Interrupción de Pods. |
| 61 | + |
| 62 | +{{< caution >}} |
| 63 | +No todas las interrupciones voluntarias son consideradas por el presupuesto de interrupción de Pods. Por ejemplo, |
| 64 | +borrar un Deployment o Pods que evitan el uso del presupuesto. |
| 65 | +{{< /caution >}} |
| 66 | + |
| 67 | +## Tratando con las interrupciones |
| 68 | + |
| 69 | +Estas son algunas de las maneras para mitigar las interrupciones involuntarias: |
| 70 | + |
| 71 | +- Asegurarse que el Pod [solicite los recursos](/docs/tasks/configure-pod-container/assign-memory-resource) que necesita. |
| 72 | +- Replique su aplicación si usted necesita alta disponibilidad. (Aprenda sobre correr aplicaciones replicadas |
| 73 | + [stateless](/docs/tasks/run-application/run-stateless-application-deployment/) |
| 74 | + y [stateful](/docs/tasks/run-application/run-replicated-stateful-application/) |
| 75 | +- Incluso, para una alta disponibilidad mayor cuando se corren aplicaciones replicadas, |
| 76 | + propague las aplicaciones por varios racks (usando |
| 77 | + [anti-affinity](/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity)) |
| 78 | + o usando zonas (si usa un [clúster multi-zona](/docs/setup/multiple-zones).) |
| 79 | + |
| 80 | +La frecuencia de las interrupciones voluntarias varía. En un clúster basico de Kubernetes, no hay |
| 81 | +interrupciones voluntarias automáticas (solo el usuario las genera). Sin embargo, su administrador del clúster o proveedor de alojamiento |
| 82 | +puede correr algun servicio adicional que pueda causar estas interrupciones voluntarias. Por ejemplo, |
| 83 | +desplegando una actualización de software en los nodos puede causar interrupciones. También, algunas implementaciones |
| 84 | +de clústers con autoescalamiento de nodos puede causar interrupciones para defragmentar o compactar los nodos. |
| 85 | +Su administrador de clúster o proveedor de alojamiento debe tener documentado cuál es el nivel de interrupciones |
| 86 | +voluntarias esperadas, sí es que las hay. Ciertas opciones de configuración, como ser |
| 87 | +[usar PriorityClasses](/docs/concepts/scheduling-eviction/pod-priority-preemption/) |
| 88 | +en las especificaciones de su Pod pueden también causar interrupciones voluntarias (o involuntarias). |
| 89 | + |
| 90 | + |
| 91 | +## Presupuesto de Interrupción de Pods |
| 92 | + |
| 93 | +{{< feature-state for_k8s_version="v1.21" state="stable" >}} |
| 94 | + |
| 95 | +Kubernetes ofrece carácteristicas para ayudar a ejecutar aplicaciones con alta disponibliidad, incluso cuando usted |
| 96 | +introduce interrupciones voluntarias frecuentes. |
| 97 | + |
| 98 | +Como dueño de la aplicación, usted puede crear un presupuesto de interrupción de Pods (PDB por sus siglas en inglés) para cada aplicación. |
| 99 | +Un PDB limita el numero de Pods de una aplicación replicada, que estan caídos de manera simultánea por |
| 100 | +interrupciones voluntarias. Por ejemplo, una aplicación basada en quórum puede |
| 101 | +asegurarse que el número de réplicas corriendo nunca es menor al |
| 102 | +número necesitado para obtener el quórum. Una web de tipo front end puede querer |
| 103 | +asegurarse que el número de réplicas atendiendo al tráfico nunca puede caer bajo un cierto |
| 104 | +porcentaje del total. |
| 105 | + |
| 106 | +Los administradores del clúster y proveedores de hosting pueden usar herramientas que |
| 107 | +respeten el presupuesto de interrupción de Pods utilizando la [API de Desalojo](/docs/tasks/administer-clúster/safely-drain-node/#eviction-api) |
| 108 | +en vez de directamente borrar Pods o Deployments. |
| 109 | + |
| 110 | +Por ejemplo, el subcomando `kubectl drain` le permite marcar un nodo a un modo fuera de |
| 111 | +servicio. Cuando se ejecuta `kubectl drain`, la herramienta trata de quitar a todos los Pods en |
| 112 | +el nodo que se esta dejando fuera de servicio. La petición de desalojo que `kubectl` solicita en |
| 113 | +su nombre puede ser temporalmente denegado, entonces la herramienta periodicamente reintenta todas las |
| 114 | +peticiones fallidas hasta que todos los Pods en el nodo afectado son terminados ó hasta que el tiempo de espera, |
| 115 | +que puede ser configurado, es alcanzado. |
| 116 | + |
| 117 | +Un PDB especifica el número de réplicas que una aplicación puede tolerar, relativo a cuantas |
| 118 | +se pretende tener. Por ejemplo, un Deployment que tiene un `.spec.replicas: 5` se |
| 119 | +supone que tiene 5 Pods en cualquier momento. Si su PDB permite tener 4 a la vez, |
| 120 | +entonces la API de Desalojo va a permitir interrupciones voluntarias de un (pero no a dos) Pod a la vez. |
| 121 | + |
| 122 | +El grupo de Pods que comprende a la aplicación esta especificada usando una etiqueta selectora, la misma |
| 123 | +que es usada por el controlador de aplicación (deployment, stateful-set, etc). |
| 124 | + |
| 125 | +El numero de Pods "deseado" es calculado a partir de `.spec.replicas` de el recurso de Workload |
| 126 | +que es manejado para esos Pods. El plano de control descubre el recurso Workload perteneciente a el |
| 127 | +examinando las `.metadata.ownerReferences` del Pod. |
| 128 | + |
| 129 | +Las [Interrupciones Involuntarias](#voluntary-and-involuntary-disruptions) no pueden ser prevenidas por los PDB; pero si |
| 130 | +son contabilizadas a partir este presupuesto. |
| 131 | + |
| 132 | +Los Pods que son borrados o no estan disponibles debido a una actualización continua de una aplicación forman parte del presupuesto de interrupciones, pero los recursos Workload (como los Deployments y StatefulSet) |
| 133 | +no están limitados por los PDBs cuando se hacen actualizaciones continuas. En cambio, la administración de fallas |
| 134 | +durante la actualización de la aplicación es configurada en la especificación para este recurso Workload específico. |
| 135 | + |
| 136 | +Cuando un Pod es quitado usando la API de desalojo, este es |
| 137 | +[terminado](/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination) correctamente, haciendo honor al |
| 138 | +`terminationGracePeriodSeconds` configurado en su [PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core). |
| 139 | + |
| 140 | +## Ejemplo de Presupuesto de Interrupción de POD {#pdb-example} |
| 141 | + |
| 142 | +Considere un clúster con 3 nodos, `nodo-1` hasta `nodo-3`. |
| 143 | +El clúster esta corriendo varias aplicaciones. Uno de ellos tiene 3 replicas, que llamaremos |
| 144 | +`pod-a`, `pod-b`, y `pod-c`. Otro Pod no relacionado y sin PDB, llamado `pod-x`, también se muestra. |
| 145 | + |
| 146 | +Inicialmente los pods estan distribuidos de esta manera: |
| 147 | + |
| 148 | + |
| 149 | +| nodo-1 | nodo-2 | nodo-3 | |
| 150 | +|:--------------------:|:-------------------:|:------------------:| |
| 151 | +| pod-a *available* | pod-b *available* | pod-c *available* | |
| 152 | +| pod-x *available* | | | |
| 153 | + |
| 154 | +Los 3 Pods son parte de un Deployment, ellos colectivamente tienen un PDB que requiere |
| 155 | +que por lo menos 2 de los 3 Pods esten disponibles todo el tiempo. |
| 156 | + |
| 157 | +Por ejemplo, supongamos que el administrador del clúster quiere reiniciar para actualizar el kernel y arreglar un bug. |
| 158 | +El administrador del clúster primero intenta desocupar el `nodo-1` usando el comando `kubectl drain`. |
| 159 | +La herramienta intenta desalojar a los pods `pod-a` y `pod-x`. Esto tiene éxito inmediatamente. |
| 160 | +Ambos Pods van al estado `terminating` al mismo tiempo. |
| 161 | +Pone al clúster en el siguiente estado: |
| 162 | + |
| 163 | +| nodo-1 *draining* | nodo-2 | nodo-3 | |
| 164 | +|:--------------------:|:-------------------:|:------------------:| |
| 165 | +| pod-a *terminating* | pod-b *available* | pod-c *available* | |
| 166 | +| pod-x *terminating* | | | |
| 167 | + |
| 168 | +El Deployment detecta que uno de los Pods esta terminando, entonces crea un reemplazo |
| 169 | +llamado `pod-d`. Como el `nodo-1` esta bloqueado, el pod termina en otro nodo. Algo más, adicionalmente |
| 170 | +a creado el pod `pod-y` como un reemplazo del `pod-x` . |
| 171 | + |
| 172 | +(Nota: para un StatefulSet, `pod-a`, el cual debería ser llamado algo como `pod-0`, necesitaría ser terminado completamente antes de su remplazo, el cual también es llamado `pod-0` pero tiene un UID diferente, podría ser creado. De lo contrario, el ejemplo también aplica a un StatefulSet.) |
| 173 | + |
| 174 | +Ahora el clúster esta en este estado: |
| 175 | + |
| 176 | +| nodo-1 *draining* | nodo-2 | nodo-3 | |
| 177 | +|:--------------------:|:-------------------:|:------------------:| |
| 178 | +| pod-a *terminating* | pod-b *available* | pod-c *available* | |
| 179 | +| pod-x *terminating* | pod-d *starting* | pod-y | |
| 180 | + |
| 181 | +En algún punto, los Pods finalizan y el clúster se ve de esta forma: |
| 182 | + |
| 183 | +| nodo-1 *drained* | nodo-2 | nodo-3 | |
| 184 | +|:--------------------:|:-------------------:|:------------------:| |
| 185 | +| | pod-b *available* | pod-c *available* | |
| 186 | +| | pod-d *starting* | pod-y | |
| 187 | + |
| 188 | +En este estado, si un administrador del clúster impaciente intenta desalojar el `nodo-2` ó el |
| 189 | +`nodo-3`, el comando drain va a ser bloqueado, porque hay solamente 2 Pods disponibles para |
| 190 | +el Deployment y el PDB requiere por lo menos 2. Después de pasado un tiempo el `pod-d` esta disponible. |
| 191 | + |
| 192 | +El estado del clúster ahora se ve así: |
| 193 | + |
| 194 | +| nodo-1 *drained* | nodo-2 | nodo-3 | |
| 195 | +|:--------------------:|:-------------------:|:------------------:| |
| 196 | +| | pod-b *available* | pod-c *available* | |
| 197 | +| | pod-d *available* | pod-y | |
| 198 | + |
| 199 | +Ahora, el administrador del clúster desaloja el `nodo-2`. |
| 200 | +El comando drain tratará de desalojar a los 2 Pods con algún orden, digamos |
| 201 | +primero el `pod-b` y después el `pod-d`. Va a tener éxito en quitar el `pod-b`. |
| 202 | +Pero cuando intente desalojar al `pod-d`, va a ser rechazado porque esto va a dejar |
| 203 | +un Pod solamente disponible para el Deployment. |
| 204 | + |
| 205 | +El Deployment crea un reemplazo para el `pod-b` llamado `pod-e`. |
| 206 | +Porque no hay recursos suficientes disponibles en el clúster para programar |
| 207 | +el `pod-e` el desalojo será bloqueado nuevamente. El clúster va a terminar en este |
| 208 | +estado: |
| 209 | + |
| 210 | +| nodo-1 *drained* | nodo-2 | nodo-3 | *no node* | |
| 211 | +|:--------------------:|:-------------------:|:------------------:|:------------------:| |
| 212 | +| | pod-b *terminating* | pod-c *available* | pod-e *pending* | |
| 213 | +| | pod-d *available* | pod-y | | |
| 214 | + |
| 215 | +Ahora, el administrador del clúster necesita |
| 216 | +agregar un nuevo nodo en el clúster para continuar con la actualización. |
| 217 | + |
| 218 | +Usted puede ver como Kubernetes varia la tasa a la que las interrupciones |
| 219 | +pueden suceder, en función de: |
| 220 | + |
| 221 | +- cuantas réplicas una aplicación necesita |
| 222 | +- cuanto toma apagar una instancia de manera correcta |
| 223 | +- cuanto tiempo toma que una nueva instancia inicie |
| 224 | +- el tipo de controlador |
| 225 | +- la capacidad de recursos del clúster |
| 226 | + |
| 227 | +## Separando al dueño del Clúster y los roles de dueños de la Aplicación |
| 228 | + |
| 229 | +Muchas veces es útil pensar en el Administrador del Clúster |
| 230 | +y al dueño de la aplicación como roles separados con conocimiento limitado |
| 231 | +el uno del otro. Esta separación de responsabilidades |
| 232 | +puede tener sentido en estos escenarios: |
| 233 | + |
| 234 | +- Cuando hay muchas equipos con aplicaciones compartiendo un clúster de Kubernetes y |
| 235 | + hay una especialización natural de roles |
| 236 | +- Cuando una herramienta de terceros o servicio es usado para automatizar el control del clúster |
| 237 | + |
| 238 | +El presupuesto de interrupción de Pods soporta esta separación de roles, ofreciendo |
| 239 | +una interfaz entre los roles. |
| 240 | + |
| 241 | +Si no se tiene tal separación de responsabilidades en la organización, |
| 242 | +posiblemente no se necesite el Presupuesto de Interrupción de Pods. |
| 243 | + |
| 244 | +## Como realizar Acciones Disruptivas en el Clúster |
| 245 | + |
| 246 | +Si usted es el Administrador del Clúster y necesita realizar una acción disruptiva en todos |
| 247 | +los nodos en el clúster, como ser una actualización de nodo o de software, estas son algunas de las opciones: |
| 248 | + |
| 249 | +- Aceptar el tiempo sin funcionar mientras dura la actualización. |
| 250 | +- Conmutar a otra replica completa del clúster. |
| 251 | + - No hay tiempo sin funcionar, pero puede ser costoso tener duplicados los nodos |
| 252 | + y tambien un esfuerzo humano para orquestar dicho cambio. |
| 253 | +- Escribir la toleracia a la falla de la aplicación y usar PDBs. |
| 254 | + - No hay tiempo sin funcionar. |
| 255 | + - Duplicación de recursos mínimo. |
| 256 | + - Permite mucha más automatización de la administración del clúster. |
| 257 | + - Escribir aplicaciones que tengan tolerancia a fallas es complicado, pero el trabajo para tolerar interrupciones |
| 258 | + involuntarias, largamente se sobrepone con el trabajo que es dar soporte a autoescalamientos y tolerar |
| 259 | + interrupciones involuntarias. |
| 260 | + |
| 261 | + |
| 262 | + |
| 263 | + |
| 264 | +## {{% heading "whatsnext" %}} |
| 265 | + |
| 266 | + |
| 267 | +* Siga los pasos para proteger su aplicación con [configurar el Presupuesto de Interrupciones de Pods](/docs/tasks/run-application/configure-pdb/). |
| 268 | + |
| 269 | +* Aprenda más sobre [desalojar nodos](/docs/tasks/administer-clúster/safely-drain-node/) |
| 270 | + |
| 271 | +* Aprenda sobre [actualizar un Deployment](/docs/concepts/workloads/controllers/deployment/#updating-a-deployment) |
| 272 | + incluyendo los pasos para mantener su disponibilidad mientras dura la actualización. |
| 273 | + |
0 commit comments