Tutorial

Cómo ejecutar funciones sin servidores usando OpenFAaS en Kubernetes de DigitalOcean

Published on April 27, 2020
Español
Cómo ejecutar funciones sin servidores usando OpenFAaS en Kubernetes de DigitalOcean

El autor seleccionó la Free and Open Source Fund para recibir una donación como parte del programa Write for DOnations.

Introducción

Normalmente, para alojar una aplicación de software en Internet se requiere gestión, planificación y seguimiento de infraestructuras para un sistema monolítico. A diferencia de este enfoque tradicional, la arquitectura sin servidores (también conocida como función como servicio o “FaaS”) descompone su aplicación en funciones. Estas funciones son entidades sin estados previos, autocontenidas, incluso activadas y funcionalmente completas que se comunican a través de las API que gestiona en lugar del aprovisionamiento de hardware subyacente o infraestructuras explícitas. Las funciones son escalables por diseño, portátiles, de configuración más rápida y más fáciles de probar que las aplicaciones comunes. Para funcionar, la arquitectura sin servidor en principio requiere un método para encapsular y organizar funciones independiente de la plataforma.

OpenFaaS es un marco de código abierto que permite implementar la arquitectura sin servidor en Kubernetes usando contenedores de Docker para almacenar y ejecutar funciones. Permite que cualquier programa se encapsule como un contenedor y se administre como una función a través de la línea de comandos o la IU web integrada. OpenFaaS tiene una excelente compatibilidad para métricas y ofrece autoescalado para funciones cuando se incrementa la demanda.

A través de este tutorial, implementará OpenFaaS a su clúster de Kubernetes de DigitalOcean en su dominio y lo protegerá usando certificados TLS gratuitos de Let’s Encrypt. También explorará su IU web e implementará funciones existentes y nuevas usando faas-cli, la herramienta de línea de comandos oficial. Al final, tendrá un sistema flexible para implementar funciones sin servidor.

Requisitos previos

  • Un clúster de Kubernetes de DigitalOcean con su conexión configurada como kubectl predeterminado. El clúster debe tener al menos 8 GB de RAM y 4 núcleos de CPU disponibles para OpenFAaS (necesitará más si el uso es mayor). Verá las instrucciones para configurar kubectl en el paso Establecer conexión con su clúster cuando cree su clúster. Para crear un clúster de Kubernetes en DigitalOcean, consulte la Guía de inicio rápido de Kubernetes.
  • Docker instalado en su máquina local. Siguiendo los pasos 1 y 2 para su distribución, consulte Cómo instalar Docker.
  • Una cuenta en Docker Hub para almacenar imágenes de Docker que creará durante este tutorial.
  • faas-cli, la herramienta oficial de CLI para gestionar OpenFaaS, debe estar instalada en su máquina local. Si desea acceder a instrucciones para varias plataformas, consulte los documentos oficiales.
  • Un administrador de paquetes de Helm instalado en su máquina local. Para ello, complete el paso 1 y añada el repositorio stable del paso 2 del tutorial Cómo instalar software en clústeres de Kubernetes con el gestor de paquetes de Helm 3.
  • El controlador de Ingress de Nginx y Cert-Manager instalados en su clúster usando Helm para exponer OpenFaaS usando los recursos de Ingress. Para hacerlo, consulte Cómo configurar un Ingress de Nginx en Kubernetes de DigitalOcean usando Helm.
  • Un nombre de dominio registrado por completo para alojar OpenFaaS apuntando al equilibrador de carga utilizado por el Ingress de Nginx. Para este tutorial, se utilizará openfaas.your_domain en todo momento. Puede adquirir un nombre de dominio en Namecheap, obtener uno gratuito en Freenom o utilizar un registrador de dominios que elija.

Nota: El nombre de dominio que use en este tutorial debe ser distinto del que use en el tutorial “Cómo configurar un Ingress de Nginx en Kubernetes de DigitalOcean”, de los requisitos previos.

Paso 1: Instalar OpenFAaS usando Helm

En este paso, instalará OpenFaaS en su clúster de Kubernetes usando Helm y lo expondrá en su dominio.

Como parte del requisito previo del controlador de Ingress de Nginx, creó servicios de ejemplo y un Ingress. No los necesitará en este tutorial, por lo que puede eliminarlos ejecutando los siguientes comandos:

  1. kubectl delete -f hello-kubernetes-first.yaml
  2. kubectl delete -f hello-kubernetes-second.yaml
  3. kubectl delete -f hello-kubernetes-ingress.yaml

