Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Fragmentación, el virus que puede acabar con tu alta disponibilidad (con ejemplos para kubernetes)

Fragmentación, el virus que puede acabar con tu alta disponibilidad (con ejemplos para kubernetes)

En BBVA construimos sistemas altamente distribuidos en alta disponibilidad donde diferentes arquitecturas orientadas a servicios y microservicios realizan varias despliegues al día, escalando según sea necesario.

Sin embargo, cada vez que se realiza un despliegue, escalado o borrado de una aplicación, nuestro cluster tiende a fragmentar recursos o desbalancearse, haciendo un pobre uso de CPU o memoria ante situaciones de stress. En situaciones extremas esto puede llegar a poner en peligro la alta disponibilidad de nuestros sistemas.

En esta charla trataremos la fragmentación en clusters de kubernetes para entenderla, medirla y mantenerla dentro de niveles óptimos. Veremos cómo hacemos en el equipo de PaaS de BBVA para desplegar sistemas altamente distribuidos y donde conviven aplicaciones altamente heterogéneas y con diferentes necesidades de recursos y quotas.

Alexandre González

November 23, 2018
Tweet

More Decks by Alexandre González

Other Decks in Technology

Transcript

  1. 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.
  2. 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?
  3. 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.
  4. 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
  5. K8S SCHEDULER Filtros ejemplos: * CheckNodeUneschedulablePred * HostNamePred * PodFitsHostPortsPred

    * MatchNodeSelectorPred * PodFitsResourcePred... https://github.com/kubernetes/kubernetes/blob/master/pkg/scheduler/algorithm/predicates/predicates.go
  6. 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
  7. 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/
  8. 3 Apps 50% Cores used 50% Memory used 3 Apps

    50% Cores used 50% Memory used 3 Apps 50% Cores used 50% Memory used
  9. 5 Apps 83% Cores used 83% Memory used 4 Apps

    67% Cores used 67% Memory used
  10. 3 Apps 50% Cores used 50% Memory used 3 Apps

    50% Cores used 50% Memory used 3 Apps 50% Cores used 50% Memory used
  11. 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.
  12. ¿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.
  13. 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.
  14. 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]
  15. 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.
  16. 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%)
  17. 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.
  18. 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%
  19. MIDIENDO LA FRAGMENTACIÓN Para nuestro ejemplo original: IdealStatus(A) = [1,1,1]

    CurrentStatus(A) = [3] Ifrag(A) = 66% Ifrag medio(A) = 100%
  20. MIDIENDO LA FRAGMENTACIÓN Para nuestro ejemplo original: IdealStatus(B) = [1,1,1]

    CurrentStatus(B) = [2,1] Ifrag(B) = 33% Ifrag medio(B) = 50%
  21. 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%!!!
  22. 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...
  23. 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.
  24. 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.
  25. 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
  26. 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.
  27. 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.
  28. 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.
  29. 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
  30. 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...
  31. 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