Escalar y autoescalar servicios de tiempo de ejecución

Puedes escalar la mayoría de los servicios que se ejecutan en Kubernetes desde la línea de comandos o en una anulación de configuración. Puedes definir parámetros de escalado para los servicios de tiempo de ejecución de Apigee hybrid en el archivo overrides.yaml.

Servicio Implementado como Escalado
Cassandra ApigeeDatastore (CRD) Consulta Escalar Cassandra.
Ingress/LoadBalancer Implementación

Gestionar el escalado con ingressGateways.replicaCountMin y ingressGateways.replicaCountMax.

Logger DaemonSet Los DaemonSets gestionan las réplicas de un pod en todos los nodos, por lo que se escalan cuando se escalan los propios pods.
MART
Apigee Connect
Watcher
ApigeeOrganization (CRD)

Para escalar mediante la configuración, aumenta el valor de la propiedad de configuración replicaCountMin de Deployment en las estrofas mart, watcher o connectAgent. Por ejemplo:

mart:
 replicaCountMax: 2
 replicaCountMin: 1

watcher:
 replicaCountMax: 2
 replicaCountMin: 1

connectAgent:
 replicaCountMax: 2
 replicaCountMin: 1

Estos despliegues usan un autoescalador horizontal de pods para el autoescalado. Asigna a la propiedad targetCPUUtilizationPercentage del objeto Deployment el umbral de escalado vertical. Cuando se supera este valor, Kubernetes añade pods hasta alcanzar el valor de replicaCountMax.

Para obtener más información sobre cómo definir las propiedades de configuración, consulta Gestionar componentes del plano de tiempo de ejecución.

Tiempo de ejecución
Sincronizador
UDCA
ApigeeEnvironment (CRD) Para escalar mediante la configuración, aumenta el valor de la propiedad replicaCountMin de las estrofas udca, synchronizer o runtime en el archivo de anulaciones. Por ejemplo:
synchronizer:
 replicaCountMax: 10
 replicaCountMin: 1

runtime:
 replicaCountMax: 10
 replicaCountMin: 1

udca:
 replicaCountMax: 10
 replicaCountMin: 1

Nota: Estos cambios se aplican a TODOS los entornos del archivo de anulaciones. Si quieres personalizar el escalado de cada entorno, consulta las configuraciones avanzadas que se indican más abajo.

Estos despliegues usan un autoescalador horizontal de pods para el autoescalado. Asigna a la propiedad targetCPUUtilizationPercentage del objeto Deployment el umbral de escalado vertical. Cuando se supera este valor, Kubernetes añade pods hasta alcanzar el valor de replicaCountMax.

Para obtener más información sobre cómo definir las propiedades de configuración, consulta Gestionar componentes del plano de tiempo de ejecución.

Configuración avanzada

En algunos casos, es posible que tengas que usar opciones de escalado avanzadas. Estos son algunos ejemplos:

  • Definir diferentes opciones de escalado para cada entorno. Por ejemplo, si env1 tiene un minReplica de 5 y env2 tiene un minReplica de 2.
  • Definir diferentes opciones de escalado para cada componente de un entorno. Por ejemplo, donde el componente udca tiene un maxReplica de 5 y el componente synchronizer tiene un maxReplica de 2.

En el siguiente ejemplo se muestra cómo usar el comando kubernetes patch para cambiar la propiedad maxReplicas del componente runtime:

  1. Crea variables de entorno para usarlas con el comando:
    export ENV=my-environment-name
    export NAMESPACE=apigee  #the namespace where apigee is deployed
    export COMPONENT=runtime #can be udca or synchronizer
    export MAX_REPLICAS=2
    export MIN_REPLICAS=1
  2. Aplica el parche. Ten en cuenta que en este ejemplo se presupone que kubectl está en tu PATH:
    kubectl patch apigeeenvironment -n $NAMESPACE \
      $(kubectl get apigeeenvironments -n $NAMESPACE -o jsonpath='{.items[?(@.spec.name == "'$ENV'" )]..metadata.name}') \
      --patch "$(echo -e "spec:\n  components:\n    $COMPONENT:\n      autoScaler:\n        maxReplicas: $MAX_REPLICAS\n        minReplicas: $MIN_REPLICAS")" \
      --type merge
  3. Verifica el cambio:
    kubectl get hpa -n $NAMESPACE

Escalado basado en el entorno

De forma predeterminada, el escalado se describe a nivel de organización. Puedes anular los ajustes predeterminados especificando un escalado específico del entorno en el archivo overrides.yaml, como se muestra en el siguiente ejemplo:

envs:
  # Apigee environment name
  - name: test
    components:
    # Environment-specific scaling override
    # Otherwise, uses scaling defined at the respective root component
     runtime:
      replicaCountMin: 2
      replicaCountMax: 20
  

Escalado basado en métricas

Con el escalado basado en métricas, el tiempo de ejecución puede usar métricas de CPU y de aplicaciones para escalar los pods apigee-runtime. La API Horizontal Pod Autoscaler (HPA) de Kubernetes usa el campo hpaBehavior para configurar los comportamientos de escalado vertical y horizontal del servicio de destino. El escalado basado en métricas no está disponible para ningún otro componente de una implementación híbrida.

El escalado se puede ajustar en función de las siguientes métricas:

