La práctica de hospedar scripts basados en openfaas

Autor | Zhang Xi

1. Antecedentes del producto Openfaas

Al comienzo del desarrollo de la arquitectura de servicios en la nube, la idea en esta dirección era hacer que los desarrolladores no tuvieran que preocuparse por crear y administrar aplicaciones de back-end. El concepto de servidor sin servidor no se menciona aquí, pero la infraestructura de back-end está alojada por un tercero y los componentes de infraestructura necesarios se proporcionan en forma de servicios, como bases de datos, colas de mensajes y servicios de autenticación.

Pero cuando Amazon lanzó AWS Lambda en 2014, trajo una nueva idea de arquitectura de sistema a las aplicaciones que se ejecutan en la nube, es decir, no es necesario implementar procesos en espera de solicitudes HTTP o llamadas API en el servidor. Lambda proporciona un marco y un mecanismo desencadenado por eventos. Cuando se recibe una solicitud de usuario, se desencadena un evento para ejecutar la función de registro de usuario en un servidor de AWS (generalmente solo una función, y la industria generalmente se refiere a este tipo de servicio como FaaS) .

Actualmente, además de AWS, los proveedores de servicios en la nube que brindan servicios FaaS incluyen Google Cloud (alfa), Microsoft Azuze e IBM OpenWhisk. Proveedores de servicios de nube nacionales como Alibaba Cloud FC, Baidu Cloud CFC y Tencent Cloud SCF. Las arquitecturas de código abierto más populares incluyen OpenFaaS, Knative, OpenWhisk, etc.

2. Antecedentes comerciales del proyecto

Aladdin es un producto de la plataforma de búsqueda de Baidu. Generalmente se encuentra en la parte superior de la página de resultados de búsqueda de Baidu. La tarea fuera de línea proporciona datos estructurados de alta calidad, y el servidor en línea optimiza la estrategia de búsqueda para presentar resultados de búsqueda de alta calidad a los usuarios y satisfacer al máximo la experiencia y las necesidades de búsqueda de los usuarios. El servidor en línea se implementa en la máquina de la línea comercial de búsqueda de Baidu, y la línea comercial de búsqueda de Baidu administra y asigna recursos de manera uniforme y garantiza la estabilidad comercial. Las tareas fuera de línea deben ser administradas por el lado comercial.

Hay dos opciones para la salida de fuentes de datos fuera de línea: después de leer regularmente la base de datos para ver la diferencia de versión, los datos estructurados empalmados se envían al nodo de cola de mensajes de la línea comercial de búsqueda, o pm envía los datos materiales para activar la base de datos. tarea de construcción para generar una cantidad completa de datos estáticos y esperar La araña de búsqueda captura y construye una base de datos regularmente.Al mismo tiempo, la solución fuera de línea también proporciona un portal en línea para datos de intervención en tiempo real, gestión de materiales y otras funciones. El plan original es implementar todos los scripts en la máquina física del lado comercial, y las tareas programadas están alojadas en la plataforma interna noah de Baidu, que admite la configuración de intervalos de tiempo de ejecución y comandos de ejecución, y luego activa los comandos para que se ejecuten con regularidad. intervalos Para las tareas de activación manual, se implementa un servidor http en la misma máquina física, que recibe solicitudes http y luego ejecuta comandos cmd en el directorio de secuencias de comandos. Este método provoca una pérdida de recursos de la máquina. Hay otro problema con el plan en línea original. Es engorroso copiar el paquete de lanzamiento a una máquina física para su implementación, y no hay un registro en línea. Cuando ocurre un problema, no es propicio para retroceder y detener las pérdidas tan pronto como sea posible. posible.

3. Ideas y objetivos

