Azure Functions en Kubernetes con KEDA

El tiempo de ejecución de Azure Functions proporciona flexibilidad de hospedaje dónde y cómo desee. KEDA (escalado automático controlado por eventos basado en Kubernetes) se empareja sin problemas con el tiempo de ejecución y las herramientas de Azure Functions para proporcionar la escala controlada por eventos en Kubernetes.

Importante

La ejecución de sus aplicaciones de funciones en contenedores en Kubernetes, ya sea utilizando KEDA o mediante implementación directa, es un esfuerzo de código abierto que puede usar sin coste alguno. Los colaboradores y la comunidad proporcionan el mejor soporte posible usando incidencias de GitHub en el repositorio de Azure Functions. Use estas incidencias para notificar errores y generar solicitudes de características. La implementación de aplicaciones contenedoras de funciones en Azure Container Apps, que se ejecuta en clústeres de Kubernetes administrados en Azure, se encuentra actualmente en versión preliminar. Para más información, vea Hospedaje de Azure Functions en Azure Container Apps.

Funcionamiento de las funciones basadas en Kubernetes

El servicio de Azure Functions está formado por dos componentes clave: un tiempo de ejecución y un controlador de escala. El tiempo de ejecución de Functions se ejecuta y ejecuta el código. El tiempo de ejecución incluye lógica sobre cómo desencadenar, registrar y administrar las ejecuciones de funciones. Azure Functions Runtime puede ejecutarse en cualquier parte. El otro componente es un controlador de escala. El controlador de escala supervisa la tasa de eventos que se dirigen a la función y escala de forma proactiva el número de instancias que ejecutan la aplicación. Para más información, consulte Escalado y hospedaje de Azure Functions.

Las funciones basadas en Kubernetes proporcionan el tiempo de ejecución de Functions en un Contenedor de Docker con escalado controlado por eventos a través de KEDA. KEDA puede reducir horizontalmente a 0 instancias (cuando no se produce ningún evento) y escalar horizontalmente hasta n instancias. Lo hace mediante la exposición de las métricas personalizadas de Kubernetes Autoscaler (Horizontal Pod Autoscaler). El uso de contenedores de Functions con KEDA hace posible replicar las capacidades de la función sin servidor en cualquier clúster de Kubernetes. Estas funciones también se pueden implementar mediante la característica de nodos virtuales de Azure Kubernetes Service (AKS) para la infraestructura sin servidor.

Administración de KEDA y Functions en Kubernetes

Para ejecutar Functions en el clúster de Kubernetes, debe instalar el componente KEDA. Puede instalar este complemento de una de estas formas:

  • Azure Functions Core Tools: mediante el comando func kubernetes install.

  • Helm: hay varias maneras de instalar KEDA en un clúster de Kubernetes, incluido Helm. Las opciones de implementación se documentan en el sitio de KEDA.

Implementación de una aplicación de función en Kubernetes

Puede implementar cualquier aplicación de función en un clúster de Kubernetes mediante la ejecución de KEDA. Puesto que las funciones se ejecutan en un contenedor de Docker, el proyecto debe ser un Dockerfile. Puede crear un Dockerfile mediante la opción--docker al llamar a func init para crear el proyecto. Si olvidó hacerlo, siempre puede volver a llamar a func init desde la raíz del proyecto de Functions, esta vez con la opción --docker-only, como se muestra en el ejemplo siguiente.

func init --docker-only

Para más información sobre la generación del Dockerfile, consulte la referencia de func init.

Para crear una imagen e implementar las funciones en Kubernetes, ejecute el siguiente comando:

func kubernetes deploy --name <name-of-function-deployment> --registry <container-registry-username>

En este ejemplo, reemplace <name-of-function-deployment> por el nombre de la aplicación de funciones.

El comando de implementación hace lo siguiente:

  1. El Dockerfile creado anteriormente se usa para compilar una imagen local para la aplicación de funciones.
  2. La imagen local se etiqueta y se inserta en el registro de contenedor en el que el usuario ha iniciado sesión.
  3. Se crea un manifiesto y se aplica al clúster que define un recurso Deployment de Kubernetes, un recurso ScaledObject y Secrets, que incluye las variables de entorno importadas desde su archivo local.settings.json.

Para obtener más información, consulte el comando func kubernetes deploy.

Implementación de una aplicación de funciones desde un registro privado

El flujo anterior también funciona con registros privados. Si extrae la imagen de contenedor de un registro privado, incluya la marca --pull-secret que hace referencia al secreto de Kubernetes que contiene las credenciales del registro privado al ejecutar func kubernetes deploy.

Eliminación de una aplicación de función de Kubernetes

Después de la implementación puede quitar una función mediante la eliminación de los Deployment, ScaledObject asociados y Secrets creados.

kubectl delete deploy <name-of-function-deployment>
kubectl delete ScaledObject <name-of-function-deployment>
kubectl delete secret <name-of-function-deployment>

Desinstalación de KEDA de Kubernetes

Puede quitar KEDA del clúster de una de las maneras siguientes:

Desencadenadores admitidos en KEDA

KEDA es compatible con los siguientes desencadenadores de Azure Functions:

Compatibilidad con el desencadenador HTTP

Puede usar instancias de Azure Functions que expongan desencadenadores HTTP, pero KEDA no los administra directamente. Puede aprovechar el desencadenador prometheus de KEDA para escalar Azure Functions de HTTP de 1 a n instancias.

Pasos siguientes

Para obtener más información, consulte los siguientes recursos: