Effectuer un scaling des requêtes et limites de ressources de conteneurs


Cette page explique comment analyser et ajuster les demandes de ressources de processeur et de mémoire d'un conteneur dans Google Kubernetes Engine (GKE) à l'aide de l'autoscaling de pods verticaux.

Vous pouvez faire évoluer les ressources de conteneur manuellement via la console Google Cloud, analyser les ressources à l'aide d'un objet VerticalPodAutoscaler ou configurer le scaling automatique à l'aide de l'autoscaling de pods vertical.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

  • Activez l'API Google Kubernetes Engine.
  • Activer l'API Google Kubernetes Engine
  • Si vous souhaitez utiliser Google Cloud CLI pour cette tâche, installez puis initialisez gcloud CLI. Si vous avez déjà installé gcloud CLI, assurez-vous de disposer de la dernière version en exécutant la commande gcloud components update.

Analyser les demandes de ressources

L'autoscaler de pods vertical analyse automatiquement vos conteneurs et fournit des demandes de ressources suggérées. Vous pouvez afficher ces demandes de ressources à l'aide de la console Google Cloud, de Cloud Monitoring ou de Google Cloud CLI.

Console

Pour afficher les demandes de ressources suggérées dans la console Google Cloud, vous devez déployer une charge de travail existante datant d'au moins 24 heures. Certaines suggestions peuvent ne pas être disponibles ou pertinentes pour certaines charges de travail, telles que celles créées au cours des dernières 24 heures, les pods autonomes et les applications écrites en Java.

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

    Accéder à la page Charges de travail

  2. Dans la liste des charges de travail, cliquez sur le nom de la charge de travail que vous souhaitez faire évoluer.

  3. Cliquez sur Actions > Effectuer le scaling > Modifier les demandes de ressources.

    La section "Analyser les données d'utilisation des ressources" affiche l'historique des données d'utilisation que le contrôleur de l'autoscaler de pods vertical a analysé pour créer les demandes de ressources suggérées dans la section "Ajuster les demandes et les limites de ressources".

Cloud Monitoring

Pour afficher les demandes de ressources suggérées dans Cloud Monitoring, vous devez déployer une charge de travail existante.

  1. Accédez à la page Explorateur de métriques dans la console Google Cloud.

    Accéder à l'explorateur de métriques

  2. Cliquez sur Configuration

  3. Développez le menu Sélectionner une métrique.

  4. Dans le menu Ressource, sélectionnez Scaling Kubernetes.

  5. Dans le menu Catégorie de métrique, sélectionnez Autoscaler.

  6. Dans le menu Métrique, sélectionnez Recommandée par octets de requête d'instance répliquée et Recommandé par cœur de requête d'instance répliquée.

  7. Cliquez sur Appliquer.

CLI gcloud

