Utilisation du VPA (Vertical Pod Autoscaler) de Kubernetes

Découvrez comment utiliser le VPA de Kubernetes pour ajuster automatiquement les demandes et les limites de ressources pour les conteneurs s'exécutant dans des pods d'une grappe que vous avez créée à l'aide de Kubernetes Engine (OKE).

Note

Vous ne pouvez pas utiliser le VPA de Kubernetes avec les groupes de noeuds virtuels.
Vous pouvez utiliser le VPA de Kubernetes pour ajuster automatiquement les demandes et les limites de ressources pour les conteneurs exécutés dans les pods d'un déploiement. Le VPA peut améliorer l'utilisation des ressources des grappes en :
  • Définissant automatiquement les demandes en fonction de l'utilisation pour garantir que la quantité de ressources appropriée est disponible pour chaque pod.
  • Tenant à jour les rapports entre les limites et les demandes spécifiées dans les configurations initiales des conteneurs.
  • Mettant à l'échelle à la baisse les pods qui demandent trop de ressources, en fonction de leur utilisation au fil du temps.
  • Mettant à l'échelle à la hausse les pods qui ne demandent pas assez de ressources, en fonction de leur utilisation au fil du temps.

Le VPA comporte trois composants :

  • Recommender : Surveille la consommation courante et passée des ressources et fournit des valeurs de demande d'UC et de mémoire recommandées pour un conteneur.
  • Updater : Vérifie les pods dont les ressources sont incorrectes et les supprime, afin qu'ils puissent être recréés avec des valeurs de demande mises à jour.
  • Admission Plugin : Définit les demandes de ressources correctes pour les nouveaux pods (qui viennent d'être créés ou recréés par leur contrôleur en raison des modifications apportées par l'outil Updater).

Pour plus d'informations, voir Vertical Pod Autoscaler Managing Resources for Containers dans la documentation sur Kubernetes.

Vous configurez le VPA à l'aide de l'objet de définition de ressource personnalisée VerticalPodAutoscaler. L'objet VerticalPodAutoscaler vous permet de spécifier les pods à ajuster verticalement et les recommandations de ressources à appliquer (éventuellement). Pour plus d'informations, voir VerticalPodAutoscaler et Custom Resource Definition object dans la documentation sur Kubernetes.

Le VPA nécessite l'installation d'une source de mesures, telle que le serveur de mesures Kubernetes, dans la grappe. Pour plus d'informations, voir Déploiement du serveur de mesures Kubernetes sur une grappe.

Remplacement des intervalles de limites

Le VPA tente de formuler des recommandations comprises entre les valeurs minimales et maximales spécifiées pour un intervalle de limites, si un tel intervalle a été défini. Toutefois, si l'intervalle de limites applicable est en conflit avec les valeurs spécifiées dans la section resourcePolicy du manifeste VerticalPodAutoscaler, le VPA accorde la priorité à la politique de ressources et formule des recommandations en conséquence (même si les valeurs ne sont pas comprises dans l'intervalle de limites). Pour plus d'informations, voir Limit Ranges et Resource Policy Overriding Limit Range dans la documentation sur Kubernetes.

Création de recommandations sans les appliquer

Vous pouvez utiliser le VPA pour créer et appliquer des recommandations, ou simplement pour créer des recommandations (sans mettre à jour les pods). Pour simplement créer des recommandations sans les appliquer, définissez updateMode: "Off" dans la section updatePolicy du manifeste VerticalPodAutoscaler.

Lorsque des pods sont créés, le VPA analyse les besoins en UC et en mémoire des conteneurs et enregistre ces recommandations dans le champ Status. Le VPA ne prend aucune mesure pour mettre à jour les demandes de ressources pour les conteneurs en cours d'exécution.

Exclusion de conteneurs spécifiques

Vous pouvez utiliser le VPA pour créer des recommandations et les appliquer à tous les conteneurs d'un pod, ou vous pouvez exclure des conteneurs sélectionnés. Pour désactiver les recommandations pour un conteneur donné, dans la section resourcePolicy du manifeste VerticalPodAutoscaler, spécifiez un containerName et définissez mode: "Off" dans la section containerPolicies.

Notes sur le VPA (Vertical Pod Autoscaler)

