Горизонтальный автоскалер Kubernetes не создает реплики в соответствии с количеством реплик

Здесь я пытаюсь развернуть докеризованный веб-сервис через таблицу управления в пользовательском кластере kubernetes (созданном с помощью kubeadm). Поэтому, когда он получает автоматическое масштабирование, он не создает реплики в соответствии с количеством реплик.

Это мой файл развертывания.

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: {{ template "demochart.fullname" . }}
  labels:
    app: {{ template "demochart.name" . }}
    chart: {{ template "demochart.chart" . }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ template "demochart.name" . }}
      release: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app: {{ template "demochart.name" . }}
        release: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 80
          volumeMounts:
            - name: cred-storage
              mountPath: /root/
          resources:
{{ toYaml .Values.resources | indent 12 }}
    {{- with .Values.nodeSelector }}
      nodeSelector:
{{ toYaml . | indent 8 }}
    {{- end }}
    {{- with .Values.affinity }}
      affinity:
{{ toYaml . | indent 8 }}
    {{- end }}
    {{- with .Values.tolerations }}
      tolerations:
{{ toYaml . | indent 8 }}
    {{- end }}
      volumes:
        - name: cred-storage
          hostPath:
            path: /home/aodev/
            type:

Вот значения.yaml

replicaCount: 3

image:
  repository: REPO_NAME
  tag: latest
  pullPolicy: IfNotPresent

service:
  type: NodePort
  port: 8007

ingress:
  enabled: false
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  path: /
  hosts:
    - chart-example.local
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

resources: 
  # We usually recommend not to specify default resources and to leave this as a conscious
  # choice for the user. This also increases chances charts run on environments with little
  # resources, such as Minikube. If you do want to specify resources, uncomment the following
  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
  limits:
    cpu: 1000m
    memory: 2000Mi
  requests:
    cpu: 1000m
    memory: 2000Mi

nodeSelector: {}

tolerations: []

affinity: {}

Вот мои работающие модули, которые включают серверы метаданных и метрик, а также мой веб-сервис.

kubectl получить капсулы перед автомасштабированием

Ниже файл hpa

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
 annotations:
 name: entitydetection
 namespace: kube-system
spec:
  maxReplicas: 20
  minReplicas: 5
  scaleTargetRef:
    apiVersion: apps/v1beta2
    kind: Deployment
    name: entitydetection
  targetCPUUtilizationPercentage: 50

Таким образом, я дал количество реплик как 3 в развертывании и minReplicas как 5 и maxReplicas как 20, targetCPUUtilization как 50% в hpa. Таким образом, когда загрузка ЦП превышает 50%, она случайным образом создает реплики, а не в соответствии с их количеством.

Таким образом, ниже 2 реплик создаются, когда ЦП превышает 50%, которые имеют возраст 36 лет. В идеале следует создать 3 реплики. В чем проблема?

kubectl получить стручки после автомасштабирования

1 ответ

Решение

Вот цитата из проектной документации HPA:

Автоскалер реализован в виде цикла управления. Он периодически запрашивает модули, описанные Status.PodSelector подресурса Scale, и собирает их загрузку ЦП.

Затем он сравнивает среднее арифметическое значение загрузки ЦП модулей с целью, определенной в Spec.CPUUtilization, и корректирует реплики Scale, если необходимо, чтобы соответствовать цели (сохраняя условие: MinReplicas <= Replicas <= MaxReplicas).

Загрузка ЦП - это недавняя загрузка ЦП модуля (в среднем за последние 1 минуту), деленная на ЦП, запрошенный модулем.

Целевое количество стручков рассчитывается по следующей формуле:

TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)    

Запуск и остановка модулей могут вносить шум в метрику (например, запуск может временно увеличить процессор). Таким образом, после каждого действия автоскалер должен подождать некоторое время для получения надежных данных. Увеличение может произойти только в том случае, если в течение последних 3 минут не было никакого масштабирования. Уменьшение будет ждать 5 минут с момента последнего изменения масштаба.

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

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