При развертывании Kubernetes HPA не удается найти целевой ресурс

Я безуспешно пытаюсь развернуть собственный HPA. Хотя при попытке развернуть официальный PHP кубернетов он работал по плану. Когда я попытался развернуть собственное тестовое развертывание с помощью HPA, это не сработало.

Сравните два процесса развертывания HPA - официальное развертывание Kubernetes и развертывание My Test:

Разверните изображение официального шаблона Kubernetes:

$ kubectl run php-apache --image=gcr.io/google_containers/hpa-example --requests=cpu=200m --expose --port=80
service "php-apache" created
deployment "php-apache" created

Мои собственные результаты тестового развертывания

{
   "apiVersion": "autoscaling/v1",
   "kind": "HorizontalPodAutoscaler",
   "metadata": {
       "annotations": {
           "autoscaling.alpha.kubernetes.io/conditions": "[{\"type\":\"AbleToScale\",\"status\":\"False\",\"lastTransitionTime\":\"2019-12-22T20:39:59Z\",\"reason\":\"FailedGetScale\",\"message\":\"the HPA controller was unable to get the target's current scale: deployments/scale.apps \\\"gw-autoscale-t6\\\" not found\"}]"
       },
       "creationTimestamp": "2019-12-22T20:39:44Z",
       "labels": {
           "app": "gw-autoscale-t6"
       },
       "name": "gw-autoscale-t6",
       "namespace": "dev",
       "resourceVersion": "17299134",
       "selfLink": "/apis/autoscaling/v1/namespaces/dev/horizontalpodautoscalers/gw-autoscale-t6",
       "uid": "2f7e014c-24fb-11ea-a4d8-a28620329da6"
   },
   "spec": {
       "maxReplicas": 3,
       "minReplicas": 1,
       "scaleTargetRef": {
           "apiVersion": "apps/v1",
           "kind": "Deployment",
           "name": "gw-autoscale-t6"
       },
       "targetCPUUtilizationPercentage": 80
   },
   "status": {
       "currentReplicas": 0,
       "desiredReplicas": 0
   }
}

yaml развертывания HPA, который я использовал для обоих описанных выше развертываний (официальное развертывание и мое тестовое развертывание):

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: {{ .Values.name }}
  labels:
    app: {{ .Values.name }}
  namespace: {{ .Values.namespace }}
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: {{ .Values.name }}
  minReplicas: {{ .Values.spec.replicaCountMin }}
  maxReplicas: {{ .Values.spec.replicaCountMax }}
  targetCPUUtilizationPercentage: 50
  selector:
    matchLabels:
      app: {{ .Values.name }}
  template:
    metadata:
      labels:
        app: {{ .Values.name }}
        release: {{ .Release.Name }}
        heritage: {{ .Release.Service }}
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"

Результаты, достижения:

PHP HPA работает по плану

NAME        REFERENCE              TARGETS  MINPODS   MAXPODS   REPLICAS   AGE
php-apache  Deployment/php-apache  0%/50%    1        3         1          3d7h

HPA тестового развертывания не работает

NAME              REFERENCE                    TARGETS         MINPODS  MAXPODS   REPLICAS   AGE
gw-autoscale-t6   Deployment/gw-autoscale-t6   <unknown>/80%   1        3         0          11m

Ошибка HPA при тестовом развертывании

Name:                                                  gw-autoscale-t6
Namespace:                                             dev
Labels:                                                app=gw-autoscale-t6
Annotations:                                           <none>
CreationTimestamp:                                     Sun, 22 Dec 2019 22:39:44 +0200
Reference:                                             Deployment/gw-autoscale-t6
Metrics:                                               ( current / target )
  resource cpu on pods  (as a percentage of request):  <unknown> / 80%
Min replicas:                                          1
Max replicas:                                          3
Deployment pods:                                       0 current / 0 desired
Conditions:
  Type         Status  Reason          Message
  ----         ------  ------          -------
  AbleToScale  False   FailedGetScale  the HPA controller was unable to get the target's current scale: deployments/scale.apps "gw-autoscale-t6" not found
Events:
  Type     Reason          Age                 From                       Message
  ----     ------          ----                ----                       -------
  Warning  FailedGetScale  27s (x81 over 20m)  horizontal-pod-autoscaler  deployments/scale.apps "gw-autoscale-t6" not found
  • Я также пробовал много других типов файлов развертывания.

  • My Metrics-Service установлен.

  • Я устанавливаю свое развертывание с помощью Helm.

Что я могу сделать, чтобы решить эту проблему?


Решение, которое я нашел, заключалось в том, чтобы добавить свойство 'resources' в yaml-файл Test Deployment:

Например: в случае масштабирования по использованию процессора используйте его, как указано в файле развертывания.

resources:
    requests:
       cpu: {{ .Values.request.cpu }}
    limits:
       cpu: {{ .Values.limits.cpu }}

