Configurer l'autoscaling horizontal des pods

Cette page explique comment utiliser l'autoscaling horizontal des pods pour effectuer l'autoscaling d'un déploiement à l'aide de différents types de métriques. Vous pouvez appliquer les mêmes consignes pour configurer un objet HorizontalPodAutoscaler dans n'importe quel objet Deployment évolutif.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

  • Assurez-vous d'avoir activé l'API Google Kubernetes Engine.
  • Activer l'API Google Kubernetes Engine
  • Assurez-vous d'avoir installé le SDK Cloud.
  • Configurez les paramètres de l'outil de ligne de commande gcloud par défaut pour votre projet en utilisant l'une des méthodes suivantes:
    • Utilisez gcloud init si vous souhaitez suivre les étapes de définition des paramètres par défaut du projet.
    • Utilisez gcloud config pour définir individuellement l'ID, la zone et la région de votre projet.

    gcloud init

    1. Exécutez gcloud init et suivez les instructions :

      gcloud init

      Si vous utilisez SSH sur un serveur distant, utilisez l'option --console-only pour empêcher la commande d'ouvrir un navigateur :

      gcloud init --console-only
    2. Suivez les instructions pour autoriser l'outil gcloud à utiliser votre compte Google Cloud.
    3. Créez ou sélectionnez une configuration.
    4. Choisissez un projet Google Cloud.
    5. Choisissez une zone Compute Engine par défaut.
    6. Choisissez une région Compute Engine par défaut.

    gcloud config

    1. Définissez votre ID de projet par défaut :
      gcloud config set project PROJECT_ID
    2. Définissez votre région Compute Engine par défaut (par exemple, us-central1):
      gcloud config set compute/region COMPUTE_REGION
    3. Définissez votre zone Compute Engine par défaut (par exemple, us-central1-c):
      gcloud config set compute/zone COMPUTE_ZONE
    4. Mettez à jour gcloud vers la dernière version :
      gcloud components update

    En définissant des emplacements par défaut, vous pouvez éviter les erreurs dans l'outil gcloud, telles que les suivantes: One of [--zone, --region] must be supplied: Please specify location.

Versions de l'API pour les objets HorizontalPodAutoscaler

Lorsque vous utilisez Google Cloud Console, les objets HorizontalPodAutoscaler sont créés à l'aide de l'API autoscaling/v2beta2.

Lorsque vous utilisez kubectl pour créer ou afficher des informations sur un autoscaler horizontal de pods, vous pouvez spécifier l'API autoscaling/v1 ou l'API autoscaling/v2beta2.

  • apiVersion: autoscaling/v1 est la version par défaut et ne vous permet d'effectuer un autoscaling qu'en fonction de l'utilisation du processeur. Pour effectuer un autoscaling à partir d'autres métriques, il est recommandé d'utiliser la version apiVersion: autoscaling/v2beta2. L'exemple présenté sur la page Configurer un déploiement utilise la version apiVersion: autoscaling/v1.

  • La version apiVersion: autoscaling/v2beta2 est recommandée pour la création d'objets HorizontalPodAutoscaler. Cette version permet d'effectuer un autoscaling en fonction de plusieurs métriques, y compris des métriques personnalisées ou externes. Tous les autres exemples de cette rubrique utilisent la version apiVersion: autoscaling/v2beta2.

Pour vérifier quelles versions d'API sont compatibles, utilisez la commande kubectl api-versions.

Vous pouvez spécifier l'API à utiliser lors de l'affichage des détails d'un autoscaler horizontal de pods utilisant apiVersion: autoscaling/v2beta2.

Créer l'exemple de déploiement

Avant de pouvoir créer un autoscaler horizontal de pods, vous devez créer la charge de travail qu'il devra surveiller. Les exemples de cette section appliquent différentes configurations d'autoscaler horizontal de pods au déploiement nginx suivant. Des exemples distincts illustrent l'utilisation d'un autoscaler horizontal de pods basé sur l'utilisation des ressources, sur une métrique personnalisée ou externe et sur plusieurs métriques.

Enregistrez le fichier suivant dans un fichier nommé nginx.yaml :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        resources:
          # You must specify requests for CPU to autoscale
          # based on CPU utilization
          requests:
            cpu: "250m"

Ce manifeste spécifie une valeur pour les requêtes de processeur. Si vous souhaitez effectuer un scaling automatique en fonction de l'utilisation d'une ressource exprimée en pourcentage, vous devez spécifier les requêtes pour cette ressource. Si vous ne spécifiez pas de requêtes, vous ne pouvez effectuer un scaling automatique qu'en fonction de la valeur absolue de l'utilisation de la ressource, par exemple, pour l'utilisation de processeur, exprimée en milliprocesseurs.

Pour créer le déploiement, appliquez le manifeste nginx.yaml :

kubectl apply -f nginx.yaml

Le déploiement comporte la valeur spec.replicas définie sur 3, donc trois pods sont déployés. Vous pouvez le vérifier à l'aide de la commande kubectl get deployment nginx.

