Tous les produits
Search
Centre de documentation

Container Service for Kubernetes:Activer la mise à l'échelle automatique pour absorber les fluctuations de trafic

Dernière mise à jour :Aug 11, 2026

Configurez Knative Pod Autoscaler (KPA) pour mettre à l'échelle les pods Knative Serving en fonction de la concurrence ou des RPS sur ACK.

Prérequis

Avant de commencer, vérifiez que :

Fonctionnement

Knative Serving injecte un conteneur sidecar queue-proxy dans chaque pod. Le sidecar transmet les métriques de concurrence au KPA, qui ajuste le nombre de pods en fonction de ces métriques et de l'algorithme configuré.

image

Algorithme de mise à l'échelle

Le KPA calcule le nombre cible de pods à l'aide de la formule suivante :

Number of pods = Number of concurrent requests / (Pod maximum concurrency × Target utilization)

Exemple : Avec containerConcurrency défini sur 10 et une utilisation cible de 70 %, 100 requêtes simultanées produisent : 100 / (10 × 0,7) = 15 pods (arrondi supérieur).

Modes stable et panique

Le KPA utilise deux modes pour répondre aux variations de trafic :

Mode stable — mode par défaut. Le KPA fait la moyenne de la concurrence sur tous les pods pendant la fenêtre stable (par défaut : 60 s) et ajuste le nombre de pods en conséquence.

Mode panique — déclenché lors de pics de trafic. Le KPA utilise une fenêtre de panique plus courte (par défaut : 6 s ; stable window × panic-window-percentage) pour détecter les pics. Lorsque le nombre de pods en mode panique ≥ panic-threshold-percentage / 100 × pods prêts (par défaut : 2×), le KPA utilise le compte de panique au lieu du compte stable.

Configurer la ConfigMap config-autoscaler

Les valeurs par défaut globales du KPA se trouvent dans la ConfigMap config-autoscaler du namespace knative-serving. Les annotations par révision remplacent ces valeurs par défaut.

Consultez la configuration actuelle :

kubectl -n knative-serving describe cm config-autoscaler

Le tableau suivant répertorie les paramètres clés. Toutes les valeurs indiquées sont des valeurs par défaut.

Paramètre Par défaut Description
container-concurrency-target-default 100 Nombre maximal de requêtes simultanées par pod (limite souple, globale)
container-concurrency-target-percentage 70 Pourcentage d'utilisation cible pour la mise à l'échelle basée sur la concurrence
requests-per-second-target-default 200 RPS cible par pod
target-burst-capacity 211 Capacité de burst avant que l'Activator ne mette les requêtes en tampon. 0 : Activator uniquement à l'échelle zéro. Supérieur à 0 avec container-concurrency-target-percentage à 100 : utiliser toujours l'Activator. -1 : illimité.
stable-window 60s Fenêtre temporelle pour la moyenne en mode stable
panic-window-percentage 10.0 Fenêtre de panique en pourcentage de la fenêtre stable (par défaut : 6 s)
panic-threshold-percentage 200.0 La panique se déclenche lorsque les pods souhaités ≥ panic-threshold-percentage / 100 × pods prêts
max-scale-up-rate 1000.0 Ratio maximal de pods souhaités par événement de montée en charge : ceil(max-scale-up-rate × readyPodsCount)
max-scale-down-rate 2.0 La réduction de capacité des pods atteint au maximum la moitié du nombre actuel par activité
enable-scale-to-zero true Indique s'il faut réduire à zéro le nombre de pods des services inactifs
scale-to-zero-grace-period 30s Temps maximal alloué à la programmation réseau lors de la réduction à zéro
scale-to-zero-pod-retention-period 0s Durée minimale pendant laquelle le dernier pod est conservé après l'arrêt du trafic
pod-autoscaler-class kpa.autoscaling.knative.dev Type d'autoscaler. Valeurs prises en charge : kpa.autoscaling.knative.dev, hpa.autoscaling.knative.dev, aha.autoscaling.knative.dev. Utilisez mpa avec MSE dans les clusters ACK Serverless pour réduire à zéro.
activator-capacity 100.0 Capacité de requête du service Activator
initial-scale 1 Nombre initial de pods par révision
allow-zero-initial-scale false Indique si une révision peut démarrer avec zéro pod
min-scale 0 Nombre minimal de pods par révision (0 = aucun plancher)
max-scale 0 Nombre maximal de pods par révision (0 = illimité)
scale-down-delay 0s Délai à concurrence réduite avant la réduction de capacité. Contrairement à min-scale, les pods finissent par être réduits après le délai. Évite les démarrages à froid lors de courtes accalmies de trafic.
Important