Notez ce qui suit :

  • Actuellement, il est recommandé de ne pas utiliser le VPA avec le HPA pour les mesures d'utilisation de l'UC ou de la mémoire. Cependant, notez que vous pouvez utiliser le VPA avec le HPA pour des mesures personnalisées et externes. Voir Prise en charge des mesures personnalisées dans la documentation sur Kubernetes.
  • Les recommandations du VPA peuvent dépasser les ressources disponibles (par exemple, taille de noeud, taille disponible, quota disponible). Notez que l'application des recommandations peut entraîner la mise en attente des pods.
  • Chaque fois que le VPA met à jour les ressources du pod, le pod est recréé, ce qui provoque le redémarrage de tous les conteneurs en cours d'exécution. Notez que le pod peut être recréé sur un noeud différent.
  • Vous pouvez utiliser le VPA de Kubernetes avec les groupes de noeuds gérés, mais pas avec les groupes de noeuds virtuels.

Utilisation du VPA (Vertical Pod Autoscaler)

Les instructions ci-dessous vous guident lors du déploiement du VPA dans une grappe. Elles décrivent comment :

  • Vérifier que le serveur de mesures Kubernetes a été installé dans une grappe.
  • Télécharger et déployer le VPA.
  • Déployer un exemple d'application.
  • Consulter l'opération d'ajustement en action.
  • Consulter la recommandation.
  • Procéder au nettoyage, en supprimant l'exemple d'application et le VPA.

Étape 1 : Vérifier l'installation du serveur de mesures Kubernetes

  1. Si vous ne l'avez pas encore fait, suivez les étapes pour configurer le fichier de configuration kubeconfig de la grappe et (s'il y a lieu) définissez la variable d'environnement KUBECONFIG pour qu'elle pointe vers le fichier. Notez que vous devez configurer votre propre fichier kubeconfig. Vous ne pouvez pas accéder à une grappe à l'aide d'un fichier kubeconfig configuré par un autre utilisateur. Voir Configuration de l'accès aux grappes.
  2. Vérifiez que le serveur de mesures Kubernetes a été déployé dans la grappe et qu'il est disponible en entrant :

    kubectl -n kube-system get deployment/metrics-server

    Si la commande retourne une erreur indiquant que le serveur est introuvable, vous devez déployer le serveur de mesures Kubernetes dans la grappe avant de continuer. Voir Déploiement du serveur de mesures Kubernetes sur une grappe.

Étape 2 : Télécharger et déployer le VPA

  1. Téléchargez le code source du VPA à partir de GitHub. Par exemple, en entrant :
    git clone -b vpa-release-0.8 https://github.com/kubernetes/autoscaler.git
  2. Accédez au répertoire vertical-pod-autoscaler :

    cd autoscaler/vertical-pod-autoscaler
  3. Si vous avez déjà déployé le VPA, supprimez-le en entrant :
    ./hack/vpa-down.sh
  4. Déployez le VPA en entrant :

    ./hack/vpa-up.sh
  5. Vérifiez que les pods du VPA ont été créés en entrant :

    kubectl get pods -n kube-system

    La sortie de la commande ci-dessus montre les pods :

    vpa-admission-controller-59d9965cfb-bzs8l 1/1 Running 0 6m34s
    vpa-recommender-5bcb58569-mqdds 1/1 Running 0 6m43s
    vpa-updater-5979cbf757-scw2d 1/1 Running 0 6m46s

    Notez que vous verrez probablement des noms et des numéros différents.