Debido a que implementará funciones como objetos de Kubernetes, le resultará útil almacenarlas y hacer lo mismo con el propio OpenFaaS en espacios de nombres separados en su clúster. El espacio de nombre de OpenFaaS se llamará openfaas y el de las funciones se llamará openfaas-fn. Créelos en su clúster ejecutando el siguiente comando:

  1. kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml

Verá el siguiente resultado:

Output
namespace/openfaas created namespace/openfaas-fn created

A continuación, deberá añadir el repositorio de Helm de OpenFaaS, en el que se aloja el chart de OpenFaaS. Para hacer esto, ejecute el siguiente comando:

  1. helm repo add openfaas https://openfaas.github.io/faas-netes/

Helm mostrará el siguiente resultado:

Output
"openfaas" has been added to your repositories

Actualice la caché del chart de Helm:

  1. helm repo update

Verá el siguiente resultado:

Output
Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "openfaas" chart repository ...Successfully got an update from the "jetstack" chart repository ...Successfully got an update from the "stable" chart repository Update Complete. ⎈ Happy Helming!⎈

Antes de instalar OpenFaaS, deberá personalizar algunos parámetros del chart. Los almacenará en su máquina local, en un archivo llamado values.yaml. Cree y abra el archivo con su editor de texto:

  1. nano values.yaml

Añada las siguientes líneas:

values.yaml
functionNamespace: openfaas-fn
generateBasicAuth: true

ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: "nginx"
  hosts:
    - host: openfaas.your_domain
      serviceName: gateway
      servicePort: 8080
      path: /

Primero, especifique el espacio de nombre donde se almacenarán las funciones asignando openfaas-fn a la variable functionNamespace. Al fijar generateBasicAuth en el valor true, ordenará a Helm que configure la autenticación obligatoria cuando acceda a la IU web de OpenFaaS y que genere una combinación de nombre de usuario y contraseña de administrador para usted.

A continuación, habilite la creación de Ingress y configúrelo para que use el controlador de Ingress de Nginx y proporcione el servicio de OpenFaaS gateway en su dominio.

Recuerde sustituir openfaas.your_domain por el dominio que desee de los requisitos previos. Cuando termine, guarde y cierre el archivo.

Por último, instale OpenFaaS en el espacio de nombres openfass con los valores personalizados:

  1. helm upgrade openfaas --install openfaas/openfaas --namespace openfaas -f values.yaml

Verá lo siguiente:

Output
Release "openfaas" does not exist. Installing it now. NAME: openfaas LAST DEPLOYED: ... NAMESPACE: openfaas STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: To verify that openfaas has started, run: kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas" To retrieve the admin password, run: echo $(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode)

Según se muestra en el resultado, la instalación se realizó correctamente. Ejecute el siguiente comando para ver la contraseña de la cuenta admin:

  1. echo $(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode) | tee openfaas-password.txt

La contraseña decodificada se escribe en el resultado y en un archivo llamado openfaas-password.txt al mismo tiempo usando tee. En el resultado, verá que esa es su contraseña de OpenFaaS para la cuenta admin.

Puede ver los contenedores de OpenFaaS disponibles ejecutando el siguiente comando:

  1. kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"

Cuando todas las implementaciones se muestren como ready, escriba CTRL + C para salir.

Ahora podrá dirigirse al dominio especificado en su navegador web. Introduzca admin como nombre de usuario y la contraseña correspondiente cuando se le solicite. Verá la IU web de OpenFaaS:

OpenFaaS: panel de control vacío

Instaló OpenFaaS correctamente y expuso su panel de control en su dominio. A continuación, lo protegerá usando certificados TLS gratuitos de Let´s Encrypt.

Paso 2: Habilitar TLS para su dominio

En este paso, protegerá su dominio expuesto usando certificados de Let´s Encrypt proporcionados por cert-manager.

Para hacerlo, deberá editar la configuración de ingress en values.yaml. Ábralo​​​ para editarlo:

  1. nano values.yaml

Añada las líneas destacadas:

values.yaml
generateBasicAuth: true

ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: "nginx"
	cert-manager.io/cluster-issuer: letsencrypt-prod
  tls:
    - hosts:
        - openfaas.your_domain
      secretName: openfaas-crt
  hosts:
    - host: openfaas.your_domain
      serviceName: gateway
      servicePort: 8080
      path: /

El bloque tls define el secreto en el que se almacenarán los certificados de sus sitios (enumerados en hosts), lo que el ClusterIssuer letsencrypt-prod emite. Normalmente, el Secret especificado debe ser diferente para cada Ingress de su clúster.

Recuerde sustituir openfaas.your_domain por el dominio que desee, y luego guarde y cierre el archivo.