scale-to-zero-grace-period limite la durée pendant laquelle la programmation réseau peut avoir lieu lors de la réduction à zéro. Ajustez ce paramètre uniquement si vous constatez des requêtes abandonnées lors de la réduction à zéro ; cela ne contrôle pas la durée pendant laquelle le dernier pod reste actif. Pour conserver le dernier pod après la fin du trafic, utilisez plutôt scale-to-zero-pod-retention-period.

Configurer les métriques de mise à l'échelle

Définissez la métrique de mise à l'échelle par révision avec l'annotation autoscaling.knative.dev/metric. Par défaut : concurrency.

Métrique Classe d'autoscaler requise Description
concurrency kpa.autoscaling.knative.dev (par défaut) Requêtes simultanées en cours par pod
rps kpa.autoscaling.knative.dev (par défaut) Requêtes par seconde par pod
cpu hpa.autoscaling.knative.dev Utilisation du CPU
memory hpa.autoscaling.knative.dev Utilisation de la mémoire
Métriques personnalisées Varie Métriques personnalisées selon les exigences de l'application

Métrique de concurrence (par défaut)

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/metric: "concurrency"

Métrique RPS

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/metric: "rps"

Métrique CPU

La mise à l'échelle basée sur le CPU nécessite la classe d'autoscaler HPA.

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/class: "hpa.autoscaling.knative.dev"
        autoscaling.knative.dev/metric: "cpu"

Métrique de mémoire

La mise à l'échelle basée sur la mémoire nécessite également la classe d'autoscaler HPA.

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/class: "hpa.autoscaling.knative.dev"
        autoscaling.knative.dev/metric: "memory"

Configurer les cibles de mise à l'échelle

Les cibles de mise à l'échelle définissent la valeur de métrique que le KPA maintient par pod. Configurez-les par révision ou globalement.

Cible de concurrence

Par révision — utilisez autoscaling.knative.dev/target :

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/target: "50"

Globalement — mettez à jour la ConfigMap config-autoscaler :

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  container-concurrency-target-default: "200"

Cible RPS

Par révision :

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/target: "150"
        autoscaling.knative.dev/metric: "rps"
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56

Globalement :

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  requests-per-second-target-default: "150"

Configurer les limites de concurrence

Les limites de concurrence plafonnent les requêtes simultanées par pod. Le KPA prend en charge deux types de limites.

Limite de concurrence souple

Une limite souple est la cible vers laquelle le KPA effectue la mise à l'échelle. Elle n'est pas strictement appliquée : les bursts peuvent la dépasser momentanément.

Par révision :

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/target: "200"

Globalement :

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  container-concurrency-target-default: "200"

Limite de concurrence stricte

Une limite stricte est appliquée rigoureusement : les requêtes excédentaires sont mises en tampon. Définissez une limite stricte uniquement lorsque votre application possède une limite supérieure ferme en matière de concurrence ; des valeurs faibles réduisent le débit et augmentent la latence.

Par révision — utilisez le champ de spécification containerConcurrency (et non une annotation) :

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    spec:
      containerConcurrency: 50

Utilisation cible

L'utilisation cible contrôle le niveau de remplissage des pods avant que le KPA n'effectue une montée en charge. À 70 % d'utilisation avec containerConcurrency: 10, le KPA crée un nouveau pod lorsque la concurrence moyenne sur les pods existants atteint 7. Des valeurs plus faibles incitent le KPA à effectuer une montée en charge plus tôt, réduisant ainsi la latence de démarrage à froid.

Par révision :

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/target-utilization-percentage: "70"
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56

Globalement :

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  container-concurrency-target-percentage: "70"

Configurer la réduction à zéro

Activer ou désactiver la réduction à zéro globalement

Définissez enable-scale-to-zero sur "false" pour maintenir au moins un pod en cours d'exécution lorsqu'un service est inactif :

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  enable-scale-to-zero: "false"

Configurer la période de grâce de réduction à zéro

scale-to-zero-grace-period limite la durée pendant laquelle la programmation réseau peut avoir lieu lors de la réduction à zéro.

Avertissement

Augmentez cette valeur uniquement si vous constatez des requêtes abandonnées lors de la réduction à zéro. Cela ne contrôle pas la durée pendant laquelle le dernier pod reste actif. Pour conserver le dernier pod, utilisez plutôt scale-to-zero-pod-retention-period.

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  scale-to-zero-grace-period: "40s"

Configurer la période de rétention des pods