Pour afficher les demandes de ressources suggérées, vous devez créer un objet VerticalPodAutoscaler et un Déploiement.

  1. Pour les clusters standards, activez l'autoscaling de pods vertical de votre cluster. Sur les clusters Autopilot, l'autoscaling de pods vertical est activé par défaut.

    gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
    

    Remplacez CLUSTER_NAME par le nom de votre cluster.

  2. Enregistrez le manifeste suivant sous le nom my-rec-deployment.yaml :

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-rec-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: my-rec-deployment
      template:
        metadata:
          labels:
            app: my-rec-deployment
        spec:
          containers:
          - name: my-rec-container
            image: nginx
    

    Ce fichier manifeste décrit un Deployment qui ne dispose pas de demandes de ressources de mémoire ou de processeur. La valeur containers.name de my-rec-deployment indique que tous les pods du déploiement appartiennent à VerticalPodAutoscaler.

  3. Appliquez le fichier manifeste au cluster :

    kubectl create -f my-rec-deployment.yaml
    
  4. Enregistrez le manifeste suivant sous le nom my-rec-vpa.yaml :

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: my-rec-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind:       Deployment
        name:       my-rec-deployment
      updatePolicy:
        updateMode: "Off"
    

    Ce fichier manifeste décrit un VerticalPodAutoscaler. La valeur updateMode de Off signifie que lors de la création des pods, le contrôleur de l'autoscaler de pods vertical analyse les besoins en ressources de mémoire et de processeur, puis enregistre ces recommandations dans le champ status de la ressource. Le contrôleur de l'autoscaler de pods vertical ne met pas automatiquement à jour les demandes de ressources pour les conteneurs en cours d'exécution.

  5. Appliquez le fichier manifeste au cluster :

    kubectl create -f my-rec-vpa.yaml
    
  6. Attendez un certain temps, puis affichez VerticalPodAutoscaler :

    kubectl get vpa my-rec-vpa --output yaml
    

    Le résultat ressemble à ce qui suit :

    ...
      recommendation:
        containerRecommendations:
        - containerName: my-rec-container
          lowerBound:
            cpu: 25m
            memory: 262144k
          target:
            cpu: 25m
            memory: 262144k
          upperBound:
            cpu: 7931m
            memory: 8291500k
    ...
    

    Cette sortie affiche des recommandations pour les demandes de ressources de mémoire et de processeur.

Définir manuellement les demandes de ressources des pods

Vous pouvez définir manuellement des demandes de ressources de pod à l'aide de Google Cloud CLI ou de la console Google Cloud.

Console

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

    Accéder à la page Charges de travail

  2. Dans la liste des charges de travail, cliquez sur le nom de la charge de travail que vous souhaitez faire évoluer.

  3. Cliquez sur Actions > Effectuer le scaling > Modifier les demandes de ressources.

    1. La section Ajuster les demandes et les limites de ressources indique les demandes actuelles de ressources mémoire et de processeur pour chaque conteneur, ainsi que les demandes de ressources mémoire et de processeur suggérées.
  4. Cliquez sur Appliquer les dernières suggestions pour afficher les requêtes suggérées pour chaque conteneur.

  5. Cliquez sur Enregistrer les modifications.

  6. Cliquez sur Confirmer.

gcloud

Pour définir les demandes de ressources pour un pod, définissez les valeurs "requests.cpu" et "memory.cpu" dans votre fichier manifeste du Déploiement. Dans cet exemple, vous modifiez manuellement le Déploiement créé dansAnalyser les demandes de ressources avec des demandes de ressources suggérées.

  1. Enregistrez l'exemple de fichier manifeste suivant sous le nom my-adjusted-deployment.yaml :

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-rec-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: my-rec-deployment
      template:
        metadata:
          labels:
            app: my-rec-deployment
        spec:
          containers:
          - name: my-rec-container
            image: nginx
            resources:
              requests:
                cpu: 25m
                memory: 256Mi
    

    Ce fichier manifeste décrit un Déploiement comportant deux pods. Chaque pod contient un conteneur qui demande 25 milliprocesseurs et 256 Mio de mémoire.

  2. Appliquez le fichier manifeste au cluster :

    kubectl apply -f my-adjusted-deployment.yaml
    

Vous pouvez également appliquer des modifications manuellement en procédant comme suit :

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

    Accéder à la page Charges de travail

  2. Dans la liste des charges de travail, cliquez sur le nom de la charge de travail que vous souhaitez faire évoluer.

  3. Cliquez sur Actions > Effectuer le scaling > Modifier les demandes de ressources.

  4. Configurez vos requêtes de conteneur.

  5. Cliquez sur Obtenir l'équivalent au format YAML.

  6. Cliquez sur Télécharger la charge de travail ou copiez et collez le fichier manifeste dans un fichier nommé resource-adjusted.yaml.

  7. Appliquez le fichier manifeste à votre cluster :

    kubectl create -f resource-adjusted.yaml
    

Définir automatiquement les demandes de ressources des pods