Aplique los cambios a su clúster ejecutando el siguiente comando:

  1. helm upgrade openfaas --install openfaas/openfaas --namespace openfaas -f values.yaml

Verá el siguiente resultado:

Output
Release "openfaas" has been upgraded. Happy Helming! NAME: openfaas LAST DEPLOYED: ... NAMESPACE: openfaas STATUS: deployed REVISION: 2 TEST SUITE: None NOTES: To verify that openfaas has started, run: kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas" To retrieve the admin password, run: echo $(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode)

Deberá esperar unos minutos para que los servidores de Let´s Encrypt emitan un certificado para su dominio. Mientras tanto, puede rastrear su progreso observando el resultado del siguiente comando:

  1. kubectl describe certificate openfaas-crt -n openfaas

El final del resultado será similar a este:

Output
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal GeneratedKey 24m cert-manager Generated a new private key Normal Requested 16m cert-manager Created new CertificateRequest resource "openfaas-crt-1017759607" Normal Issued 16m cert-manager Certificate issued successfully

Cuando en la última línea del resultado se muestre Certificate issued successfully, podrá salir pulsando CTRL + C. Reinice su dominio en su navegador para probar. En la parte izquierda de la barra de direcciones de su navegador, visualizará el candado. Este indicará que la conexión es segura.

De esta manera, protegió su dominio de OpenFaaS usando certificados TLS gratuitos de Let´s Encrypt. Ahora usará la IU web y administrará funciones desde ella.

Paso 3: Implementar funciones a través de la IU web

En esta sección, explorará la IU web de OpenFaaS y luego implementará, administrará e invocará funciones desde ella.

La IU web de OpenFaaS consta de dos partes principales: en el lado izquierdo, una columna en la que se enumerarán las funciones implementadas y el panel central, donde verá información detallada sobre una función seleccionada y podrá interactuar con ella.

Para implementar una nueva función, haga clic en el botón Deploy New Function que está debajo del logo de OpenFaaS, en la parte superior izquierda. Verá un cuadro de diálogo en el que se le solicitará elegir una función:

OpenFaaS: cuadro de diálogo Deploy a New Function

En la pestaña FROM STORE, se enumeran funciones previamente creadas desde la OpenFass Function Store que puede implementar directamente. Cada función tiene una descripción breve y puede seleccionar el ícono del enlace a la derecha de una función para ver su código fuente. Para implementar una función de almacén desde esta lista, selecciónela y haga clic en el botón DEPLOY.

También puede suministrar su propia función pasando a la pestaña CUSTOM:

OpenFaaS: implementar una función personalizada

Aquí, deberá especificar una imagen de Docker de su función que esté configurada específicamente para OpenFaaS y disponible en un registro de Docker (como Docker Hub). En este paso, implementará una función ya creada desde la tienda de OpenFaaS y luego, en los siguientes pasos, creará e implementará funciones personalizadas en Docker Hub.

Aplicará la función NodeInfo, que ofrece datos sobre la máquina en la que se implementa, como los de arquitectura de CPU, número de núcleos, memoria RAM total disponible y tiempo de actividad (en segundos).

Desde la lista de funciones de la tienda, seleccione NodeInfo y haga clic en DEPLOY. Pronto aparecerá en la lista de funciones implementadas.

OpenFaaS: implementación de NodeInfo

Selecciónelo. En la parte central de la pantalla, verá información básica sobre la función implementada.

OpenFaaS: información sobre la función implementada

El estado de la función se actualiza en tiempo real y pronto debería pasar a ser Ready. Si su valor permanece en Not Ready durante mucho tiempo, es probable que su clúster carezca de los recursos para aceptar un nuevo pod. Puede consultar Cómo redimensionar Droplets si necesita información para solucionar el inconveniente.

Una vez que el valor sea Ready, podrá acceder a la función implementada en la URL indicada. Para probar esto, puede visitar la URL en su navegador o invocarla desde el panel Invoke function situado debajo de la información de la función.

OpenFaaS: Invoke function implementada

Puede seleccionar entre Text, JSON y Download para indicar el tipo de respuesta que espera. Si desea que la solicitud sea POST en vez de GET, puede suministrar datos de la solicitud en el campo Request body.

Para invocar la función nodeinfo, haga clic en el botón INVOKE. OpenFaaS creará y ejecutará una solicitud HTTP según las opciones seleccionadas y completará los campos de respuesta con los datos recibidos.

OpenFaaS: respuesta de la función nodeinfo

El estado de respuesta es HTTP 200 OK, lo cual significa que la solicitud se ejecutó correctamente. El cuerpo de respuesta contiene información del sistema que recopila la función NodeInfo, lo que significa que es posible acceder a ella de forma adecuada y que funciona correctamente.