person Oded Shaked    schedule 22.12.2019    source источник
comment
Это может быть проблема с вашим развертыванием, не могли бы вы добавить сюда свой yaml развертывания? А также проверьте с помощью API, есть определенные поля, не указанные в спецификации, которые не работают при применении и каждый раз просят вас использовать флаг --validate=false. Но все же текущая проблема может быть связана с yaml развертывания репликации, в котором может отсутствовать несколько полей.   -  person BinaryMonster    schedule 23.12.2019
comment
Я прав, что вы пробовали официальный PHP в пространстве имен по умолчанию?   -  person Nick    schedule 24.12.2019
comment
проверяли ли вы также github.com/kubernetes/kubernetes/issues/79365?   -  person Nick    schedule 24.12.2019
comment
@BinaryBullet Я добавил Json развертывания в основной пост. Я считаю, что пробовал и несколько других типов apiVersion / kind. Что-то не хватает в текущем Json?   -  person Oded Shaked    schedule 24.12.2019
comment
@Nick Официальный PHP работает в другом пространстве имен (dev). Я не вижу, что в упомянутой ссылке (github.com/kubernetes/kubernetes/issues/79365) есть реальный твердый ответ или что я что-то пропустил.   -  person Oded Shaked    schedule 24.12.2019
comment
@bloodix Я попытался запустить ваш HPA в своем пространстве имен, у меня все сработало, но я удалил поля selector и template из yaml перед запуском. И все это отлично работало с моими модулями приложений. Итак, я сомневаюсь в развертывании приложения, я не мог сделать из размещенного вами json развертывания, поскольку он дает информацию только об ошибке, можно ли опубликовать части развертывания модуля, которые могут быть полезны для отладки.   -  person BinaryMonster    schedule 24.12.2019
comment
@BinaryBullet Да, очевидно, файл развертывания HPA и образ развертывания неверны. Я добавил свой ответ ниже   -  person Oded Shaked    schedule 16.02.2020


Ответы (2)


Я решил это, добавив ресурсы процессора в файл развертывания и сохранив только необходимые поля yaml развертывания HPA.

Файл развертывания HPA

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: {{ .Values.name }}
  labels:
    app: {{ .Values.name }}
  namespace: {{ .Values.namespace }}
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: {{ .Values.name }}
  minReplicas: {{ .Values.spec.replicaCountMin }} 
  maxReplicas: {{ .Values.spec.replicaCountMax }} 
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: {{ .Values.spec.cpuUtil }} 

Файл развертывания - добавление ресурсов

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: {{ .Values.name }}
  labels:
    app: {{ .Values.name }}
  namespace: {{ .Values.namespace }}
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    metadata:
      labels:
        app: {{ .Values.name }}
        release: {{ .Release.Name }}
        heritage: {{ .Release.Service }}
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        resources:
          requests:
            cpu: {{ .Values.request.cpu }}
          limits:
            cpu: {{ .Values.limits.cpu }} 

Вы должны добавить этот код:

resources:
requests:
cpu: {{ .Values.request.cpu }}
limits:
cpu: {{ .Values.limits.cpu }}

Надеюсь, это поможет :)

person Oded Shaked    schedule 16.02.2020

Похоже, что-то не так с развертыванием.

Я попытался воспроизвести ситуацию, и похоже, что вы создаете средство автомасштабирования из файла с kubectl create -f hpa.yaml, который ищет Deployment/gw-autoscale-t6, которого нет в кластере.

Вот почему вы получаете следующую ошибку:

контроллеру HPA не удалось получить текущий масштаб цели: deployments / scale.apps \ "gw-autoscale-t6" not found "

для своих тестов я создал hpa.yaml, применил его и искал ситуацию:

$ date && kubectl get hpa && kubectl get deployments php-apache 

Tue 31 Dec 2019 10:59:37 AM CET

NAME         REFERENCE               TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   <unknown>/50%   1         10        0          10m

Error from server (NotFound): deployments.extensions "php-apache" not found

он дал мне <unknown> как значение TARGETS. И Ноль как REPLICAS

Как видите, самого развертывания (того, которое мы пытаемся масштабировать с помощью hpa.yaml) еще не существует.

После создания развертывания:

$ kubectl run php-apache --image=gcr.io/google_containers/hpa-example --requests=cpu=200m --expose --port=80

service/php-apache created
deployment.apps/php-apache created

Я подождал минуту, чтобы позволить HPA разогреться и все просчитать:

$ kubectl get hpa -o yaml

apiVersion: v1
items:
- apiVersion: autoscaling/v1
  kind: HorizontalPodAutoscaler
  metadata:
    annotations:
      autoscaling.alpha.kubernetes.io/conditions: '[{"type":"AbleToScale","status":"True","lastTransitionTime":"2019-12-31T09:59:47Z","reason":"ScaleDownStabilized","message":"recent
        recommendations were higher than current one, applying the highest recent
        recommendation"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2019-12-31T10:00:33Z","reason":"ValidMetricFound","message":"the
        HPA was able to successfully calculate a replica count from cpu resource utilization
        (percentage of request)"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2019-12-31T10:00:33Z","reason":"DesiredWithinRange","message":"the
        desired count is within the acceptable range"}]'
      autoscaling.alpha.kubernetes.io/current-metrics: '[{"type":"Resource","resource":{"name":"cpu","currentAverageUtilization":0,"currentAverageValue":"1m"}}]'
    creationTimestamp: "2019-12-31T09:49:16Z"
    name: php-apache
...
 spec:
    maxReplicas: 10
    minReplicas: 1
    scaleTargetRef:
      apiVersion: extensions/v1beta1
      kind: Deployment
      name: php-apache
    targetCPUUtilizationPercentage: 50
  status:
    currentCPUUtilizationPercentage: 0
    currentReplicas: 1
    desiredReplicas: 1

И еще раз проверил:

$ date && kubectl get hpa && kubectl get deployments php-apache 

Tue 31 Dec 2019 11:01:16 AM CET
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         10        1          12m

NAME         READY   UP-TO-DATE   AVAILABLE   AGE
php-apache   1/1     1            1           97s

Итак, теперь я вижу ненулевое значение для REPLICA, а TARGETS показывает правильное значение.

Надеюсь, что это поможет :) P.S. Сообщите мне, если вы решили проблему.

person Nick    schedule 31.12.2019
comment
Спасибо за эту информацию, она побудила меня найти решение. - person Oded Shaked; 16.02.2020