Desde un punto de vista comercial, hay dos puntos funcionales, que son ejecutar scripts a intervalos regulares y admitir flujos de archivos entrantes y activar scripts para ejecutar. Para ahorrar el costo del presupuesto de la máquina, use la máquina virtual Baidu Smart Cloud bcc, para garantizar la estabilidad de la secuencia de comandos en ejecución y evitar la situación en la que la secuencia de comandos no puede ejecutarse debido a una falla de la máquina, la secuencia de comandos de implementación en contenedores, basada en la idea de faas, poner la tarea de secuencia de comandos en la función Está encapsulada como una función en la nube, que admite tareas de sincronización y solicitudes http para activar la ejecución de secuencias de comandos.

Teniendo en cuenta que el clúster cce Kubernetes se puede implementar en la máquina virtual bcc de Baidu Smart Cloud, se investiga el proyecto de código abierto Faas basado en Kubernetes para un desarrollo secundario. En la actualidad, las principales arquitecturas de código abierto de Faas incluyen OpenFaaS, Knative, OpenWhisk, etc. La comparación de estos tres marcos es la siguiente:

imagen

Después de la comparación, se encuentra que Knative es más adecuado para crear, implementar y administrar plataformas de carga de trabajo sin servidor. Necesita administrar de forma independiente la infraestructura de contenedores. Desde la perspectiva de la configuración y el mantenimiento, es más complicado y no para los usuarios finales, por lo que no será considerado por el momento. En comparación con OpenFaaS y OpenWhisk, OpenWhisk utiliza más componentes subyacentes que OpenFaas, lo que agrega un cierto grado de complejidad desde la perspectiva de la operación, el mantenimiento y la implementación de OpenWhisk, y OpenWhisk se implementa en función de la escala. Si se requiere un desarrollo secundario, se requiere un nuevo lenguaje. necesita ser adquirido. Openfaas utiliza principalmente Promethus y AlertManager para la expansión y contracción dinámicas, y la pila de tecnología es coherente con nuestro lenguaje de desarrollo diario, por lo que la solución final elige OpenFaas.

Además, openfaas también admite el método de invocación de conectores de eventos. El método de invocación se muestra en la siguiente figura, que es similar a la función de AWS Lambda, que es conveniente para la integración con otros ecosistemas. Actualmente, el conector Cron, el conector MQTT, el conector NATS y otros conectores son oficialmente compatibles, y nuestras tareas programadas dependen de la implementación del conector Cron. En términos de uso, primero implemente el conector correspondiente en el clúster y luego agregue el contenido especificado por el conector al atributo de anotaciones en el yaml utilizado para empaquetar la función de nube para activar la función de nube correspondiente de acuerdo con el tiempo.

imagen

4. Estructura general

4.1 Diseño de arquitectura

imagen

En la arquitectura general, las tareas son desencadenadas por eventos (solicitudes http, temporizadores, operaciones de clientes faas) y la plataforma openfaas enrutará a instancias de tareas específicas de acuerdo con las características del tráfico para desencadenar la ejecución de tareas. -watchdog solicitará Los parámetros se encapsulan como stdin para ejecutar el comando cmd para activar la ejecución de la tarea y esperar a que se ejecute la tarea para obtener los datos de stdout y devolver el resultado.

La arquitectura general se compone principalmente de las siguientes partes principales:

Puerta de enlace : la capacidad principal es conectarse a fuentes de activación externas y enrutar el tráfico a instancias de tareas específicas para su ejecución; la puerta de enlace también es responsable de contar la información de tráfico de cada tarea, brinda soporte de datos para el módulo de escalado elástico y también puede limitar la número de tareas en función de la concurrencia de tareas configurada Procesamiento de secuencias; la puerta de enlace también sincronizará el estado de ejecución de la tarea, el historial de ejecución y otra información, y notificará al líder de la tarea después de que falle la ejecución de la tarea.

Escalado elástico : la capacidad central es responsable del escalado elástico de las instancias de tareas, calculando la cantidad de instancias de destino de la función en función de la tarea que ejecuta los datos de tráfico y la configuración del umbral de recursos, coordinando los recursos y luego ajustando la cantidad de instancias de funciones con la ayuda de Kubernetes. ' Capacidades de control de recursos.