L'autoscaling de pods vertical utilise l'objet VerticalPodAutoscaler pour définir automatiquement les demandes de ressources sur les pods lorsque updateMode est défini sur Auto. Vous pouvez configurer un objet VerticalPodAutoscaler à l'aide de gcloud CLI ou de la console Google Cloud.

Console

Pour définir automatiquement les demandes de ressources, vous devez disposer d'un cluster sur lequel la fonctionnalité d'autoscaling de pods vertical est activée. La fonctionnalité d'autoscaling de pods vertical est activée par défaut sur les clusters Autopilot.

Activer l'autoscaling de pods verticaux

  1. Accédez à la page Google Kubernetes Engine dans la console Google Cloud.

    Accéder à Google Kubernetes Engine

  2. Dans la liste des clusters, cliquez sur le nom du cluster que vous souhaitez modifier.

  3. Dans la section Automatisation, cliquez sur Modifier pour l'option Autoscaling des pods vertical.

  4. Cochez la case Activer l'autoscaling de pods verticaux.

  5. Cliquez sur Enregistrer les modifications.

Configurer l'autoscaling de pods vertical

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

    Accéder à la page Charges de travail

  2. Dans la liste des charges de travail, cliquez sur le nom du déploiement pour lequel vous souhaitez configurer l'autoscaling de pods vertical.

  3. Cliquez sur Actions > Autoscaling > Autoscaling de pods vertical.

  4. Choisissez un mode d'autoscaling :

    • Mode automatique : l'autoscaling de pods vertical met à jour les demandes de ressources mémoire et processeur pendant toute la durée de vie d'un pod.
    • Mode initial : l'autoscaling de pods vertical n'attribue des demandes de ressources que lors de la création du pod et ne les modifie jamais ultérieurement.
  5. (Facultatif) Définissez des stratégies sur les conteneurs. Cette option vous permet de vous assurer que la recommandation n'est jamais définie au-dessus ou en dessous d'une requête de ressource spécifiée.

    1. Cliquez sur Ajouter une stratégie.
    2. Sélectionnez Auto pour Modifier le mode du conteneur.
    3. Dans Ressources contrôlées, sélectionnez les ressources sur lesquelles vous souhaitez effectuer l'autoscaling du conteneur.
    4. Cliquez sur Ajouter une stratégie pour définir une ou plusieurs plages minimales ou maximales pour les demandes de ressources du conteneur :
      • Mémoire min. allouée : quantité minimale de mémoire dont le conteneur doit toujours disposer, en Mio.
      • CPU min. alloué : quantité minimale de CPU dont le conteneur doit toujours disposer, en mCPU.
      • Mémoire max. allouée : quantité maximale de mémoire dont le conteneur doit toujours disposer, en Mio.
      • CPU max. alloué : quantité maximale de processeurs dont le conteneur doit toujours disposer, en mCPU.
  6. Cliquez sur OK.

  7. Cliquez sur Enregistrer.

gcloud