Chacun des exemples de cette section applique un autoscaler horizontal de pods différent à un exemple de déploiement nginx.

Effectuer un autoscaling basé sur l'utilisation des ressources

Cet exemple crée un objet HorizontalPodAutoscaler afin d'effectuer un autoscaling du déploiement nginx lorsque l'utilisation du processeur dépasse 50 %, et garantit l'existence d'au moins 1 instance dupliquée et d'au plus 10 instances dupliquées.

Vous pouvez créer un autoscaler horizontal de pods qui cible l'utilisation du processeur à l'aide de Cloud Console, de la commande kubectl apply ou, pour l'utilisation moyenne du processeur, de la commande kubectl autoscale.

Console

  1. Accédez à la page Charges de travail dans Cloud Console.

    Accéder à la page Charges de travail

  2. Cliquez sur le nom du déploiement nginx.

  3. Cliquez sur Actions > Évoluer automatiquement.

  4. Spécifiez les valeurs suivantes :

    • Nombre minimal d'instances dupliquées : 1
    • Nombre maximal d'instances dupliquées : 10
    • Métrique d'autoscaling : processeur
    • Cible : 50
    • Unité : %
  5. Cliquez sur OK.

  6. Cliquez sur Évoluer automatiquement.

kubectl apply

Enregistrez le fichier manifeste YAML suivant dans un fichier nommé nginx-hpa.yaml :

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

Pour créer le HPA, appliquez le fichier manifeste à l'aide de la commande suivante :

kubectl apply -f nginx-hpa.yaml

kubectl autoscale

Pour créer un objet HorizontalPodAutoscaler qui ne cible que l'utilisation moyenne du processeur, vous pouvez utiliser la commande kubectl autoscale :

kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10

Pour obtenir la liste des autoscalers horizontaux de pods dans le cluster, exécutez la commande suivante :

kubectl get hpa

Le résultat ressemble à ce qui suit :

NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   0%/50%    1         10        3          61s

Pour obtenir des détails sur l'autoscaler horizontal de pods, vous pouvez utiliser Cloud Console ou la commande kubectl.

Console

  1. Accédez à la page Charges de travail dans Cloud Console.

    Accéder à la page Charges de travail

  2. Cliquez sur le nom du déploiement nginx.

  3. Affichez la configuration de l'autoscaler horizontal de pods dans la section Autoscaler.

  4. D'autres informations sur les événements d'autoscaling sont disponibles dans l'onglet Événements.

kubectl get

Pour obtenir des détails sur l'autoscaler horizontal de pods, vous pouvez utiliser kubectl get hpa avec l'option -o yaml. Le champ status contient des informations sur le nombre actuel d'instances dupliquées et les événements d'autoscaling récents.

kubectl get hpa nginx -o yaml

Le résultat ressemble à ce qui suit :

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  annotations:
    autoscaling.alpha.kubernetes.io/conditions: '[{"type":"AbleToScale","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ScaleDownStabilized","message":"recent
      recommendations were higher than current one, applying the highest recent recommendation"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ValidMetricFound","message":"the
      HPA was able to successfully calculate a replica count from cpu resource utilization
      (percentage of request)"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"DesiredWithinRange","message":"the
      desired count is within the acceptable range"}]'
    autoscaling.alpha.kubernetes.io/current-metrics: '[{"type":"Resource","resource":{"name":"cpu","currentAverageUtilization":0,"currentAverageValue":"0"}}]'
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"autoscaling/v1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"maxReplicas":10,"minReplicas":1,"scaleTargetRef":{"apiVersion":"apps/v1","kind":"Deployment","name":"nginx"},"targetCPUUtilizationPercentage":50}}
  creationTimestamp: "2019-10-30T19:42:43Z"
  name: nginx
  namespace: default
  resourceVersion: "220050"
  selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginx
  uid: 70d1067d-fb4d-11e9-8b2a-42010a8e013f
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  targetCPUUtilizationPercentage: 50
status:
  currentCPUUtilizationPercentage: 0
  currentReplicas: 3
  desiredReplicas: 3

Avant de suivre les autres exemples présentés dans cette section, supprimez le HPA :

kubectl delete hpa nginx

Lorsque vous supprimez un autoscaler horizontal de pods, le nombre d'instances dupliquées du déploiement reste le même. Le déploiement ne rétablit pas automatiquement l'état qui précède l'application de l'autoscaler de pods horizontaux.

Apprenez-en plus sur la suppression d'un autoscaler horizontal de pods.

Effectuer un autoscaling basé sur une métrique personnalisée ou externe

Des tutoriels étape par étape sont à votre disposition pour vous aider à créer des autoscalers horizontaux de pods en utilisant des métriques personnalisées et des métriques externes.

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

Cet exemple crée un autoscaler de pods horizontaux qui réalise un autoscaling en fonction de l'utilisation du processeur et d'une métrique personnalisée nommée packets_per_second.

Si vous avez suivi l'exemple précédent et que vous disposez toujours d'un autoscaler horizontal de pods nommé nginx, supprimez-le avant de commencer cet exemple.