Para eliminar una función, selecciónela de la lista y haga clic en el ícono de la papelera de la esquina superior derecha de la página. Cuando se le solicite, haga clic en OK para confirmar. El estado de la función cambiará a Not Ready (es decir, que se eliminará del clúster) y esta pronto desaparecerá también de la IU.

En este paso, utilizó la IU web de OpenFaaS, además de implementar y administrar funciones desde ella. Ahora aprenderá a implementar y administrar funciones de OpenFaaS usando la línea de comandos.

Paso 4: Administrar funciones usando faas-cli

En esta sección, configurará la faas-cli para que funcione con su clúster. A continuación, implementará y gestionará sus funciones existentes a través de la línea de comandos.

Para evitar tener que especificar su dominio de OpenFaaS cada vez que ejecute faas-cli, lo almacenará en una variable de entorno llamada OPENFAAS_URL, cuyo valor tomará y usará faas-cli automáticamente durante la ejecución.

Abra .bash_profile en su directorio de inicio para editarlo:

  1. nano ~/.bash_profile

Añada la siguiente línea:

~/.bash_profile
. . .
export OPENFAAS_URL=https://openfaas.your_domain

Recuerde sustituir openfaas.your_domain por su dominio, y luego guarde y cierre el archivo.

Para evitar tener que iniciar sesión de nuevo, evalúe manualmente el archivo:

  1. . ~/.bash_profile

Ahora, asegúrese de tener faas-cli instalado en su máquina local. Si aún no lo instaló, hágalo siguiendo las instrucciones descritas en los documentos oficiales.

A continuación, configure sus credenciales de inicio de sesión ejecutando el siguiente comando:

  1. cat ~/openfaas-password.txt | faas-cli login --username admin --password-stdin

El resultado tendrá este aspecto:

Output
Calling the OpenFaaS server to validate the credentials... credentials saved for admin https://openfaas.your_domain

Para implementar una función desde el almacén, ejecute el siguiente comando:

  1. faas store deploy function_name

Puede intentar implementar nodeinfo ejecutando lo siguiente:

  1. faas store deploy nodeinfo

Verá un resultado como el siguiente:

Output
Deployed. 202 Accepted. URL: https://openfaas.your_domain/function/nodeinfo

Para enumerar las funciones implementadas, ejecute faas list:

  1. faas list

Aparecerán sus funciones existentes:

Output
Function Invocations Replicas nodeinfo 0 1

Para obtener información detallada sobre una función implementada, utilice faas describe:

  1. faas describe nodeinfo

El resultado será similar a este:

Name:                nodeinfo
Status:              Ready
Replicas:            1
Available replicas:  1
Invocations:         0
Image:               functions/nodeinfo-http:latest
Function process:
URL:                 https://openfaas.your_domain/function/nodeinfo
Async URL:           https://openfaas.your_domain/async-function/nodeinfo
Labels:              faas_function : nodeinfo
                     uid : 514253614
Annotations:         prometheus.io.scrape : false

Puede invocar una función con faas invoque:

  1. faas invoke nodeinfo

Recibirá el siguiente mensaje:

Output
Reading from STDIN - hit (Control + D) to stop.

A continuación, podrá proporcionar un cuerpo de solicitud. Si lo hace, el método será POST en vez de GET. Cuando termine con la entrada de datos o desee que la solicitud sea GET, presione CTRL + D. La faas-cli ejecutará la solicitud inferida y mostrará la respuesta, de igual manera que la IU web.

Para eliminar una función, ejecute faas remove:

  1. faas remove nodeinfo

Recibirá el siguiente resultado:

Output
Deleting: nodeinfo. Removing old function.

Ejecute faas list de nuevo para ver que nodeinfo se eliminó:

Output
Function Invocations Replicas

En este paso, implementó, enumeró, invocó y eliminó funciones de su clúster desde la línea de comandos usando faas-cli. En el siguiente paso, creará su propia función y la implementará en su clúster.

Paso 5: Crear e implementar una nueva función

Ahora, creará una función de ejemplo Node.JS usando faas-cli y la implementará en su clúster.

La función resultante que creará se empaquetará como un contenedor de Docker y se publicará en Docker Hub. Para poder publicar contenedores, deberá iniciar sesión ejecutando el siguiente comando:

  1. docker login

Ingrese su nombre de usuario y contraseña de Docker Hub cuando se le solicite para finalizar el proceso de inicio de sesión.

Almacene la función de ejemplo Node.JS en una carpeta llamada sample-js-function. Créela usando el siguiente comando:

  1. mkdir sample-js-function

