Este documento presenta sobre cómo ejecutar cargas de trabajo serverless en Kubernetes. Explica que serverless y Kubernetes no tienen por qué ser mutuamente excluyentes y que existen implementaciones como Azure Functions que permiten ejecutar funciones serverless en Kubernetes. También discute sobre cómo usar KEDA para escalar automáticamente funciones de Azure basadas en eventos externos y cómo modelar workloads serverless como jobs para evitar que el HPA mate pods que aún están procesando.
1. Sponsored by
Ejecutando workloads
serverless en AKS
Eduard Tomàs
Tech Lead @ PlainConcepts
Doing stuff and broking things on computers
All sessions avaible on www.cloudlunchlearn.com/marathon
13th & 14th of May
#KubernetesOnFire #kof
2. Quien soy yo?
● Rompo cosas en Plain
Concepts
● Hago cerveza
● Microsoft MVP desde
2012
● @eiximenis
3. Qué vamos a ver hoy?
● Serverless y Kubernetes
● Azure Functions en Kubernetes
● Escalando con KEDA
● Usando jobs
4. Kubernetes
● El prota indiscutible si
hablamos de contenedores
● Complejo de usar
● Distintos sabores, pero todos
parecidos
● Puede con todo
5. Serverless
● Es una tecnología molona.
● Despliegue ágil
● Escala rápidamente y de forma
sencilla
● Gran potencial para muchos
tipos de casos de uso
6.
7. Serverless y Kubernetes
● No tiene por qué ser una “lucha”
● Se pueden ejecutar cargas de trabajo
serverless en Kubernetes
● Existen también implementaciones
serverless de Kubernetes (EKS
Fargate, AKS virtual nodes, …)
8. Por qué ejecutar Serverless en k8s
● Fácil adopción de cloud híbrido /
multicloud
● Menos lock-in
● Una sola plataforma qué gestionar
● Operaciones unificadas
● Más control sobre el H/W
● Ejecutar workloads serverless en el
mismo entorno que otros workloads
(service mesh, entornos compartidos,
etc)
9. El futuro de Kubernetes es Serverless
● Ya tenenos infra serverless de
contenedores (Fargate, ACI, …)
● Esa infra debe ser orquestada
● La API de k8s es el standard de facto
● Veremos mezcla de nodos clásicos e infra
serverless de contenedores orquestada
bajo la misma API
https://thenewstack.io/the-future-
of-kubernetes-is-serverless/
10. Azure Functions
● Tecnología FaaS de Azure
● En general se ejecutan bajo infra
propia: FunctionApps
● Se pueden “dockerizar” y por lo tanto
ejecutar en Kubernetes
12. Horizontal Pod Autoscaler
● Es capaz de escalar cargas de
trabajo en base a determinadas
métricas
○ Usualmente mem y CPU
● Puede ser tu amigo, pero también
tu peor enemigo…
13. Autoescalando Azure Functions
● Para cargas de trabajo “tradicionales” escalar en base a CPU/Mem
suele ser una buena elección
● Pero para cargas de trabajo serverless no lo es tanto ya que
escalas en base a los síntomas y no las causas
● Serverless suele ser event-based, es mejor escalar en base a
métricas vinculadas a esos eventos
○ Mensajes pendientes de procesar, …
14. ● Kubernetes Event Driven Autoscaler
● Es capaz de leer métricas externas…
● … y exponerlas en el cluster, para que…
● … el HPA pueda usarlas para escalar.
15. ● El scaler monitoriza los
triggers externos (p. ej.
mensajes de una cola)
● Esos triggers actualizan
métricas que se exponent a
través del metrics server
● El HPA escala el deployment
de AF basandose en esas
métricas
16. Scalers
● KEDA proporciona escaladores para distintas tecnologías y
clouds
● Continuamente se van añadiendo escaladores nuevos
● https://keda.sh/docs/2.0/scalers/
18. HPA puede ser tu enemigo
● El HPA no tiene en cuenta qué hace un
pod cuando debe desescalar
● Si la métrica indica que la carga de
trabajo debe desescalarse el HPA
desencadenará todo su poder
● Un pod puede ser eliminado mientras
está procesando datos!
19. Defendiendo tus pods del HPA
1. Usar pod lifetime cycles
● Cuando Kubernetes vaya a matar el pod, pedir un “tiempo
de gracia” adicional
● Funciona pero es “feo” y los pods pueden quedar en
terminating durante bastante tiempo
2. No usar deployments, usar jobs
20. Usando jobs para workloads serverless
● En este escenario no usamos el HPA
● En su lugar dejamos que KEDA cree
tantos jobs como sean necesarios
● Para ello el workload serverless debe
modelarse como un trabajo que
empieza y termina: el pod debe hacer
su tarea y terminar.