Étape 3 : Déployer l'exemple d'application

  1. Déployez l'exemple d'application hamster pour créer un déploiement et un VPA correspondant en entrant :
    kubectl apply -f examples/hamster.yaml

    La sortie de la commande ci-dessus confirme le déploiement et la création :

    verticalpodautoscaler.autoscaling.k8s.io/hamster-vpa created
    deployment.apps/hamster created

    Le déploiement de l'application hamster crée un déploiement avec deux pods et un VPA pointant vers le déploiement.

  2. Vérifiez que les pods de l'application hamster ont été créés en entrant :
    kubectl get pods -l app=hamster

    La sortie de la commande ci-dessus confirme la création :

    NAME                     READY STATUS  RESTARTS AGE
    hamster-7cbfd64f57-mqqnk 1/1   Running 0        54s
    hamster-7cbfd64f57-rq6wv 1/1   Running 0        55s

    Notez que vous verrez probablement des noms différents pour les pods de l'application hamster.

  3. Consultez les réservations d'UC et de mémoire à l'aide de la commande kubectl describe pod et de l'un des noms de pod de l'application hamster retournés à l'étape précédente. Par exemple :
    kubectl describe pod hamster-7cbfd64f57-rq6wv

    Notez que la commande ci-dessus n'est qu'un exemple. Vous devez utiliser l'un des noms de pod de l'application hamster retournés lorsque vous avez exécuté la commande kubectl get pods -l app=hamster à l'étape précédente.

    Dans la section de demandes de la sortie, vous pouvez voir les réservations d'UC et de mémoire courantes du pod. Par exemple :

    Requests:
          cpu:        100m
          memory:     50Mi

    Le VPA (en particulier, l'outil Recommender) analyse les pods et observe leur comportement pour déterminer si ces réservations d'UC et de mémoire sont appropriées. Notez que les réservations d'UC et de mémoire affichées peuvent être différentes.

    Les réserves ne sont pas suffisantes parce que les ressources de l'exemple d'application hamster sont volontairement insuffisantes. Chaque pod exécute un conteneur unique qui :

    • demande 100 millicoeurs, mais tente d'utiliser plus de 500 millicoeurs
    • réserve beaucoup moins de mémoire que ce dont il a besoin pour s'exécuter

Étape 4 : Consulter l'opération d'ajustement

Après avoir analysé les pods initiaux dans l'exemple d'application hamster et déterminé que les réservations d'UC et de mémoire étaient inadéquates, le VPA (en particulier, l'outil Updater) relance les pods avec des valeurs différentes, selon les propositions de l'outil Recommender. Notez que le VPA ne modifie pas le modèle dans le déploiement, mais qu'il met à jour les demandes réelles des pods.

  1. Surveillez les pods dans l'exemple d'application hamster et attendez que l'outil Updater démarre un nouveau pod de l'application hamster avec un nouveau nom, en entrant :
    kubectl get --watch pods -l app=hamster
  2. Lorsque vous voyez qu'une nouveau pod de l'application hamster a démarré, consultez ses réservations d'UC et de mémoire à l'aide de la commande kubectl describe pod et du nom du pod. Par exemple :
    kubectl describe pod hamster-7cbfd64f57-wmg4

    Dans la section de demandes de la sortie, vous pouvez voir les réservations d'UC et de mémoire du nouveau pod.

        Requests:
          cpu:        587m
          memory:     262144k

    Dans l'exemple ci-dessus, notez que la réservation d'UC est passée à 587 millicoeurs et que la réservation de mémoire est passée à 262 144 Ko. Les ressources du pod initial étaient insuffisantes et le VPA a corrigé les réservations initiales en appliquant des valeurs plus appropriées. Notez que les réservations d'UC et de mémoire affichées peuvent être différentes.

Étape 5 : Consulter la recommandation

Consultez les recommandations fournies par le VPA (en particulier, l'outil Recommender) en entrant :

kubectl describe vpa/hamster-vpa

La sortie de la commande ci-dessus montre les recommandations :

Name:         hamster-vpa
Namespace:    default
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"autoscaling.k8s.io/v1beta2","kind":"VerticalPodAutoscaler","metadata":{"annotations":{},"name":"hamster-vpa","namespace":"d...
API Version:  autoscaling.k8s.io/v1
Kind:         VerticalPodAutoscaler
Metadata:
  Creation Timestamp:  2020-09-22T18:08:09Z
  Generation:          27
  Resource Version:    19466955
  Self Link:           /apis/autoscaling.k8s.io/v1/namespaces/default/verticalpodautoscalers/hamster-vpa
  UID:                 689cee90-6fed-404d-adf9-b6fa8c1da660
Spec:
  Resource Policy:
    Container Policies:
      Container Name:  *
      Controlled Resources:
        cpu
        memory
      Max Allowed:
        Cpu:     1
        Memory:  500Mi
      Min Allowed:
        Cpu:     100m
        Memory:  50Mi
  Target Ref:
    API Version:  apps/v1
    Kind:         Deployment
    Name:         hamster
  Update Policy:
    Update Mode:  Auto
Status:
  Conditions:
    Last Transition Time:  2020-09-22T18:10:10Z
    Status:                True
    Type:                  RecommendationProvided
  Recommendation:
    Container Recommendations:
      Container Name:  hamster
      Lower Bound:
        Cpu:     519m
        Memory:  262144k
      Target:
        Cpu:     587m
        Memory:  262144k
      Uncapped Target:
        Cpu:     587m
        Memory:  262144k
      Upper Bound:
        Cpu:     1
        Memory:  500Mi
Events:          <none>

Notez que vous pouvez voir des recommandations différentes.

Étape 6 : Nettoyer

  1. Supprimez l'exemple d'application en entrant :
    kubectl delete -f examples/hamster.yaml
  2. Dans le répertoire vertical-pod-autoscaler, supprimez le déploiement du VPA en entrant :

    ./hack/vpa-down.sh