Usare OpenFaaS nel servizio Azure Kubernetes

OpenFaaS è un framework che usa i contenitori per compilare funzioni serverless. Il fatto che si tratti di un progetto Open Source ne ha favorito l'adozione su larga scala all'interno della community. Questo documento descrive l'installazione e l'uso di OpenFaaS in un cluster del servizio Azure Kubernetes.

Operazioni preliminari

Aggiungere il repository del grafico Helm OpenFaaS

  1. Passare ad Azure Cloud Shell.

  2. Aggiungere il repository del grafico Helm OpenFaaS e aggiornare alla versione più recente usando i comandi seguenti helm.

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

Distribuire OpenFaaS

È consigliabile archiviare OpenFaaS e le funzioni di OpenFaaS in spazi dei nomi Kubernetes distinti.

  1. Creare uno spazio dei nomi per il sistema e le funzioni OpenFaaS usando il comando kubectl apply.

    kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
    
  2. Generare una password per il portale dell'interfaccia utente OpenFaaS e l'API REST usando i comandi seguenti. Il grafico Helm usa questa password per abilitare l'autenticazione di base nel gateway OpenFaaS, esposto a Internet tramite un loadBalancer cloud.

    # 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"
    
  3. Ottenere il valore per la password usando il comando echo seguente.

    echo $PASSWORD
    
  4. Distribuire OpenFaaS nel cluster del servizio Azure Kubernetes usando il comando helm upgrade.

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

    L'output dovrebbe essere simile all'output di esempio condensato seguente:

    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. Viene creato un indirizzo IP pubblico per l'accesso al gateway OpenFaaS. Ottenere l'indirizzo IP usando il comando kubectl get service.

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

    L'output dovrebbe essere simile all'esempio di output seguente:

    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. Testare il sistema OpenFaaS passando all'indirizzo IP esterno sulla porta 8080, http://52.186.64.52:8080 in questo esempio, in cui viene richiesto di accedere. L'utente predefinito è admin e la password può essere recuperata tramite echo $PASSWORD.

    Screenshot dell'interfaccia utente OpenFaaS.

  7. Impostare $OPENFAAS_URL sull'URL dell'indirizzo IP esterno sulla porta 8080 e accedere con l'interfaccia della riga di comando di Azure usando i comandi seguenti.

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

Creare la prima funzione

  1. Passare al sistema OpenFaaS usando l'URL OpenFaaS.

  2. Creare una funzione usando il portale OpenFaas selezionando Deploy A New Function (Distribuisci una nuova funzione) e cercare Figlet.

  3. Selezionare la funzione Figlet e quindi selezionare Deploy.

    Lo screenshot mostra la finestra di dialogo Distribuire una nuova funzione con il testo Figlet nella riga di ricerca.

  4. Richiamare la funzione usando il comando curl seguente. Assicurarsi di sostituire l'indirizzo IP nell'esempio seguente con l'indirizzo del gateway OpenFaaS.

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

    L'output dovrebbe essere simile all'esempio di output seguente:

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

Creare la seconda funzione

Configurare l'istanza di Azure Cosmos DB

  1. Passare ad Azure Cloud Shell.

  2. Creare un nuovo gruppo di risorse per l'istanza di Azure Cosmos DB usando il comando az group create.

    az group create --name serverless-backing --location eastus
    
  3. Distribuire un'istanza di Azure Cosmos DB di tipo MongoDB usando il comando az cosmosdb create. Sostituire openfaas-cosmos con il nome dell'istanza univoca.

    az cosmosdb create --resource-group serverless-backing --name openfaas-cosmos --kind MongoDB
    
  4. Ottenere la stringa di connessione del database di Azure Cosmos DB e archiviarla in una variabile usando il comando az cosmosdb list. Assicurarsi di sostituire il valore per l'argomento --resource-group con il nome del gruppo di risorse e l'argomento --name con il nome dell'istanza di Azure Cosmos DB.

    COSMOS=$(az cosmosdb list-connection-strings \
      --resource-group serverless-backing \
      --name openfaas-cosmos \
      --query connectionStrings[0].connectionString \
      --output tsv)
    
  5. Popolare Azure Cosmos DB con i dati di test creando un file denominato plans.json e copiandolo nel codice JSON seguente.

    {
        "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
    }
    

Creare la funzione

  1. Installare gli strumenti mongoDB. Il comando di esempio seguente installa questi strumenti usando brew. Per altre opzioni di installazione, vedere la documentazione di MongoDB.

    brew install mongodb
    
  2. Caricare l'istanza di Azure Cosmos DB con i dati usando lo strumento mongoimport.

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

    L'output dovrebbe essere simile all'esempio di output seguente:

    2018-02-19T14:42:14.313+0000    connected to: localhost
    2018-02-19T14:42:14.918+0000    imported 1 document
    
  3. Creare la funzione usando il comando faas-cli deploy. Aggiornare il valore dell'argomento -g con l'indirizzo del gateway OpenFaaS.

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

    Dopo la distribuzione, l'output dovrebbe essere simile all'output di esempio seguente:

    Deployed. 202 Accepted.
    URL: http://52.186.64.52:8080/function/cosmos-query
    
  4. Testare la funzione usando il comando curl seguente. Assicurarsi di aggiornare l'indirizzo IP con l'indirizzo del gateway OpenFaaS.

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

    L'output dovrebbe essere simile all'esempio di output seguente:

    [{"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

    È anche possibile testare la funzione all'interno dell'interfaccia utente di OpenFaaS:

    Screenshot dell'interfaccia utente OpenFaas.

Passaggi successivi

Continuare a imparare con il workshop OpenFaaS, che include un set di lab pratici che illustrano argomenti come la creazione di un bot GitHub personalizzato, l'utilizzo di segreti, la visualizzazione delle metriche e la scalabilità automatica.