Recopilación de datos : recopile los datos de tráfico expuestos por la puerta de enlace y el uso de recursos de las instancias de tareas como base para juzgar el escalado elástico.

Recopilación de registros : recopile los registros en la instancia de la tarea y colóquelos en el disco, lo cual es conveniente para que el lado comercial resuelva los problemas que ocurren durante la operación de la tarea.

Controlador : la capacidad central es responsable de la implementación de la lógica de control de Kubernetes CRD (Definición de recursos personalizados).

Instancia de tarea : cuando se enruta el tráfico de la puerta de enlace, la lógica del código de secuencia de comandos correspondiente se ejecutará en la instancia de la tarea.

Plataforma en línea : una plataforma orientada al usuario, responsable de la construcción de funciones, el control de versiones, el lanzamiento y la gestión de alguna metainformación de funciones, y admite la visualización de registros de tiempo de ejecución de funciones y el historial de ejecución.

4.2 Diseño de procesos

El ciclo de vida general del script se muestra en la figura y tiene las siguientes cuatro etapas: versión de lanzamiento, compilación, implementación y escala.

Versión de lanzamiento : publique la versión que se lanzará y especifique el directorio del código de secuencia de comandos que se empaquetará.

Compilación : empaquete el código y las tareas de temporización configuradas y otra información relacionada para generar una imagen para la implementación posterior.

Implementación : implemente la imagen en el clúster de Kubernetes.

Escalado : De acuerdo con la información de tráfico y carga de la instancia de tarea en el clúster, se realiza la expansión y contracción elástica de la instancia.

5. Mejora de la utilización de los recursos de la máquina

Mejore la utilización de los recursos de la máquina mediante la asignación dinámica de recursos a instancias de tareas. Cuando las tareas fuera de línea no funcionan, puede reducir la cantidad de instancias correspondientes a 0 y asignarlas a otras instancias que las necesiten, y expandir las operaciones de instancias para instancias de tareas cuyo tráfico exceda la configuración de simultaneidad o el uso de recursos exceda el límite de umbral, utilizando tanto como sea posible. En la medida de lo posible, menos máquinas alojan más servicios fuera de línea de secuencias de comandos.

Antes de que la tarea fuera de línea se conecte, la tarea se registrará y se podrá seleccionar la categoría de la tarea. La tarea se puede dividir en tres tipos: disparador síncrono (debe esperar el resultado devuelto), disparador de tiempo y llamada asíncrona (directamente regresar sin esperar el resultado del script).

5.1 Tareas activadas sincrónicamente

Las tareas de disparo síncrono se utilizan principalmente para intervenir datos en línea en tiempo real u operar datos de materiales en el almacén. Su característica necesita esperar el resultado devuelto para garantizar el éxito de la operación, y puede haber múltiples operaciones consecutivas. Entre los tres tipos de tareas anteriores, este tipo de tarea tiene la prioridad más alta y no se reducirá a 0 instancias.

imagen

El proceso de escalado elástico de tareas síncronas se muestra en la figura anterior. Durante el proceso de supervisión de tareas, el estado de la tarea de tráfico se obtiene extrayendo los datos de la puerta de enlace, y el recurso del módulo se obtiene de la fuente de datos Cadvisor configurada por Promethus. Si se encuentra la puerta de enlace para recibir una gran cantidad de códigos de estado 429 (el tráfico excede la configuración concurrente), o si el uso de recursos excede el umbral de alarma (el umbral se establece en el 80 % del recurso máximo configurado en la plataforma en línea), la capacidad de estas tareas se ampliarán las instancias. Si se encuentra que los recursos de la máquina son insuficientes durante el proceso de expansión, encontrará tareas sin ejecutar para reducir el número de instancias de acuerdo con la secuencia de tareas programadas y tareas llamadas asincrónicamente. Reduzca las instancias de tareas a 0 para ahorrar recursos. Por el contrario, si la tasa de utilización de recursos de las tareas de tipo disparador síncrono es muy baja, los recursos deben reducirse adecuadamente de acuerdo con la configuración de simultaneidad.