Pour définir automatiquement les demandes de ressources, vous devez disposer d'un cluster sur lequel la fonctionnalité d'autoscaling de pods vertical est activée. Cette fonctionnalité est activée par défaut sur les clusters Autopilot.

  1. Pour les clusters standards, activez l'autoscaling de pods vertical de votre cluster :

    gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
    

    Remplacez CLUSTER_NAME par le nom de votre cluster.

  2. Enregistrez le manifeste suivant sous le nom my-auto-deployment.yaml :

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-auto-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: my-auto-deployment
      template:
        metadata:
          labels:
            app: my-auto-deployment
        spec:
          containers:
          - name: my-container
            image: registry.k8s.io/ubuntu-slim:0.1
            resources:
              requests:
                cpu: 100m
                memory: 50Mi
            command: ["/bin/sh"]
            args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]
    

    Ce fichier manifeste décrit un Déploiement comportant deux pods. Chaque pod contient un conteneur qui demande 100 milliprocesseurs et 50 Mio de mémoire.

  3. Appliquez le fichier manifeste au cluster :

    kubectl create -f my-auto-deployment.yaml
    
  4. Établissez la liste des pods en cours d'exécution :

    kubectl get pods
    

    Le résultat affiche le nom des pods dans my-deployment :

    NAME                            READY     STATUS             RESTARTS   AGE
    my-auto-deployment-cbcdd49fb-d6bf9   1/1       Running            0          8s
    my-auto-deployment-cbcdd49fb-th288   1/1       Running            0          8s
    
  5. Enregistrez le manifeste suivant sous le nom my-vpa.yaml :

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: my-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind:       Deployment
        name:       my-auto-deployment
      updatePolicy:
        updateMode: "Auto"
    

    Ce fichier manifeste décrit un objet VerticalPodAutoscaler avec les propriétés suivantes :

    • targetRef.name : indique que tout pod contrôlé par un déploiement nommé my-deployment appartient à cet objet VerticalPodAutoscaler.
    • updateMode: Auto : indique que le contrôleur de l'autoscaler vertical de pods peut supprimer un pod, ajuster les demandes de ressources mémoire et de processeur, puis démarrer un nouveau pod.

    Vous pouvez également configurer l'autoscaling de pods vertical pour n'attribuer des demandes de ressources qu'au moment de la création du pod, à l'aide de updateMode: "Initial".

  6. Appliquez le fichier manifeste au cluster :

    kubectl create -f my-vpa.yaml
    
  7. Attendez quelques minutes et affichez à nouveau les pods en cours d'exécution :

    kubectl get pods
    

    Le résultat indique que les noms des pods ont changé :

    NAME                                 READY     STATUS             RESTARTS   AGE
    my-auto-deployment-89dc45f48-5bzqp   1/1       Running            0          8s
    my-auto-deployment-89dc45f48-scm66   1/1       Running            0          8s
    

    Si les noms des pods n'ont pas changé, attendez un peu plus longtemps, puis affichez à nouveau les pods en cours d'exécution.

Afficher les informations sur un autoscaling de pods vertical

Pour afficher les informations détaillées sur un autoscaling de pods vertical, procédez comme suit :

  1. Pour obtenir des informations détaillées sur l'un de vos pods en cours d'exécution, saisissez :

    kubectl get pod POD_NAME --output yaml
    

    Remplacez POD_NAME par le nom de l'un de vos pods que vous avez récupéré à l'étape précédente.

    Le résultat ressemble à ce qui suit :

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        vpaUpdates: 'Pod resources updated by my-vpa: container 0: cpu capped to node capacity, memory capped to node capacity, cpu request, memory request'
    ...
    spec:
      containers:
      ...
        resources:
          requests:
            cpu: 510m
            memory: 262144k
        ...
    

    Ce résultat montre que le contrôleur de l'autoscaling de pods vertical demande 262 144 Ko de mémoire de et 510 milliCPU.

  2. Obtenez des informations détaillées sur VerticalPodAutoscaler :

    kubectl get vpa my-vpa --output yaml
    

    Le résultat ressemble à ce qui suit :

    ...
      recommendation:
        containerRecommendations:
        - containerName: my-container
          lowerBound:
            cpu: 536m
            memory: 262144k
          target:
            cpu: 587m
            memory: 262144k
          upperBound:
            cpu: 27854m
            memory: "545693548"
    

    Cette sortie affiche des recommandations pour les demandes de ressources de mémoire et de CPU et inclut les propriétés suivantes :

    • target : indique que le conteneur doit fonctionner de manière optimale avec 587 milliCPU et 262 144 Ko de mémoire.
    • lowerBound et upperBound : l'autoscaling de pods vertical utilise ces propriétés pour décider de supprimer un pod et de le remplacer par un nouveau. Si les demandes d'un pod sont en dessous de la limite inférieure ou au-dessus de la limite supérieure, l'autoscaler de pods verticaux le supprime et le remplace par un pod ayant l'attribut cible.

Désactiver des conteneurs spécifiques