Vous aurez besoin de la version apiVersion: autoscaling/v2beta2. Pour plus d'informations sur les API disponibles, consultez la page Versions d'API pour les objets HorizontalPodAutoscaler.

Enregistrez ce fichier manifeste YAML en tant que fichier nommé nginx-multiple.yaml :

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  - type: Resource
    resource:
      name: memory
      target:
        type: AverageValue
        averageValue: 100Mi
  # Uncomment these lines if you create the custom packets_per_second metric and
  # configure your app to export the metric.
  # - type: Pods
  #   pods:
  #     metric:
  #       name: packets_per_second
  #     target:
  #       type: AverageValue
  #       averageValue: 100

Appliquez le manifeste YAML :

kubectl apply -f nginx-multiple.yaml

Une fois créé, l'autoscaler horizontal des pods surveille le déploiement nginx pour l'utilisation moyenne du processeur, l'utilisation moyenne de la mémoire et la métrique personnalisée packets_per_second si vous avez annulé la mise en commentaire. L'autoscaler horizontal des pods effectue un autoscaling du déploiement en fonction de la métrique dont la valeur crée l'événement d'autoscaling le plus important.

Afficher les détails d'un autoscaler horizontal de pods

Pour afficher la configuration et les statistiques d'un autoscaler horizontal de pods, exécutez la commande suivante :

kubectl describe hpa HPA_NAME

Remplacez HPA_NAME par le nom de votre objet HorizontalPodAutoscaler.

Si l'autoscaler horizontal de pods utilise apiVersion: autoscaling/v2beta2 et qu'il est basé sur plusieurs métriques, la commande kubectl describe hpa n'affiche que la métrique d'utilisation du processeur. Pour afficher toutes les métriques, exécutez la commande suivante :

kubectl describe hpa.v2beta2.autoscaling HPA_NAME

Remplacez HPA_NAME par le nom de votre objet HorizontalPodAutoscaler.

L'état actuel de chaque autoscaler horizontal de pods est indiqué dans le champ Conditions et les événements d'autoscaling sont répertoriés dans le champ Events.

Le résultat ressemble à ce qui suit :

Name:                                                  nginx
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           kubectl.kubernetes.io/last-applied-configuration:
                                                         {"apiVersion":"autoscaling/v2beta2","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"s...
CreationTimestamp:                                     Tue, 05 May 2020 20:07:11 +0000
Reference:                                             Deployment/nginx
Metrics:                                               ( current / target )
  resource memory on pods:                             2220032 / 100Mi
  resource cpu on pods  (as a percentage of request):  0% (0) / 50%
Min replicas:                                          1
Max replicas:                                          10
Deployment pods:                                       1 current / 1 desired
Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    recommended size matches current size
  ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from memory resource
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:                                                <none>

Supprimer un autoscaler horizontal de pods

Vous pouvez supprimer un autoscaler horizontal de pods à l'aide de Cloud Console ou de la commande kubectl delete.

Console

Pour supprimer l'autoscaler horizontal de pods nginx, procédez comme suit :

  1. Accédez à la page Charges de travail dans Cloud Console.

    Accéder à la page Charges de travail

  2. Cliquez sur le nom du déploiement nginx.

  3. Cliquez sur Actions > Évoluer automatiquement.

  4. Cliquez sur Supprimer.

kubectl delete

Pour supprimer l'autoscaler horizontal de pods nginx, utilisez la commande suivante :

kubectl delete hpa nginx

Lorsque vous supprimez un autoscaler horizontal de pods, le déploiement (ou un autre objet de déploiement) n'est pas mis à l'échelle et ne revient pas au nombre d'instances dupliquées du manifeste de déploiement d'origine. Pour rétablir manuellement le scaling du déploiement sur trois pods, vous pouvez utiliser la commande kubectl scale :

kubectl scale deployment nginx --replicas=3

Nettoyer

  1. Supprimez l'autoscaler horizontal de pods, si ce n'est pas déjà fait :

    kubectl delete hpa nginx
    
  2. Supprimez le déploiement nginx :

    kubectl delete deployment nginx
    
  3. Vous pouvez également supprimer le cluster.

Dépannage

Lorsque vous configurez un autoscaler horizontal de pods, des messages d'avertissement semblables aux suivants peuvent s'afficher :

unable to fetch pod metrics for pod

Il est normal que ce message s'affiche au démarrage du serveur de métriques. Toutefois, si vous continuez à voir des avertissements et que vous remarquez que les pods ne sont pas mis à l'échelle pour votre charge de travail, assurez-vous d'avoir spécifié des requêtes de ressources pour chaque conteneur de votre charge de travail. Pour utiliser des pourcentages cibles d'utilisation d'une ressource avec l'autoscaling de pods horizontaux, vous devez configurer les requêtes pour cette ressource pour chaque conteneur et dans chaque pod de la charge de travail. Sinon, l'autoscaler de pods horizontaux ne peut pas effectuer les calculs nécessaires et n'effectue aucune action en lien avec cette métrique.

Étape suivante