5.2 Tareas cronometradas

Las tareas programadas se utilizan principalmente en el escenario de creación de una base de datos completa. Comienzan a ejecutarse en un momento específico y son tipos de tareas predecibles. En casos extremos, las instancias de tareas solo necesitan existir en el momento especificado.

Las tareas de sincronización se activan en función del conector cron, pero las tareas en segundo plano son responsables de garantizar que la instancia de tarea correspondiente exista en el momento especificado. Ejecutar regularmente para verificar si la instancia de tarea correspondiente existe en un cierto período de tiempo en el futuro. Si es así no existe, ejecute la operación de implementación y regístrese al mismo tiempo. Vuelva a llamar para verificar el estado de implementación de la instancia de la tarea. Debido a recursos insuficientes de la máquina y otras razones, el número de instancias no ha alcanzado el número esperado y se activa una alarma. activado para notificar al personal de operación y mantenimiento del sistema.

imagen

5.3 Tarea de llamada asíncrona

Las tareas asincrónicas se utilizan principalmente cuando el tiempo de ejecución es largo y no es necesario obtener el resultado de retorno a tiempo. Este tipo de tarea no es sensible al tiempo efectivo. Se puede retrasar un minuto para implementar la instancia y luego activarla. Sin embargo, debido a que la tarea asincrónica se activa manualmente, el tiempo de activación es impredecible, por lo que cuando se necesita reducir el escalado automático, se seguirá dando prioridad a las tareas programadas.

Llame asíncronamente a la tarea, si la instancia se reduce a 0, active la ejecución de la tarea, el módulo activador en la puerta de enlace primero almacenará la información de la solicitud y luego expondrá la información de métrica para activar el tráfico mayor que la concurrencia total (número de instancias * simultaneidad de configuración) Llame a la policía e implemente la redistribución. La puerta de enlace realiza un entrenamiento por turnos y espera a que la instancia se implemente con éxito, y luego solicita la reproducción para volver a intentarlo. Si el número de instancias sigue siendo 0 dentro del tiempo especificado, se enviará una alarma al personal de operación y mantenimiento del sistema.

imagen

6. Garantía de Estabilidad

6.1 Garantía de estabilidad de la puerta de enlace

Todo el tráfico de funciones debe pasar a través del servicio de puerta de enlace, por lo que la disponibilidad de la puerta de enlace de eventos es especialmente importante. En primer lugar, la puerta de enlace se procesa como activa y en espera, y el nodo en espera se activa inmediatamente cuando falla el nodo principal. Para reducir la presión sobre la puerta de enlace, a través de dos medios de limitación de corriente y sincronización, el consumo de recursos aguas abajo de la solicitud de la puerta de enlace se reduce tanto como sea posible. La puerta de enlace también puede proteger muy bien las instancias comerciales posteriores. Admite la configuración de la instancia de tareas descendentes en la plataforma en línea y devuelve directamente los datos degradados. También admite la intervención y restricción del acceso de tráfico anormal para garantizar el funcionamiento normal de las instancias de tareas posteriores.

6.2 Monitoreo de recursos y alarma

Todas las instancias de tareas se supervisan según Promethus, y el personal de operación y mantenimiento del sistema recibe una notificación mediante el envío de mensajes a través de alertmanager cuando las instancias se reinician o los recursos superan los umbrales. Cuando la tarea no se ejecuta, también se enviará un mensaje al propietario de la tarea. Al mismo tiempo, los datos de Promethus se envían a grafana, que admite la visualización visual de los recursos de la instancia y también admite información básica, como el historial de ejecución de tareas y el tiempo de ejecución en la plataforma en línea.

6.3 Recopilación y almacenamiento de registros

Dado que las instancias de tareas se ven afectadas por el escalado automático, es posible que se vuelvan a implementar, lo que provocará que no se recupere el registro de la instancia anterior. Implemente filebeat en la instancia de tarea para exportar los archivos de registro para lograr la persistencia de los archivos de registro y soporte la plataforma en línea Ver registros de historial. En la plataforma en línea, también puede iniciar sesión en la instancia de tareas para ver registros en tiempo real para solucionar problemas. A través de la plataforma en línea, se puede implementar la administración de autoridad de usuario y los usuarios solo pueden iniciar sesión en instancias de tareas autorizadas para lograr el aislamiento de gestión de instancias de tareas.