Diríjase a ella:

  1. cd sample-js-function

Complete el directorio con la plantilla de una función de JS ejecutando el siguiente comando:

  1. faas new sample-js --lang node

El resultado tendrá el siguiente aspecto:

Output
2020/03/24 17:06:08 No templates found in current directory. 2020/03/24 17:06:08 Attempting to expand templates from https://github.com/openfaas/templates.git 2020/03/24 17:06:10 Fetched 19 template(s) : [csharp csharp-armhf dockerfile go go-armhf java11 java11-vert -x java8 node node-arm64 node-armhf node12 php7 python python-armhf python3 python3-armhf python3-debian ru by] from https://github.com/openfaas/templates.git Folder: sample-js created. ___ _____ ____ / _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___| | | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \ | |_| | |_) | __/ | | | _| (_| | (_| |___) | \___/| .__/ \___|_| |_|_| \__,_|\__,_|____/ |_| Function created in folder: sample-js Stack file written: sample-js.yml ...

Como se muestra en el resultado, el código para la función se encuentra en la carpeta sample-js, mientras que la configuración de OpenFaaS para la función se encuentra en el archivo sample-js.yaml. En el directorio sample-js (que se parece a un proyecto normal de Node.Js) hay dos archivos: handler.js y package.json.

handler.js contiene código de JS real que mostrará una respuesta cuando se invoque la función. El contenido del operador tiene el siguiente aspecto:

sample-js-function/sample-js/handler.js
"use strict"

module.exports = async (context, callback) => {
    return {status: "done"}
}

Exporta una lambda function con dos parámetros, un context con datos de la solicitud y un callback que puede usar para transmitir datos de respuesta, en vez de solo devolverlo.

Abra este archivo para editarlo:

  1. nano sample-js/handler.js

Cambie la línea resaltada como se indica:

sample-js-function/sample-js/handler.js
"use strict"

module.exports = async (context, callback) => {
    return {status: "<h1>Hello Sammy!</h1>"}
}

Cuando termine, guarde y cierre el archivo. Cuando se invoque, esta función de OpenFaaS escribirá Hello Sammy! en la respuesta.

A continuación, abra el archivo de configuración para su edición:

  1. nano sample-js.yml

Tendrá el siguiente aspecto:

sample-js-function/sample-js.yml
version: 1.0
provider:
  name: openfaas
  gateway: https://openfaas.your_domain
functions:
  sample-js:
    lang: node
    handler: ./sample-js
    image: sample-js:latest

Para el provider, especifica openfaas y una puerta de enlace predeterminada. A continuación, define la función sample-js, especifica su lenguaje (node), su operador y nombre de imagen de Docker, que deberá modificar para incluir su nombre de usuario de la cuenta de Docker Hub, como se indica:

sample-js-function/sample-js.yml
version: 1.0
provider:
  name: openfaas
  gateway: http://127.0.0.1:8080
functions:
  sample-js:
    lang: node
    handler: ./sample-js
    image: your_docker_hub_username/sample-js:latest

Guarde y cierre el archivo.

A continuación, cree la imagen de Docker, envíela a Docker Hub e impleméntela en su clúster al mismo tiempo ejecutando el siguiente comando:

  1. faas up -f sample-js.yml

Habrá muchos resultados (principalmente de Docker), que terminarán de forma similar a esta:

Output
. . . [0] < Pushing sample-js [your_docker_hub_username/sample-js:latest] done. [0] Worker done. Deploying: sample-js. Deployed. 202 Accepted. URL: https://openfaas.your_domain/function/sample-js

Invoque su función recién implementada para asegurarse de que funcione:

  1. faas invoke sample-js

Pulse CTRL + D. Verá el siguiente resultado:

Output
<h1>Hello Sammy!</h1>

Esto significa que la función se empaquetó e implementó correctamente.

Puede eliminar la función ejecutando lo siguiente:

  1. faas remove sample-js

Con esto. habrá creado e implementado correctamente una función de Node.JS personalizada en su instancia de OpenFaaS de su clúster.

Conclusión

Implementó OpenFaaS en su clúster de Kubernetes de DigitalOcean y está listo para implementar funciones previamente creadas y personalizadas, y para acceder a ellas. Ahora podrá implementar la Function como una arquitectura de servicio, que puede aumentar el uso de recursos y mejorar el rendimiento de sus aplicaciones.

Si desea obtener más información sobre funciones de OpenFaaS avanzadas, como ajuste de escala automático para sus funciones implementadas y la supervisión del rendimiento de estas, consulte los documentos oficiales.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors
Default avatar
Savic

author



Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Featured on Community

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more