Métrica Medir Cuestiones importantes
serverNioTaskWaitTime Tiempo de espera medio (en picosegundos) de la cola de procesamiento en instancias de tiempo de ejecución para solicitudes de proxy en la capa http. Esta métrica mide el impacto del número y el tamaño de la carga útil de las solicitudes y respuestas de proxy.
serverMainTaskWaitTime Tiempo de espera medio (en picosegundos) de la cola de procesamiento en instancias de tiempo de ejecución para que las solicitudes de proxy procesen las políticas. Esta métrica mide el impacto de la complejidad en las políticas asociadas al flujo de solicitudes de proxy.

En el siguiente ejemplo de la estrofa runtime del overrides.yaml se muestran los parámetros estándar (y los intervalos permitidos) para escalar pods de apigee-runtime en una implementación híbrida:

hpaMetrics:
      serverMainTaskWaitTime: 400M (300M to 450M)
      serverNioTaskWaitTime: 400M (300M to 450M)
      targetCPUUtilizationPercentage: 75
    hpaBehavior:
      scaleDown:
        percent:
          periodSeconds: 60 (30 - 180)
          value: 20 (5 - 50)
        pods:
          periodSeconds: 60 (30 - 180)
          value: 2 (1 - 15)
        selectPolicy: Min
        stabilizationWindowSeconds: 120 (60 - 300)
      scaleUp:
        percent:
          periodSeconds: 60 (30 - 120)
          value: 20 (5 - 100)
        pods:
          periodSeconds: 60 (30 - 120)
          value: 4 (2 - 15)
        selectPolicy: Max
        stabilizationWindowSeconds: 30 (30 - 120)
  

Configurar un escalado más agresivo

Si aumentas los valores de percent y pods de la política de escalado vertical, esta será más agresiva. Del mismo modo, si aumentas los valores de percent y pods en scaleDown , se aplicará una política de reducción agresiva. Por ejemplo:

hpaMetrics:
    serverMainTaskWaitTime: 400M
    serverNioTaskWaitTime: 400M
    targetCPUUtilizationPercentage: 75
  hpaBehavior:
    scaleDown:
      percent:
        periodSeconds: 60
        value: 20
      pods:
        periodSeconds: 60
        value: 4
      selectPolicy: Min
      stabilizationWindowSeconds: 120
    scaleUp:
      percent:
        periodSeconds: 60
        value: 30
      pods:
        periodSeconds: 60
        value: 5
      selectPolicy: Max
      stabilizationWindowSeconds: 30

En el ejemplo anterior, scaleDown.pods.value se ha aumentado a 5, scaleUp.percent.value se ha aumentado a 30 y scaleUp.pods.value se ha aumentado a 5.

Configurar un escalado menos agresivo

Los valores de configuración de hpaBehavior también se pueden reducir para implementar políticas de ampliación y reducción menos agresivas. Por ejemplo:

hpaMetrics:
    serverMainTaskWaitTime: 400M
    serverNioTaskWaitTime: 400M
    targetCPUUtilizationPercentage: 75
  hpaBehavior:
    scaleDown:
      percent:
        periodSeconds: 60
        value: 10
      pods:
        periodSeconds: 60
        value: 1
      selectPolicy: Min
      stabilizationWindowSeconds: 180
    scaleUp:
      percent:
        periodSeconds: 60
        value: 20
      pods:
        periodSeconds: 60
        value: 4
      selectPolicy: Max
      stabilizationWindowSeconds: 30

En el ejemplo anterior, el scaleDown.percent.value se ha reducido a 10, el scaleDown.pods.value se ha reducido a 1 y el scaleUp.stablizationWindowSeconds se ha aumentado a 180.

Para obtener más información sobre el escalado basado en métricas mediante el campo hpaBehavior, consulta Políticas de escalado.

Inhabilitar el escalado basado en métricas

Aunque el escalado basado en métricas está habilitado de forma predeterminada y no se puede inhabilitar por completo, puedes configurar los umbrales de las métricas a un nivel que no active el escalado basado en métricas. El escalado resultante se comportará igual que el escalado basado en la CPU. Por ejemplo, puedes usar la siguiente configuración para evitar que se active el escalado basado en métricas:

hpaMetrics:
      serverMainTaskWaitTime: 4000M
      serverNioTaskWaitTime: 4000M
      targetCPUUtilizationPercentage: 75
    hpaBehavior:
      scaleDown:
        percent:
          periodSeconds: 60
          value: 10
        pods:
          periodSeconds: 60
          value: 1
        selectPolicy: Min
        stabilizationWindowSeconds: 180
      scaleUp:
        percent:
          periodSeconds: 60
          value: 20
        pods:
          periodSeconds: 60
          value: 4
        selectPolicy: Max
        stabilizationWindowSeconds: 30

Solución de problemas

En esta sección se describen métodos para solucionar problemas habituales que pueden surgir al configurar el escalado y el escalado automático.

HPA muestra unknown para los valores de las métricas

Si el escalado basado en métricas no funciona y el HPA muestra unknown en los valores de las métricas, usa el siguiente comando para comprobar la salida del HPA:

kubectl describe hpa HPA_NAME

Cuando ejecutes el comando, sustituye HPA_NAME por el nombre del HPA que quieras ver.

El resultado mostrará el objetivo de CPU y el uso del servicio, lo que indica que el escalado de CPU funcionará en ausencia de escalado basado en métricas. Para obtener información sobre el comportamiento de HPA con varios parámetros, consulte Escalar en función de varias métricas.