Garantía de estabilidad del servicio de 6.4 bns

El servicio de nombres bns Baidu puede entenderse como el servicio dns interno de Baidu. El principio de implementación es solicitar al agente bns en la máquina Baidu que obtenga la dirección de servicio registrada al resolver la dirección bns. Teniendo en cuenta el ahorro de recursos, bns-agent no se implementa en nuestra instancia de tarea, por lo que generalmente se solicita el servicio bns-agent remoto, pero luego se descubre que el tiempo de espera de la conexión ocurre ocasionalmente, lo que afecta la estabilidad de la tarea. Por lo tanto, se consideraron tres opciones:

Solución 1 , monte el servicio bns en la instancia de la tarea y luego abra el servicio bns en el comando de inicio de la instancia;

Solución 2 , consulte el principio de dns, formule reglas de dominio bns, cuando coredns encuentre el nombre de dominio del dominio bns, reenvíelo al servicio de agente de la máquina host, el servicio de agente necesita encapsular una capa de bns-agent, que puede resolver solicitudes dns y convertirlas en solicitudes bns, obtener la ip de la máquina de bns-agent y encapsularla nuevamente en formato de protocolo dns;

La solución 3 , basada en la arquitectura interna del servicio go de Baidu, admite la inyección de la variable de entorno bns-host y la especificación de la dirección del servicio bns local. Este método se puede usar para apuntar la dirección del servicio local al servicio bns-agent de la máquina host y transferirla al servicio de agente de la máquina host para su resolución cuando se encuentre una solicitud bns.

Finalmente, se eligió la opción 3. En comparación con las otras dos opciones, la opción 1 era menos estable y la opción 2 tenía una carga de trabajo más complicada. Al modificar el código fuente de faas-neters y escribir variables de entorno env en Kubernetes, se resuelve el problema del análisis inestable de bns.

7. Resumen del proyecto

A través de la plataforma en línea para administrar tareas de script, el proceso en línea es más estandarizado. Al mismo tiempo, cada máquina en línea se registra, lo que puede ubicar rápidamente si es un problema introducido por el en línea, lo cual es conveniente para una reversión rápida. Cada tarea de secuencia de comandos está aislada para evitar la situación de que una gran cantidad de secuencias de comandos no se pueden usar debido a la modificación del método público, y los registros en una instancia son producidos por esta tarea, por lo que la visualización de los registros es más específica.

Al final, los recursos de la máquina utilizados para construir la plataforma en línea y ejecutar los scripts fueron el 14 % de los recursos de la CPU de la máquina física original y el 8 % de los recursos de la memoria, lo que ahorró mucho recursos de la máquina. Si desea ahorrar aún más recursos, puede implementar tareas programadas que no necesitan iniciarse al mismo tiempo y ejecutarse con poca frecuencia en la misma instancia Al compartir los recursos de la máquina, ahorra la pérdida de rendimiento causada por el escalado elástico frecuente.

---------- FIN ----------

Serie de lecturas recomendadas [Gasolinera técnica]:

Guía del ingeniero de Baidu para evitar errores en el desarrollo móvil - Lenguaje Swift

Guía del ingeniero de Baidu para evitar errores en el desarrollo móvil: fugas de memoria

Los ingenieros de Baidu te enseñan a jugar en el modo de diseño (modo decorador)

Desmitificación de la práctica de la prueba inteligente de Baidu en el campo del posicionamiento de prueba

Los ingenieros de Baidu te enseñan a jugar en el modo de diseño (modo de adaptador)

Desmitificación de la práctica de la prueba inteligente de Baidu en el campo de la evaluación de pruebas

{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/4939618/blog/9101705
Recomendado
Clasificación