Compartir vía


Uso de OpenFaaS en Azure Kubernetes Service (AKS)

OpenFaaS es un marco que usa contenedores para compilar funciones sin servidor. Como proyecto de código abierto, se ha adoptado a gran escala dentro de la comunidad. En este documento se detalla la instalación y uso de OpenFaas en un clúster de Azure Kubernetes Service (AKS).

Antes de empezar

Incorporación del repositorio de gráficos de Helm de OpenFaaS

  1. Navegue a Azure Cloud Shell.

  2. Agregue el repositorio de gráficos de Helm de OpenFaaS y actualice a la versión más reciente mediante los siguientes comandos helm.

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

Implementación de OpenFaaS

Como recomendación, OpenFaaS y sus funciones deberían almacenarse en su propio espacio de nombres de Kubernetes.

  1. Cree un espacio de nombres para el sistema y las funciones de OpenFaaS mediante el comando kubectl apply.

    kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
    
  2. Genere una contraseña para el portal de la interfaz de usuario de OpenFaaS y la API de REST mediante los siguientes comandos. El gráfico de Helm usa esta contraseña para habilitar la autenticación básica en la puerta de enlace de OpenFaaS, que se expone en Internet mediante un equilibrador de carga de nube.

    # generate a random password
    PASSWORD=$(head -c 12 /dev/urandom | shasum| cut -d' ' -f1)
    
    kubectl -n openfaas create secret generic basic-auth \
    --from-literal=basic-auth-user=admin \
    --from-literal=basic-auth-password="$PASSWORD"
    

    Importante

    El uso de un nombre de usuario y una contraseña para la autenticación es un patrón no seguro. Si tiene una licencia empresarial de OpenFaaS, se recomienda usar Administración de identidad y acceso (IAM)(IAM) para OpenFaaS en su lugar.

  3. Obtenga el valor de la contraseña mediante el siguiente comando echo.

    echo $PASSWORD
    
  4. Implemente OpenFaaS en el clúster de AKS mediante el comando helm upgrade.

    helm upgrade openfaas --install openfaas/openfaas \
        --namespace openfaas  \
        --set basic_auth=true \
        --set functionNamespace=openfaas-fn \
        --set serviceType=LoadBalancer
    

    El resultado debería ser similar al siguiente ejemplo reducido:

    NAME: openfaas
    LAST DEPLOYED: Tue Aug 29 08:26:11 2023
    NAMESPACE: openfaas
    STATUS: deployed
    ...
    NOTES:
    To verify that openfaas has started, run:
    
    kubectl --namespace=openfaas get deployments -l "release=openfaas, app=openfaas"
    ...
    
  5. Se crea una dirección IP pública para tener acceso a la puerta de enlace de OpenFaaS. Obtenga la dirección IP mediante el comando kubectl get service.

    kubectl get service -l component=gateway --namespace openfaas
    

    El resultado debería ser similar al ejemplo siguiente:

    NAME               TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)          AGE
    gateway            ClusterIP      10.0.156.194   <none>         8080/TCP         7m
    gateway-external   LoadBalancer   10.0.28.18     52.186.64.52   8080:30800/TCP   7m
    
  6. Pruebe el sistema OpenFaaS; para ello, vaya a la dirección IP externa en el puerto 8080, en este ejemplo http://52.186.64.52:8080, donde se le pedirá que inicie sesión. El usuario predeterminado es admin y la contraseña se puede recuperar con echo $PASSWORD.

    Captura de pantalla de la interfaz de usuario de OpenFaaS.

  7. Establezca $OPENFAAS_URL en la dirección URL de la dirección IP externa en el puerto 8080 e inicie sesión con la CLI de Azure mediante los siguientes comandos.

    export OPENFAAS_URL=http://52.186.64.52:8080
    echo -n $PASSWORD | ./faas-cli login -g $OPENFAAS_URL -u admin --password-stdin
    