scale-to-zero-pod-retention-period conserve le dernier pod pendant une durée minimale après l'arrêt du trafic, évitant ainsi les démarrages à froid sur les services au trafic intermittent.

Par révision :

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/scale-to-zero-pod-retention-period: "1m5s"
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56

Globalement :

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  scale-to-zero-pod-retention-period: "42s"

Configurer les limites de mise à l'échelle

Les limites de mise à l'échelle définissent les nombres minimal et maximal de réplicas pour une révision.

Annotation Paramètre (global) Objectif
autoscaling.knative.dev/min-scale min-scale Plancher — le KPA ne réduit jamais en dessous de ce nombre
autoscaling.knative.dev/max-scale max-scale Plafond — le KPA ne dépasse jamais ce nombre (0 = illimité)
min-scale maintient un plancher permanent de pods. Pour retarder la réduction de capacité sans plancher permanent, utilisez scale-down-delay dans config-autoscaler à la place — les pods finiront par être réduits après le délai.

Exemples

Exemple 1 : Mise à l'échelle par cible de concurrence

Déployez une application avec mise à l'échelle automatique avec une cible de concurrence de 10 et testez avec 50 requêtes simultanées.

  1. Déployez Knative dans un cluster ACK ou un cluster ACK Serverless.

  2. Créez autoscale-go.yaml avec le contenu suivant :

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: autoscale-go
      namespace: default
    spec:
      template:
        metadata:
          labels:
            app: autoscale-go
          annotations:
            autoscaling.knative.dev/target: "10"  # Concurrency target: 10 requests per pod
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/autoscale-go:0.1
  3. Appliquez le manifeste :

    kubectl apply -f autoscale-go.yaml
  4. Obtenez l'adresse de la passerelle Ingress. ALB :

    kubectl get albconfig knative-internet

    Sortie attendue :

    NAME               ALBID                    DNSNAME                                              PORT&PROTOCOL   CERTID   AGE
    knative-internet   alb-hvd8nngl0lsdra15g0   alb-hvd8nng******.cn-beijing.alb.aliyuncs.com                            2

    MSE :

    kubectl -n knative-serving get ing stats-ingress

    Sortie attendue :

    NAME            CLASS                  HOSTS   ADDRESS                         PORTS   AGE
    stats-ingress   knative-ingressclass   *       101.201.XX.XX,192.168.XX.XX   80      15d

    ASM :

    kubectl get svc istio-ingressgateway --namespace istio-system --output jsonpath="{.status.loadBalancer.ingress[*]['ip']}"

    Sortie attendue :

    121.XX.XX.XX

    Kourier :

    kubectl -n knative-serving get svc kourier

    Sortie attendue :

    NAME      TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)                      AGE
    kourier   LoadBalancer   10.0.XX.XX    39.104.XX.XX     80:31133/TCP,443:32515/TCP   49m
  5. Envoyez 50 requêtes simultanées pendant 30 secondes avec hey :

    hey -z 30s -c 50 \
      -host "autoscale-go.default.example.com" \
      "http://121.199.XXX.XXX"  # Replace with your Ingress gateway address

    Sortie attendue : le KPA ajoute 5 pods : 50 requêtes simultanées ÷ cible de 10 = 5 pods.

    hey

Exemple 2 : Mise à l'échelle avec limites

Ajoutez min-scale: 1 et max-scale: 3 pour maintenir un pod en cours d'exécution et limiter le déploiement à trois pods.

  1. Déployez Knative dans un cluster ACK ou un cluster ACK Serverless.

  2. Créez autoscale-go.yaml avec le contenu suivant :

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: autoscale-go
      namespace: default
    spec:
      template:
        metadata:
          labels:
            app: autoscale-go
          annotations:
            autoscaling.knative.dev/target: "10"
            autoscaling.knative.dev/min-scale: "1"  # Keep at least 1 pod running
            autoscaling.knative.dev/max-scale: "3"  # Cap at 3 pods
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/autoscale-go:0.1
  3. Appliquez le manifeste :

    kubectl apply -f autoscale-go.yaml
  4. Obtenez l'adresse de la passerelle Ingress (Exemple 1, étape 4).

  5. Envoyez 50 requêtes simultanées pendant 30 secondes :

    hey -z 30s -c 50 \
      -host "autoscale-go.default.example.com" \
      "http://121.199.XXX.XXX"  # Replace with your Ingress gateway address

    Sortie attendue : le KPA passe à 3 pods (maximum) pendant la charge, puis revient à 1 pod (minimum) — aucun démarrage à froid lors de la prochaine requête.

    scale bounds

Étapes suivantes