Slide 1

Slide 1 text

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.

Slide 16

Slide 16 text

Schedulable nodes 1 2 3 Remaining nodes 1 2 Predicados/Filtros. Ej: nodo 3 sin recursos. Función de prioridad. Ej: Node 1 = 2, Node 2 = 5 2

Slide 17

Slide 17 text

K8S SCHEDULER Filtros ejemplos: * CheckNodeUneschedulablePred * HostNamePred * PodFitsHostPortsPred * MatchNodeSelectorPred * PodFitsResourcePred... https://github.com/kubernetes/kubernetes/blob/master/pkg/scheduler/algorithm/predicates/predicates.go

Slide 18

Slide 18 text

Schedulable nodes 1 2 3 Remaining nodes 1 2 Predicados/Filtros. Ej: nodo 3 sin recursos. Función de prioridad. Ej: Node 1 = 2, Node 2 = 5 2

Slide 19

Slide 19 text

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

Slide 69

Slide 69 text

Q & A

Slide 70

Slide 70 text

Muchas Gracias!!!