Procéder à un autoscaling des déploiements avec des métriques externes

Ce tutoriel explique comment procéder à l'autoscaling de vos charges de travail GKE sur la base de métriques disponibles dans Stackdriver.

Si vous souhaitez procéder à un autoscaling sur la base de métriques exportées par votre charge de travail Kubernetes ou d'une métrique associée à un objet Kubernetes tel qu'un pod ou un nœud, consultez plutôt la page Procéder à un autoscaling des déploiements avec des métriques personnalisées.

Cet exemple présente un autoscaling effectué sur la base du nombre de messages non distribués dans un abonnement Cloud Pub/Sub, mais les instructions qui y sont fournies peuvent être appliquées à toute mesure disponible dans Stackdriver.

Objectifs

Ce tutoriel couvre les tâches suivantes :

  1. Déployer l'adaptateur de métriques personnalisées Stackdriver
  2. Déployer une ressource HorizontalPodAutoscaler (HPA) pour adapter votre déploiement sur la base d'une métrique Stackdriver provenant d'un autre service Google Cloud

Avant de commencer

Pour activer l'API Kubernetes Engine, procédez comme suit :
  1. Accédez à la page Kubernetes Engine dans Google Cloud Console.
  2. Créer ou sélectionner un projet
  3. Patientez le temps de l'activation de l'API et des services associés. Cette opération peut prendre plusieurs minutes.
  4. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier que la facturation est activée pour votre projet.

Dans ce tutoriel, vous allez utiliser Cloud Shell, préinstallé avec les outils de ligne de commande gcloud et kubectl.

Définir des valeurs par défaut pour l'outil de ligne de commande gcloud

Pour gagner du temps lors de la saisie de vos options d'ID de projet et de zone Compute Engine dans l'outil de ligne de commande gcloud, vous pouvez définir les valeurs par défaut suivantes :
gcloud config set project project-id
gcloud config set compute/zone compute-zone

Créer un cluster

Créez un cluster GKE.

Déployer une application Pub/Sub

Pour exécuter une application à l'aide de Cloud Pub/Sub, vous devez créer un compte de service Google Cloud et fournir des identifiants à votre application. Ce point est abordé plus en détail dans le tutoriel S'authentifier sur Cloud Platform avec des comptes de service.

Les étapes suivantes montrent comment procéder à l'autoscaling du déploiement créé lors de la procédure de la page S'authentifier sur Cloud Platform avec des comptes de service. Suivez les étapes 1 à 6 de ce tutoriel avant de poursuivre.

Étape 1 : Déployer l'adaptateur de métriques personnalisées Stackdriver

Pour accorder aux objets GKE un accès aux métriques stockées dans Stackdriver, vous devez déployer l'adaptateur de métriques personnalisées Stackdriver.

Pour exécuter l'adaptateur de métriques personnalisées, vous devez autoriser votre utilisateur à créer les rôles d'autorisation requis en exécutant la commande suivante :

kubectl create clusterrolebinding cluster-admin-binding \
    --clusterrole cluster-admin --user "$(gcloud config get-value account)"

Pour déployer l'adaptateur dans votre cluster, exécutez la commande suivante :

kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml

Étape 2 : Créer un objet HorizontalPodAutoscaler

Une fois que vous avez déployé l'adaptateur de métriques personnalisées Stackdriver, vous pouvez déployer un objet HorizontalPodAutoscaler pour procéder à l'autoscaling de votre déploiement.

Le fichier manifeste suivant décrit un objet HorizontalPodAutoscaler qui procède au scaling d'un déploiement sur la base d'une valeur cible et du nombre de messages non confirmés dans l'abonnement Pub/Sub.

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: pubsub
spec:
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - external:
      metricName: pubsub.googleapis.com|subscription|num_undelivered_messages
      metricSelector:
        matchLabels:
          resource.labels.subscription_id: echo-read
      targetAverageValue: "2"
    type: External
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: pubsub

Pour déployer ce fichier manifeste, téléchargez-le sur votre ordinateur sous le nom pubsub-hpa.yaml, puis exécutez la commande suivante :

kubectl apply -f pubsub-hpa.yaml

Étape 3 : Générer la charge

L'application déployée dans cet exemple traite un message à quelques secondes d'intervalle. En publiant en continu, vous risquez de mettre les messages en file d'attente et de déclencher ainsi l'autoscaling. Utilisez la commande suivante pour publier 200 messages dans le sujet Pub/Sub :

for i in {1..200}; do gcloud pubsub topics publish echo --message="Autoscaling #${i}"; done

Étape 4 : Observer l'objet HPA créer d'autres instances dupliquées de votre application

Vous pouvez vérifier le nombre actuel d'instances dupliquées de votre déploiement en exécutant la commande suivante :

kubectl get deployment pubsub

Vous pouvez également inspecter l'état et l'activité récente de l'objet HPA en exécutant cette commande :

kubectl describe hpa pubsub

Sortie :

Name:                                                                                    pubsub
...
Metrics:                                                                                 ( current / target )
"pubsub.googleapis.com|subscription|num_undelivered_messages" (target average value):  2250m / 2
Min replicas:                                                                            1
Max replicas:                                                                            4
Conditions:
Type            Status  Reason            Message
----            ------  ------            -------
AbleToScale     True    SucceededRescale  the HPA controller was able to update the target scale to 4
ScalingActive   True    ValidMetricFound  the HPA was able to successfully calculate a replica count from external metric pubsub.googleapis.com|subscription|num_undelivered_messages(&LabelSelector{MatchLabels:map[string]string{resource.labels.subscription_id: echo-read,},MatchExpressions:[],})
ScalingLimited  True    TooManyReplicas   the desired replica count is more than the maximum replica count
Events:
Type    Reason             Age   From                       Message
----    ------             ----  ----                       -------
Normal  SuccessfulRescale  7s    horizontal-pod-autoscaler  New size: 4; reason:
external metric
pubsub.googleapis.com|subscription|num_undelivered_messages(&LabelSelector{MatchLabels:map[string]string{resource.labels.subscription_id:
echo-read,},MatchExpressions:[],}) above target

