Развертывание Kubernetes не уменьшается даже при использовании ниже порогового значения

Мне сложно понять, что происходит с моим горизонтальным автоматическим масштабированием модуля.

Я пытаюсь увеличить масштаб развертывания, если использование памяти или процессора превышает 80%.

Вот мой шаблон HPA:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: my-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 80
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 80

Дело в том, что он сидел на 3 репликах в течение нескольких дней, хотя загрузка ниже 80%, и я не понимаю, почему.

$ kubectl get hpa --all-namespaces

NAMESPACE        NAME             REFERENCE                  TARGETS            MINPODS   MAXPODS   REPLICAS   AGE
my-ns            my-hpa           Deployment/my-deployment   61%/80%, 14%/80%   2         10        3          2d15h

Вот вывод команды top:

$ kubectl top pods

NAME                             CPU(cores)   MEMORY(bytes)   
my-deployment-86874588cc-chvxq   3m           146Mi           
my-deployment-86874588cc-gkbg9   5m           149Mi           
my-deployment-86874588cc-nwpll   7m           149Mi   

Каждый модуль потребляет примерно 60% запрошенной памяти (таким образом, они ниже целевого показателя 80%):

resources:
  requests:
    memory: "256Mi"
    cpu: "100m"
  limits:
    memory: "512Mi"
    cpu: "200m"

Вот мое развертывание:

kind: Deployment
apiVersion: apps/v1
metadata:
  name: my-deployment
  labels:
    app: my-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: ...
          imagePullPolicy: Always
          resources:
            requests:
              memory: "256Mi"
              cpu: "100m"
            limits:
              memory: "512Mi"
              cpu: "200m"
          livenessProbe:
            httpGet:
              path: /liveness
              port: 3000
            initialDelaySeconds: 10
            periodSeconds: 3
            timeoutSeconds: 3
          readinessProbe:
            httpGet:
              path: /readiness
              port: 3000
            initialDelaySeconds: 10
            periodSeconds: 3
            timeoutSeconds: 3
          ports:
            - containerPort: 3000
              protocol: TCP

Я вручную уменьшаю масштаб до 2-х реплик, и он сразу же возвращается к 3 без причины:

Normal   SuccessfulRescale             28s (x4 over 66m)    horizontal-pod-autoscaler  New size: 3; reason:

Кто-нибудь знает, что происходит?

2 ответа

https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/

Согласно вашим текущим числам, он никогда не будет уменьшаться, если использование памяти не упадет до половины желаемого процента.

т.е. текущее использование как процессора, так и памяти должно достигать 40%(в вашем случае) или ниже

согласно формуле ниже

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
                = ceil[3 * (61/80)]
                = ceil[3 * (0.7625)]
                = ceil[2.2875]
desiredReplicas = 3

у вас могут быть сомнения, что ваш процессор ниже 40%, почему он не выполняет масштабирование.. но HPA не будет работать таким образом.. он всегда будет искать большее число.

У меня была такая же проблема, потому что, как и вы, я использовал 2 показателя ЦП и память. Ресурс памяти никогда не освобождается приложением так быстро, как это делает ЦП. Как только я удалил ресурс памяти, модули уменьшились, когда использование было меньше.

Другие вопросы по тегам