Présentation brève du Horizontal Pod Autoscaler (HPA) pour une étude future
Dans cette étape, vous allez découvrir le Horizontal Pod Autoscaler (HPA), une fonctionnalité puissante de Kubernetes qui permet de mettre à l'échelle automatiquement les applications en fonction de l'utilisation des ressources. L'HPA vous permet de définir des règles de mise à l'échelle basées sur des métriques telles que l'utilisation du CPU, l'utilisation de la mémoire ou même des métriques personnalisées.
Comprendre l'HPA :
L'HPA ajuste automatiquement le nombre de réplicas de pods en cours d'exécution dans un déploiement (Deployment), un ReplicaSet ou un StatefulSet en fonction de l'utilisation observée du CPU ou de la mémoire, ou en fonction de métriques personnalisées fournies par vos applications. Cela garantit que votre application peut être mise à l'échelle automatiquement pour gérer les charges de trafic changeantes, améliorant ainsi les performances et la disponibilité.
Activer l'addon metrics server dans Minikube :
minikube addons enable metrics-server
Exemple de sortie :
* L'addon 'metrics-server' est activé
Le serveur de métriques fournit à Kubernetes des données d'utilisation de vos ressources et il est essentiel pour le bon fonctionnement de l'HPA.
Créer un déploiement avec des demandes de ressources :
nano ~/project/k8s-manifests/hpa-example.yaml
Ajouter le contenu suivant :
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: k8s.gcr.io/hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
Appliquer le déploiement :
kubectl apply -f ~/project/k8s-manifests/hpa-example.yaml
Explication de la configuration YAML :
- Ce fichier YAML définit un déploiement pour une application PHP et le service correspondant.
- La configuration du déploiement est très similaire à celle de NGINX, à l'exception de :
name: php-apache : Le nom du déploiement et du conteneur de pod.
image: k8s.gcr.io/hpa-example : L'image Docker pour le conteneur.
resources : Cette section spécifie les besoins en ressources du conteneur.
limits.cpu: 500m : Le nombre maximal de CPU autorisé pour le conteneur.
requests.cpu: 200m : Le nombre de CPU garanti alloué au conteneur.
- Le service est une configuration de service standard, exposant le déploiement en interne.
Créer une configuration HPA :
nano ~/project/k8s-manifests/php-apache-hpa.yaml
Ajouter le manifeste HPA suivant :
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
Appliquer la configuration HPA :
kubectl apply -f ~/project/k8s-manifests/php-apache-hpa.yaml
Explication de la configuration YAML :
apiVersion: autoscaling/v2 : Spécifie la version de l'API pour le HorizontalPodAutoscaler.
kind: HorizontalPodAutoscaler : Indique qu'il s'agit d'un objet HPA.
metadata : Contient les métadonnées de l'HPA.
name: php-apache : Le nom de l'HPA.
spec : Contient la spécification de l'HPA.
scaleTargetRef : Définit le déploiement cible qui sera mis à l'échelle.
apiVersion: apps/v1 : La version de l'API de la ressource cible.
kind: Deployment : Le type de ressource cible, qui est un déploiement.
name: php-apache : Le nom du déploiement cible à mettre à l'échelle.
minReplicas: 1 : Le nombre minimum de réplicas à maintenir en cours d'exécution.
maxReplicas: 10 : Le nombre maximum de réplicas jusqu'auquel on peut monter.
metrics : Définit comment déterminer les métriques de mise à l'échelle.
type: Resource : Mise à l'échelle basée sur une métrique de ressource.
resource.name: cpu : Mise à l'échelle basée sur l'utilisation du CPU.
resource.target.type: Utilization : Mise à l'échelle basée sur un pourcentage du CPU demandé par le pod.
resource.target.averageUtilization: 50 : Mise à l'échelle lorsque l'utilisation moyenne du CPU sur tous les pods dépasse 50 % des demandes.
Vérifier la configuration HPA :
kubectl get hpa
Exemple de sortie :
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 30s
Simuler une charge et observer la mise à l'échelle automatique en temps réel
Pour simuler une charge élevée et déclencher l'autoscaler, vous allez exécuter un générateur de charge dans un terminal et surveiller l'activité de mise à l'échelle dans un autre terminal.
Tout d'abord, ouvrez un terminal pour le générateur de charge :
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
NE PAS FERMER le terminal avec le générateur de charge. OUVRIR UN AUTRE TERMINAL pour surveiller l'activité de mise à l'échelle.
Dans le deuxième terminal, vous pouvez utiliser plusieurs commandes pour observer la mise à l'échelle automatique en temps réel :
- Surveiller l'état de l'HPA (mise à jour toutes les quelques secondes) :
kubectl get hpa -w
- Observer la création des pods lors de la montée en échelle de l'HPA :
kubectl get pods -w
- Suivre les événements liés à l'activité de mise à l'échelle :
kubectl get events --sort-by='.lastTimestamp' -w
Vous pouvez exécuter n'importe quelle de ces commandes pour observer différents aspects du processus de mise à l'échelle automatique. Par exemple, observer les pods avec le flag -w vous montre les pods étant créés en temps réel lorsque le système monte en échelle :
Exemple de sortie pour kubectl get pods -w :
NAME READY STATUS RESTARTS AGE
php-apache-xxxxxxxxx-xxxxx 1/1 Running 0 2m
load-generator 1/1 Running 0 30s
php-apache-xxxxxxxxx-yyyyy 0/1 Pending 0 0s
php-apache-xxxxxxxxx-yyyyy 0/1 ContainerCreating 0 0s
php-apache-xxxxxxxxx-yyyyy 1/1 Running 0 3s
php-apache-xxxxxxxxx-zzzzz 0/1 Pending 0 0s
php-apache-xxxxxxxxx-zzzzz 0/1 ContainerCreating 0 0s
php-apache-xxxxxxxxx-zzzzz 1/1 Running 0 2s
Vous verrez l'HPA répondre à l'augmentation de la charge en augmentant le nombre de pods. La mise à jour des métriques peut prendre une minute ou plus pour refléter les changements :
Exemple de sortie pour kubectl get hpa -w :
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 30s
php-apache Deployment/php-apache 68%/50% 1 10 1 90s
php-apache Deployment/php-apache 68%/50% 1 10 2 90s
php-apache Deployment/php-apache 79%/50% 1 10 2 2m
php-apache Deployment/php-apache 79%/50% 1 10 4 2m15s
Une fois que vous avez terminé d'observer, appuyez sur Ctrl+C pour arrêter la commande de surveillance, puis revenez au premier terminal et appuyez sur Ctrl+C pour arrêter le générateur de charge.
Points clés sur l'HPA :
- Met automatiquement à l'échelle les pods en fonction de l'utilisation des ressources, ce qui améliore la résilience de l'application.
- Peut être mis à l'échelle en fonction du CPU, de la mémoire ou de métriques personnalisées.
- Définit les nombres minimum et maximum de réplicas, garantissant une mise à l'échelle équilibrée et efficace.
- L'HPA est un composant crucial pour maintenir les performances et la disponibilité de l'application sous des charges variables.
- L'utilisation du flag
-w (watch) avec les commandes kubectl permet de surveiller en temps réel les changements dans le cluster.