FRAGMENTACIÓN
el virus que puede acabar con tu
alta disponibilidad
Slide 2
Slide 2 text
@hector_rodes @agonzalezro
Slide 3
Slide 3 text
Términos
Slide 4
Slide 4 text
AZ1
AZ2
AZ3
AZ3
AZ2
AZ1
Slide 5
Slide 5 text
¿Fragmentación,
the what?
Slide 6
Slide 6 text
DEFINICIÓN (INFORMAL)
Es un indicador de lo lejos que está la
aplicación de su situación ideal de alta
disponibilidad.
También indica la probabilidad de que ante un
evento no deseado la aplicación deje de prestar
servicio o este se vea comprometido.
Slide 7
Slide 7 text
Al comienzo...
Slide 8
Slide 8 text
Baby app
A
Slide 9
Slide 9 text
Growing app
A A A
Slide 10
Slide 10 text
Growing app, again
A A A
AZ1
A A A
AZ2
A A A
AZ3
Slide 11
Slide 11 text
App? No, Apps!!!
AZ1
AZ2
AZ3
Slide 12
Slide 12 text
AZ1
AZ2
AZ3
AZ3
AZ2
AZ1
Slide 13
Slide 13 text
MÁS COMÚN DE LO QUE CREES
Es fácil de encontrar en grandes empresas con
sistemas que han evolucionado en las últimas
décadas.
Pero generalmente se está avanzando y optando
por herramientas que ayuden a gestionar todo
esto como podría ser Mesos o Kubernetes… porque
lo van a resolver todo. No?
Slide 14
Slide 14 text
Kubernetes y su scheduler al rescate
Slide 15
Slide 15 text
K8S SCHEDULER
Es el responsable de asignar cada instancia de
una aplicación (pod) a nodos para su ejecución.
Actúa solo en el momento de despliegue.
K8S SCHEDULER
Priorizando nodos:
* La función de priorización puntúa cada nodo de
0 a 10, siendo preferible el 10.
* Puede haber varias funciones de priorización
con diferentes pesos y la puntuación es la suma
del peso por la función.
https://github.com/kubernetes/kubernetes/tree/release-1.1/plugin/pkg/scheduler/algorithm/priorities/
Slide 20
Slide 20 text
Scheduling en la
práctica
Slide 21
Slide 21 text
A A A
Slide 22
Slide 22 text
A B A B A B
Slide 23
Slide 23 text
A B
C
A B
C
A
C
B
Slide 24
Slide 24 text
3 Apps
50% Cores used
50% Memory used
3 Apps
50% Cores used
50% Memory used
3 Apps
50% Cores used
50% Memory used
Slide 25
Slide 25 text
A B
C
A B
C
A
C
B
Slide 26
Slide 26 text
A B
C
A B
C
A
C
B
Slide 27
Slide 27 text
5 Apps
83% Cores used
83% Memory used
4 Apps
67% Cores used
67% Memory used
Slide 28
Slide 28 text
A B
C
A B
C
B
A C
Slide 29
Slide 29 text
A B
C
A B
C
B
A C
Av2
Slide 30
Slide 30 text
A B
C
A B
C
B
C
Av2
A
Slide 31
Slide 31 text
A B
C
A B
C
B
C
Av2
Av2
Slide 32
Slide 32 text
A B
C
A B
C
B
C
Av2
Av2
Slide 33
Slide 33 text
A B
C
B
C
B
C
Av2
Av2
Av2
Slide 34
Slide 34 text
A B
C
B
C
B
C
Av2
Av2
Av2
Slide 35
Slide 35 text
B
C
B
C
B
C
Av2
Av2
Av2
Slide 36
Slide 36 text
3 Apps
50% Cores used
50% Memory used
3 Apps
50% Cores used
50% Memory used
3 Apps
50% Cores used
50% Memory used
Slide 37
Slide 37 text
A B
C
A B
C
A
C
B
Slide 38
Slide 38 text
¿Por qué?
Slide 39
Slide 39 text
Fragmentación
Slide 40
Slide 40 text
FRAGMENTACIÓN
Tras una pequeña secuencia de eventos nuestro
cluster está desbalanceado y con serio peligro
de afectar a alguna aplicación ante cualquier
problema en un nodo.
Estamos sufriendo un problema de fragmentación.
Slide 41
Slide 41 text
¿POR QUÉ?
El scheduler solo actúa en tiempo de despliegue.
El scheduler prioriza la estabilidad general del
cluster.
El scheduler resuelve un problema “local”.
Fragmentación es inherente a un sistema dinámico.
Slide 42
Slide 42 text
¿Cómo puedo
medirla?
Slide 43
Slide 43 text
MIDIENDO LA FRAGMENTACIÓN
Estado ideal de una aplicación es aquel en la
que la aplicación presenta un nivel mayor de
disponibilidad (cada instancia en un nodo,
repartidas por igual entre AZs...).
Estado actual de la aplicación está representado
por su distribución en nodos (AZs y regiones) de
las diferentes instancias.
Slide 44
Slide 44 text
MIDIENDO LA FRAGMENTACIÓN
Para un cluster de 9 nodos.
Aplicación A se desea escalar a 3
IdealStatus(A) = [1,1,1,x,x,x,x,x,x]
Simplificando:
IdealStatus(A) = [1,1,1]
Slide 45
Slide 45 text
MIDIENDO LA FRAGMENTACIÓN
Imaginemos un cluster de 9 nodos y cómo afecta
la caída de uno de ellos.
La mejor distribución consiste en 9 instancias,
una en cada nodo:
[1,1,1,1,1,1,1,1,1]
La caída de un nodo implicaría perder el 11% de
capacidad.
Slide 46
Slide 46 text
MIDIENDO LA FRAGMENTACIÓN
Imaginemos un estado actual de una aplicación X
escalada a 9:
IdealStatus(X) = [1,1,1,1,1,1,1,1,1]
CurrentStatus(X) = [2,1,1,1,1,3]
Si cae nodo(1) -> Pérdida de 22% (+11%)
Si cae nodo(6) -> Pérdida de 33% (+22%)
Slide 47
Slide 47 text
MIDIENDO LA FRAGMENTACIÓN
Índice de fragmentación: Representa el impacto
adicional de un evento (ej caída de nodo) sobre
el conjunto de la aplicación.
Índice de fragmentación medio: (a nivel de nodo)
Indica el impacto medio de la pérdida de un nodo
sobre el conjunto de la aplicación.
Slide 48
Slide 48 text
MIDIENDO LA FRAGMENTACIÓN
Para el caso anterior:
IdealStatus(X) = [1,1,1,1,1,1,1,1,1]
CurrentStatus(X) = [2,1,1,1,1,3]
Índice de fragmentación: Max(22%, 11%) = 22%
Índice de fragmentación medio: 100/6 = 16.5%
Slide 49
Slide 49 text
MIDIENDO LA FRAGMENTACIÓN
Para nuestro ejemplo original:
Slide 50
Slide 50 text
B
C
B
C
B
C
A A
A
Slide 51
Slide 51 text
MIDIENDO LA FRAGMENTACIÓN
Para nuestro ejemplo original:
IdealStatus(A) = [1,1,1]
CurrentStatus(A) = [3]
Ifrag(A) = 66%
Ifrag medio(A) = 100%
Slide 52
Slide 52 text
MIDIENDO LA FRAGMENTACIÓN
Para nuestro ejemplo original:
IdealStatus(B) = [1,1,1]
CurrentStatus(B) = [2,1]
Ifrag(B) = 33%
Ifrag medio(B) = 50%
Slide 53
Slide 53 text
Mmm…
Slide 54
Slide 54 text
NOTAS
Fragmentación alta = Peligro
Nos gusta el peligro?
PAGO EL GAS EL MISMO DIA DEL
CORTE
Slide 55
Slide 55 text
Desconecto el USB en modo no seguro
VIVO AL LÍMITE
Slide 56
Slide 56 text
NOTAS
Es mejor centrarse en la desviación del índice
de fragmentación medio con respecto al ideal
IdealStatus(X) = [1,1,1]
CurrentStatus(X) = [1,1,1]
Ifrag medio(X) = 33%
No vamos a poder mejorar ese 33%!!!
Slide 57
Slide 57 text
NOTAS
Algunos valores de referencia
* Intenta estar por debajo del 33% en el índice
de fragmentación medio.
* Introduce el tiempo de recuperación en la
ecuación...
Slide 58
Slide 58 text
Soluciones y
estrategias
Slide 59
Slide 59 text
PREVIO
La fragmentación va a ocurrir, sí o sí.
* Intentar que llegue a un nivel problemático lo
más tarde posible.
* “Solucionarla” una vez que ha ocurrido.
Slide 60
Slide 60 text
MEDICIÓN
Hemos hablado de eventos
* Caída de nodo
* Caída de AZ
* ...
Para apps poco escaladas mejor centrarse en
eventos de nodo.
Para apps hiper escaladas (varias decenas hacia
arriba) mejor centrarse en eventos de AZ.
Slide 61
Slide 61 text
CONFIGURACIÓN CUSTOM
Configurar de manera específica el scheduler:
* Alterando los filtros existentes por
configuración (activar o desactivar)
* Alterando las funciones de priorización,
activando o desactivando y dando pesos
https://github.com/kubernetes/examples/blob/master/staging/scheduler-policy-config.json
Slide 62
Slide 62 text
CONFIGURACIÓN CUSTOM
Estrategia recomendable con clusters donde las
cargas y tipos de apps son conocidos y bastante
predecibles.
Sobre clusters muy heterogéneos es complicado
asegurar que la configuración suponga una mejora
sobre la por defecto.
Slide 63
Slide 63 text
CUSTOM SCHEDULER
K8s permite habilitar varios schedulers.
Un scheduler puede desplegarse como un pod y ser
usado en aquellos deployments que lo requieran.
No es excluyente con usar el scheduler por
defecto.
Slide 64
Slide 64 text
CUSTOM SCHEDULER
Scheduler
Input: Cluster status
Request: Deploy X
New cluster status
Slide 65
Slide 65 text
SCHEDULER EXTENDER
Permite extender el comportamiento por defecto
del scheduler de K8s añadiendo un paso custom al
final del proceso.
Ideal para tomar decisiones en base a
información externa al cluster.
Permite filtrar y priorizar nodos.
Slide 66
Slide 66 text
SCHEDULER EXTENDER
Es la manera más sencilla de implementar y es
realmente potente ya que permite alterar
completamente el comportamiento del scheduling.
Requiere de una configuración custom añadiendo
los extenders que se deseen.
https://github.com/kubernetes/examples/blob/master/staging/scheduler-policy-config-with-extender.json
Slide 67
Slide 67 text
SCHEDULER
Una buena gestión del scheduler ayuda a mantener
la fragmentación a raya aunque no por eso hay
que dejar de medirla y cuando sobrepasa ciertos
umbrales...
Slide 68
Slide 68 text
DESCHEDULER (INCUBATOR)
Cuando la fragmentación sobrepasa el umbral
debemos reubicar aplicaciones intentando
conseguir un mejor resultado.
Reubicar implicar APAGAR y REDESPLEGAR
https://github.com/kubernetes-incubator/descheduler