Skip to content

Commit ad6c539

Browse files
authored
Merge pull request #31141 from gamba47/pod-disruptions
[es] Add concepts/workloads/pods/disruptions
2 parents af198fe + 49b27f9 commit ad6c539

File tree

1 file changed

+273
-0
lines changed

1 file changed

+273
-0
lines changed
Lines changed: 273 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,273 @@
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

Comments
 (0)