Cette rubrique présente le contexte, les limites et le fonctionnement des contrôles de santé des instances de fonction. Elle explique également comment les configurer dans la console Function Compute.
Contexte
Les fonctions qui utilisent un runtime personnalisé ou une image de conteneur personnalisée peuvent parfois devenir instables, ce qui entraîne un comportement anormal de l'instance. Pour y remédier, configurez des contrôles de santé périodiques dans Function Compute. Cette configuration empêche le routage des requêtes vers des instances défaillantes et évite ainsi les échecs de requête.
Limites
Les contrôles de santé sont pris en charge uniquement pour les Web Function et les fonctions GPU.
Fonctionnement des contrôles de santé
Comportement au démarrage de l'instance
Si vous configurez un contrôle de santé pour une fonction, l'instance démarre selon le processus suivant.
Si la fonction possède un hook d'initialisation, celui-ci s'exécute en premier. Sinon, la plateforme effectue immédiatement le contrôle de santé initial.
-
Si ce contrôle initial réussit, l'instance est marquée comme saine et entame son cycle de contrôles périodiques. En cas d'échec, le démarrage de l'instance échoue, le processus de contrôle s'arrête et une erreur est renvoyée.
Lorsque le nombre d'échecs consécutifs atteint la valeur définie dans Maximum Failures, l'instance est marquée comme non saine. Function Compute tente alors de router les requêtes vers d'autres instances saines.
Si une instance non saine obtient un nombre de succès consécutifs égal au Threshold for Successful Detections configuré, elle redevient saine.
Pour savoir comment définir le Threshold for Successful Detections et le Maximum Failures, consultez la section Configurer les contrôles de santé dans la console.
Déroulement d'un contrôle de santé unique
Function Compute exécute un contrôle de santé individuel de la manière suivante :
Envoie une requête GET sur le chemin HTTP spécifié dans la configuration de la fonction.
Le contrôle réussit si la requête GET renvoie un code de statut HTTP compris entre 200 et 399 avant l'expiration du délai. Sinon, il échoue.
Planification après un échec de contrôle de santé
Lorsqu'une instance de fonction devient non saine, Function Compute tente de router les requêtes vers d'autres instances.
Si Function Compute route la requête avec succès, une nouvelle instance saine l'exécute.
Si Function Compute ne parvient pas à router la requête vers une autre instance dans les temps, une erreur d'échec de contrôle de santé est renvoyée. Lors de l'invocation suivante, le système tente de planifier la requête directement sur une nouvelle instance.
Configurer les contrôles de santé dans la console
Cette section détaille la configuration des contrôles de santé pour une fonction. L'exemple utilise une Web Function avec le Runtime Node.js 18.
Étape 1 : Créer une fonction
Connectez-vous à la console Function Compute, puis dans le volet de navigation de gauche, sélectionnez .
Dans la barre de navigation supérieure, sélectionnez une région. Sur la page Functions, cliquez sur Create Function.
Sur la page Create Function, sélectionnez Web Function. Pour le Custom Runtime, choisissez . Cliquez ensuite sur Create.
-
Sur la page de détails de la fonction, sélectionnez l'onglet Code. Modifiez le code de la fonction dans l'éditeur, puis cliquez sur Deploy.
Voici le code d'exemple pour
index.js.'use strict'; // Constants const PORT = 9000; const HOST = '0.0.0.0'; const REQUEST_ID_HEADER = 'x-fc-request-id' const express = require('express'); const bodyParser = require('body-parser'); const app = express(); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use(bodyParser.raw()); app.get('/readyz', (req, res) => { console.log(`receive health check`); res.status(200); console.log(`i am ready`); res.send('i am ready\n'); }); // invocation app.post('/invoke', (req, res) => { var rid = req.headers[REQUEST_ID_HEADER] console.log(`FC Invoke Start RequestId: ${rid}`) res.send('OK'); console.log(`FC Invoke End RequestId: ${rid}`) }); var server = app.listen(PORT, HOST); console.log(`Running on http://${HOST}:${PORT}`); server.timeout = 0; // never timeout server.keepAliveTimeout = 0; // keepalive, never timeoutDans le code ci-dessus,
readyzcorrespond au gestionnaire de contrôle de santé. Il traite les requêtes HTTP GET envoyées au chemin /readyz. Une fois l'Étape 2 : Configurer les contrôles de santé pour l'instance de fonction terminée, vous pouvez configurer Function Compute pour qu'il exécute périodiquement ce gestionnaire afin de vérifier l'état de l'instance.Si Function Compute détecte que votre instance est non saine, il tente de router les requêtes vers d'autres instances saines. Si Function Compute n'y parvient pas, une erreur liée à l'échec du contrôle de santé est renvoyée.
Étape 2 : Configurer les contrôles de santé
Connectez-vous à la console Function Compute, puis dans le volet de navigation de gauche, sélectionnez .
Dans la barre de navigation supérieure, sélectionnez une région. Sur la page Functions, cliquez sur la fonction créée à l'étape précédente.
-
Sur la page de détails de la fonction, sélectionnez l'onglet Configuration. À droite de Advanced Settings, cliquez sur Modify. Dans le panneau Advanced Settings, activez le commutateur Health Check, configurez les paramètres décrits dans le tableau suivant, puis cliquez sur Deploy.
Paramètre
Description
Request Path
Chemin auquel Function Compute envoie une requête HTTP GET pour effectuer le contrôle. La valeur doit commencer par
/.Delay for First Detection
Délai en secondes après le démarrage de l'instance avant l'exécution du premier contrôle.
Detection Interval
Intervalle en secondes entre deux contrôles de santé.
Timeout Period
Durée maximale en secondes pour recevoir une réponse. Le contrôle échoue si aucune réponse n'est reçue dans ce délai.
Maximum Failures
Nombre d'échecs consécutifs requis pour marquer une instance comme non saine.
Threshold for Successful Detections
Nombre de succès consécutifs nécessaires pour qu'une instance non saine redevienne saine.
Étape 3 : Vérifier le contrôle de santé
-
Sur la page de configuration de la fonction, sélectionnez l'onglet Code et cliquez sur Test Function pour consulter le résultat.
Avec le code d'exemple de l'étape 1, l'instance passe le contrôle de santé et renvoie OK.
-
Remplacez le gestionnaire de contrôle de santé dans le code par l'extrait suivant. Cliquez sur Deploy. Une fois le déploiement terminé, cliquez à nouveau sur Test Function pour observer le résultat.
Le code modifié est le suivant :
app.get('/readyz', (req, res) => { console.log(`receive health check`); res.status(500); console.log(`i am not ready`); res.send('i am not ready\n'); });Le contrôle de santé échouera désormais systématiquement avec un code de statut 500. Lors de la prochaine invocation de la fonction, vous recevrez la réponse suivante :
{ "RequestId": "1-65081d42-e4895cbc7d6252bda643****", "Code": "FunctionNotStarted", "Message": "The function http server cannot be started. check function health failed with status code: 500 " }
Informations complémentaires
Outre la console, Function Compute permet également de configurer les contrôles de santé des instances via une API. Pour plus d'informations, consultez Mettre à jour les configurations de contrôle de santé.