El autor seleccionó la Free and Open Source Fund para recibir una donación como parte del programa Write for DOnations.
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.
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.stable
del paso 2 del tutorial Cómo instalar software en clústeres de Kubernetes con el gestor de paquetes de Helm 3.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.
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:
- kubectl delete -f hello-kubernetes-first.yaml
- kubectl delete -f hello-kubernetes-second.yaml
- 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:
- kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
Verá el siguiente resultado:
Outputnamespace/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:
- 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:
- helm repo update
Verá el siguiente resultado:
OutputHang 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:
- nano values.yaml
Añada las siguientes líneas:
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:
- helm upgrade openfaas --install openfaas/openfaas --namespace openfaas -f values.yaml
Verá lo siguiente:
OutputRelease "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
:
- 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:
- 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:
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.
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:
- nano values.yaml
Añada las líneas destacadas:
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:
- helm upgrade openfaas --install openfaas/openfaas --namespace openfaas -f values.yaml
Verá el siguiente resultado:
OutputRelease "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:
- kubectl describe certificate openfaas-crt -n openfaas
El final del resultado será similar a este:
OutputEvents:
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.
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:
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:
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.
Selecciónelo. En la parte central de la pantalla, verá información básica 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.
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.
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.
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:
- nano ~/.bash_profile
Añada la siguiente línea:
. . .
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:
- . ~/.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:
- cat ~/openfaas-password.txt | faas-cli login --username admin --password-stdin
El resultado tendrá este aspecto:
OutputCalling 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:
- faas store deploy function_name
Puede intentar implementar nodeinfo
ejecutando lo siguiente:
- faas store deploy nodeinfo
Verá un resultado como el siguiente:
OutputDeployed. 202 Accepted.
URL: https://openfaas.your_domain/function/nodeinfo
Para enumerar las funciones implementadas, ejecute faas list
:
- faas list
Aparecerán sus funciones existentes:
OutputFunction Invocations Replicas
nodeinfo 0 1
Para obtener información detallada sobre una función implementada, utilice faas describe
:
- 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
:
- faas invoke nodeinfo
Recibirá el siguiente mensaje:
OutputReading 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
:
- faas remove nodeinfo
Recibirá el siguiente resultado:
OutputDeleting: nodeinfo.
Removing old function.
Ejecute faas list
de nuevo para ver que nodeinfo
se eliminó:
OutputFunction 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.
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:
- 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:
- mkdir sample-js-function
Diríjase a ella:
- cd sample-js-function
Complete el directorio con la plantilla de una función de JS ejecutando el siguiente comando:
- faas new sample-js --lang node
El resultado tendrá el siguiente aspecto:
Output2020/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:
"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:
- nano sample-js/handler.js
Cambie la línea resaltada como se indica:
"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:
- nano sample-js.yml
Tendrá el siguiente aspecto:
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:
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:
- 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:
- 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:
- 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.
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.
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!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.