Vous pouvez désactiver des conteneurs spécifiques de l'autoscaling de pods vertical à l'aide de gcloud CLI ou de la console Google Cloud.

Console

Pour désactiver des conteneurs spécifiques de l'autoscaling de pods vertical, vous devez disposer d'un cluster sur lequel la fonctionnalité d'autoscaling de pods vertical est activée. La fonctionnalité d'autoscaling de pods vertical est activée par défaut sur les clusters Autopilot.

Activer l'autoscaling de pods verticaux

  1. Accédez à la page Google Kubernetes Engine dans la console Google Cloud.

    Accéder à Google Kubernetes Engine

  2. Dans la liste des clusters, cliquez sur le nom du cluster que vous souhaitez modifier.

  3. Dans la section Automatisation, cliquez sur Modifier pour l'option Autoscaling des pods vertical.

  4. Cochez la case Activer l'autoscaling de pods verticaux.

  5. Cliquez sur Enregistrer les modifications.

Configurer l'autoscaling de pods vertical

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

    Accéder à la page Charges de travail

  2. Dans la liste des charges de travail, cliquez sur le nom du déploiement pour lequel vous souhaitez configurer l'autoscaling de pods vertical.

  3. Cliquez sur Actions > Autoscaling > Autoscaling de pods vertical.

  4. Choisissez un mode d'autoscaling :

    • Mode automatique : l'autoscaling de pods vertical met à jour les demandes de ressources mémoire et processeur pendant toute la durée de vie d'un pod.
    • Mode initial : l'autoscaling de pods vertical n'attribue des demandes de ressources que lors de la création du pod et ne les modifie jamais ultérieurement.
  5. Cliquez sur Ajouter une stratégie.

  6. Sélectionnez le conteneur que vous souhaitez désactiver.

  7. Dans le champ Modifier le mode de conteneur, sélectionnez Désactiver.

  8. Cliquez sur OK.

  9. Cliquez sur Enregistrer.

gcloud

Pour désactiver des conteneurs spécifiques de l'autoscaling de pods vertical, procédez comme suit :

  1. Enregistrez le manifeste suivant sous le nom my-opt-vpa.yaml :

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: my-opt-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind:       Deployment
        name:       my-opt-deployment
      updatePolicy:
        updateMode: "Auto"
      resourcePolicy:
        containerPolicies:
        - containerName: my-opt-sidecar
          mode: "Off"
    

    Ce fichier manifeste décrit un VerticalPodAutoscaler. La valeur mode: "Off" désactive les recommandations pour le conteneur my-opt-sidecar.

  2. Appliquez le fichier manifeste au cluster :

    kubectl apply -f my-opt-vpa.yaml
    
  3. Enregistrez le manifeste suivant sous le nom my-opt-deployment.yaml :

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-opt-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-opt-deployment
      template:
        metadata:
          labels:
            app: my-opt-deployment
        spec:
          containers:
          - name: my-opt-container
            image: nginx
          - name: my-opt-sidecar
            image: busybox
            command: ["sh","-c","while true; do echo Doing sidecar stuff!; sleep 60; done"]
    
  4. Appliquez le fichier manifeste au cluster :

    kubectl apply -f my-opt-deployment.yaml
    
  5. Après quelque temps, affichez l'autoscaler de pods vertical :

    kubectl get vpa my-opt-vpa --output yaml
    

    La sortie affiche des recommandations pour les demandes de ressources mémoire et de processeur :

    ...
      recommendation:
        containerRecommendations:
        - containerName: my-opt-container
    ...
    

    Sur cette sortie, il n'existe de recommandations que pour un seul conteneur. Il n'existe aucune recommandation pour my-opt-sidecar.

    L'autoscaler de pods verticaux ne met jamais à jour les ressources sur les conteneurs désactivés. Si vous attendez quelques minutes, le pod se recrée, mais les demandes de ressources n'ont été mises à jour que sur un seul conteneur.

Étapes suivantes