La section "Metrics" (Métriques) donne la dernière valeur de métrique observée par l'objet HPA. Les valeurs fractionnelles sont représentées en millièmes. Par exemple, dans le résultat ci-dessus, il y a quatre instances dupliquées de l'application, et neuf messages actuellement non confirmés dans l'abonnement Pub/Sub. Ainsi, le nombre moyen de messages par instance dupliquée est de 2,25, soit 2 250 millièmes.

La section "Conditions" indique si l'objet HorizontalPodAutoscaler peut évoluer ou non. Dans l'exemple ci-dessus, la condition ScalingLimited indique que le nombre d'instances dupliquées a atteint la valeur maximale autorisée et que l'objet HPA ne la fera plus augmenter.

Enfin, l'objet HPA crée un événement (voir la section "Events" (Événements) dans le résultat ci-dessus) chaque fois qu'il modifie le nombre d'instances dupliquées de l'application. Dans l'exemple ci-dessus, le nombre d'instances dupliquées est passé à 4, car le nombre de messages non confirmés était supérieur à la valeur cible.

Utiliser une métrique différente

Une métrique disponible dans Stackdriver peut être utilisée pour l'autoscaling, à condition que metricType soit défini sur INT64 ou DOUBLE. Pour parcourir les métriques disponibles, servez-vous de l'Explorateur de métriques ou de la liste des métriques GCP. Pour les métriques du genre GAUGE, c'est la valeur de métrique actuelle qui est utilisée pour l'autoscaling. Pour les métriques DELTA et CUMULATIVE, le taux de la métrique (c'est-à-dire le changement par seconde de la métrique) est utilisé à la place. Vous trouverez plus de détails sur le calcul du taux dans la documentation de l'adaptateur de métriques personnalisées.

Pour afficher les métriques d'une ressource surveillée à l'aide de l'Explorateur de métriques, procédez comme suit :

  1. Dans Google Cloud Console, accédez à Surveillance ou utilisez le bouton suivant :
    Accéder à "Surveillance"
  2. Dans le volet de navigation "Surveillance", cliquez sur  Explorateur de métriques.
  3. Saisissez le nom de la ressource surveillée dans la zone de texte Rechercher un type de ressource et une métrique.

Écrire une spécification de métrique externe

Une fois que vous avez choisi une métrique sur laquelle vous souhaitez effectuer l'autoscaling, vous devez écrire une spécification de métrique externe pour l'objet HorizontalPodAutoscaler. Pour ce faire, vous devez spécifier trois champs :

  • metricName est le nom de la métrique. L'API Kubernetes n'autorise pas l'utilisation de barres obliques dans les noms de métriques. Vous devez donc les remplacer par des barres verticales (|). Notez comment pubsub.googleapis.com/subscription/num_undelivered_messages a été spécifié sous la forme pubsub.googleapis.com|subscription|num_undelivered_messages dans ce tutoriel.
  • metricSelector peut éventuellement être utilisé pour sélectionner une série temporelle spécifique de la métrique. Si metricSelector correspond à plusieurs séries temporelles, la somme de leurs valeurs est alors utilisée pour l'autoscaling. Dans ce tutoriel, metricSelector a été utilisé pour que l'objet HPA ne puisse prendre en compte que les messages de l'abonnement echo-read. Renseignez-vous sur les séries temporelles et les étiquettes Stackdriver, ainsi que sur Kubernetes LabelSelector.
  • targetAverageValue spécifie quelle part d'une valeur totale de métrique une instance dupliquée peut traiter. Cela est utile lorsque vous utilisez des métriques qui décrivent des tâches ou des ressources pouvant être divisées entre plusieurs instances dupliquées, par exemple des messages Pub/Sub ou RPS. Pour les autres métriques, telles que la latence moyenne des requêtes, il est plus approprié de spécifier une valeur cible globale. Pour ce faire, spécifiez targetValue au lieu de targetAverageValue.

Procéder à un autoscaling basé sur plusieurs métriques

Vous pouvez utiliser plusieurs métriques avec un seul objet HorizontalPodAutoscaler, en combinant des métriques externes avec d'autres types de métriques décrits dans le tutoriel Procéder à un autoscaling des déploiements avec des métriques personnalisées. Pour ce faire, spécifiez chaque métrique que vous souhaitez utiliser en tant qu'entrée distincte dans la liste de metrics de la spécification de l'objet HPA. L'objet HPA calcule le nombre d'instances dupliquées en fonction de chaque métrique et choisit la plus élevée d'entre elles.

Nettoyer

Afin d'éviter la facturation sur votre compte Google Cloud Platform des ressources utilisées lors de ce tutoriel, procédez comme suit :

  1. Nettoyez l'abonnement et le sujet Pub/Sub :

    gcloud pubsub subscriptions delete echo-read
    gcloud pubsub topics delete echo
    
  2. Supprimez le cluster GKE :

    gcloud container clusters delete cluster-name
    

Étapes suivantes