Horizontal Pod Autoscaler

La fonctionnalité de HPA permet de redimensionner les replica en fonction des performances demandés par les pods afin de répondre à une plus forte charge sur un pod donné. Ce système requis que le monitoring des pods soit fonctionnel.

Les métriques sont récupérés toutes les une à deux minutes. La cible du HPA peut être un replicationController, dans ce cas il va agir sur le nombre de replica. La cible peut aussi être un deploymentConfig, dans ce cas, c'est le replica count du deploymentConfig qui sera modifié.

Au niveau de la version Kubernetes utilisé chez Stonecode, deux métriques sont supportés :

  • CPU avec les API :
    • autoscaling/v1
    • autoscaling/v2beta1
  • Mémoire avec l'API :
    • autoscaling/v2beta1
Ce modèle de scaling ne prend en charge que le scaling CPU.

Prenons l'exemple suivant :

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: frontend 
spec:
  scaleTargetRef:
    apiVersion: apps.openshift.io/v1 
    kind: DeploymentConfig 
    name: frontend 
    subresource: scale
  minReplicas: 1 
  maxReplicas: 10 
  targetCPUUtilizationPercentage: 80 

Voici la description des éléments :

Chemin YAML Description
metadata.name Nom du HPA.
spec.scaleTargetRef.apiVersion Version de l'objet à redimensionner. v1 pour ReplicationController ou apps.openshift.io/v1 pour un DeploymentConfig.
spec.scaleTargetRef.kind Type d'objet à redimensionner. Peut être ReplicationController ou DeploymentConfig.
spec.scaleTargetRef.name Le nom de l'objet à redimensionner.
spec.minReplicas Nombre minimum de pods qui doivent être présents.
spec.maxReplicas Nombre maximum de pods.
spec.targetCPUUtilizationPercentage Le pourcentage de CPU que chaque pod doit idéalement utiliser.
Ce type n'est pas pris en charge par Stonecode.

Il manque la configuration suivante dans le fichier master-config.yaml afin d'être pris en charge sur les clusters stonecode :

...
apiServerArguments:
  runtime-config:
  - apis/autoscaling/v2beta1=true
...

Ce fonctionnement ne fonctionne qu'avec la version 2 beta1 de l'API d'autoscaling. Voici un exemple pour la ressource CPU :

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-resource-metrics-memory 
spec:
  scaleTargetRef:
    apiVersion: apps.openshift.io/v1 
    kind: DeploymentConfig 
    name: frontend 
  minReplicas: 2 
  maxReplicas: 10 
  metrics:
  - type: Resource
    resource:
      name: memory
      targetAverageUtilization: 50 

Pour la partie mémoire, le spec.metrics va changer pour le code suivant :

spec:
  metrics:
  - type: Resource
    resource:
      name: memory
      targetAverageUtilization: 50 
Ce type de scaling est à utiliser avec prudence. Il faut bien que l'application libère la mémoire quand elle a moins de charge. Dans le cas contraire, le redimensionnement peut rester bloqué sur sa valeur haute, notamment en cas de memory leak.

Monitoring

Afin d'avoir une vue d'ensemble des HPA, il est possible d'utiliser la commande suivante :

oc get hpa/hpa-resource-metrics-cpu

La commande affichera un tableau comme le suivant :

NAME                         REFERENCE                                 TARGET    CURRENT  MINPODS        MAXPODS    AGE
hpa-resource-metrics-cpu     DeploymentConfig/default/frontend/scale   80%       79%      1              10         8d

Pour plus de détails, la commande suivante permet de voir les conditions de scaling :

oc describe hpa/hpa-resource-metrics-cpu

La commande affichera les détails comme suit :

Name:                           hpa-resource-metrics-cpu
Namespace:                      default
Labels:                         <none>
CreationTimestamp:              Mon, 26 Oct 2015 21:13:47 -0400
Reference:                      DeploymentConfig/default/frontend/scale
Target CPU utilization:         80% 
Current CPU utilization:        79% 
Min replicas:                   1 
Max replicas:                   4 
ReplicationController pods:     1 current / 1 desired
Conditions: 
  Type                  Status  Reason                  Message
  ----                  ------  ------                  -------
  AbleToScale           True    ReadyForNewScale        the last scale time was sufficiently old as to warrant a new scale
  ScalingActive         True    ValidMetricFound        the HPA was able to successfully calculate a replica count from pods metric http_requests
  ScalingLimited        False   DesiredWithinRange      the desired replica count is within the acceptable range
Events:

On peut facilement identifier la limite de CPU, l'usage CPU courant, le minimum et maximum de replicas ainsi que le nombre actuel de replicas désiré et en ligne. Les conditions affichés correspondent à l'état actuel du système de redimentionnement.

Condition Signification
AbleToScale Indique si le HPA peut actuellement effectuer le redimentionnement. La valeur doit être vrai. En cas de problème, la raison est indiquée.
ScalingActive Indique si le scaling est activé (replica count supérieur à 0 et il est possible de calculer le nombre de pods nécessaires). Une valeur à faux indique généralement un problème de récupération des metrics.
ScalingLimited Indique si le maximum ou le minimum de replica est atteint, empêchant de continuer le redimensionement.