Creación de la primera función

  1. Vaya al sistema OpenFaaS mediante la dirección URL de OpenFaaS.

  2. Cree una función mediante el portal de OpenFaas; para ello, seleccione Implementar una nueva función y busque Figlet.

  3. Seleccione la función Figlet y haga clic en Implementar.

    Captura de pantalla que muestra el cuadro de diálogo Implementar una nueva función con el texto Figlet en la línea de búsqueda.

  4. Invoque la función mediante el siguiente comando curl. Asegúrese de reemplazar la dirección IP en el ejemplo siguiente por la dirección de puerta de enlace de OpenFaaS.

    curl -X POST http://52.186.64.52:8080/function/figlet -d "Hello Azure"
    

    El resultado debería ser similar al ejemplo siguiente:

     _   _      _ _            _
    | | | | ___| | | ___      / \    _____   _ _ __ ___
    | |_| |/ _ \ | |/ _ \    / _ \  |_  / | | | '__/ _ \
    |  _  |  __/ | | (_) |  / ___ \  / /| |_| | | |  __/
    |_| |_|\___|_|_|\___/  /_/   \_\/___|\__,_|_|  \___|
    

Creación de la segunda función

Configuración de la instancia de Azure Cosmos DB

  1. Navegue a Azure Cloud Shell.

  2. Cree un nuevo grupo de recursos para la instancia de Azure Cosmos DB mediante el comando az group create.

    az group create --name serverless-backing --location eastus
    
  3. Implemente una instancia de Azure Cosmos DB de tipo MongoDB mediante el comando az cosmosdb create. Reemplace openfaas-cosmos por su propio nombre de instancia único.

    az cosmosdb create --resource-group serverless-backing --name openfaas-cosmos --kind MongoDB
    
  4. Obtenga la cadena de conexión de base de datos de Azure Cosmos DB y almacénela en una variable mediante el comando az cosmosdb keys list. Asegúrese de reemplazar el valor del argumento --resource-group con el nombre del grupo de recursos y el argumento --name con el nombre de su instancia de Azure Cosmos DB.

    COSMOS=$(az cosmosdb keys list \
      --type connection-strings \
      --resource-group serverless-backing \
      --name openfaas-cosmos \
      --output tsv)
    
  5. Rellene Azure Cosmos DB con datos de prueba mediante la creación de un archivo denominado plans.json y la copia en el siguiente archivo JSON.

    {
        "name" : "two_person",
        "friendlyName" : "Two Person Plan",
        "portionSize" : "1-2 Person",
        "mealsPerWeek" : "3 Unique meals per week",
        "price" : 72,
        "description" : "Our basic plan, delivering 3 meals per week, which will feed 1-2 people.",
        "__v" : 0
    }
    

Creación de la función

  1. Instale las herramientas de MongoDB. El siguiente comando de ejemplo instala estas herramientas mediante brew. Para ver más opciones de instalación, consulte la documentación de MongoDB.

    brew install mongodb
    
  2. Cargue la instancia de Azure Cosmos DB con datos mediante la herramienta mongoimport.

    mongoimport --uri=$COSMOS -c plans < plans.json
    

    El resultado debería ser similar al ejemplo siguiente:

    2018-02-19T14:42:14.313+0000    connected to: localhost
    2018-02-19T14:42:14.918+0000    imported 1 document
    
  3. Cree la función mediante el comando faas-cli deploy. Asegúrese de actualizar el valor del argumento -g con la dirección de la puerta de enlace de OpenFaaS.

    faas-cli deploy -g http://52.186.64.52:8080 --image=shanepeckham/openfaascosmos --name=cosmos-query --env=NODE_ENV=$COSMOS
    

    Una vez implementada, el resultado debería ser similar a la siguiente salida de ejemplo:

    Deployed. 202 Accepted.
    URL: http://52.186.64.52:8080/function/cosmos-query
    
  4. Pruebe la función con el siguiente comando curl. Asegúrese de actualizar la dirección IP con la dirección de puerta de enlace de OpenFaaS.

    curl -s http://52.186.64.52:8080/function/cosmos-query
    

    El resultado debería ser similar al ejemplo siguiente:

    [{"ID":"","Name":"two_person","FriendlyName":"","PortionSize":"","MealsPerWeek":"","Price":72,"Description":"Our basic plan, delivering 3 meals per week, which will feed 1-2 people."}]
    

    Nota:

    También puede probar la función dentro de la UI de OpenFaaS:

    Captura de pantalla de la interfaz de usuario de OpenFaaS.

Pasos siguientes

Si desea obtener más información, puede realizar el taller sobre OpenFaaS, que incluye un conjunto de laboratorios prácticos que abarcan temas como la creación de su propio bot de GitHub, el consumo de secretos, la visualización de métricas y el escalado automático.