<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://noname.com.ua/mediawiki/index.php?action=history&amp;feed=atom&amp;title=K8s_Q_A_Horisontal_Pod_Autoscaler</id>
	<title>K8s Q A Horisontal Pod Autoscaler - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://noname.com.ua/mediawiki/index.php?action=history&amp;feed=atom&amp;title=K8s_Q_A_Horisontal_Pod_Autoscaler"/>
	<link rel="alternate" type="text/html" href="https://noname.com.ua/mediawiki/index.php?title=K8s_Q_A_Horisontal_Pod_Autoscaler&amp;action=history"/>
	<updated>2026-04-04T06:51:14Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://noname.com.ua/mediawiki/index.php?title=K8s_Q_A_Horisontal_Pod_Autoscaler&amp;diff=12436&amp;oldid=prev</id>
		<title>Sirmax в 11:46, 9 января 2024</title>
		<link rel="alternate" type="text/html" href="https://noname.com.ua/mediawiki/index.php?title=K8s_Q_A_Horisontal_Pod_Autoscaler&amp;diff=12436&amp;oldid=prev"/>
		<updated>2024-01-09T11:46:42Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://noname.com.ua/mediawiki/index.php?title=K8s_Q_A_Horisontal_Pod_Autoscaler&amp;amp;diff=12436&amp;amp;oldid=12430&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Sirmax</name></author>
	</entry>
	<entry>
		<id>https://noname.com.ua/mediawiki/index.php?title=K8s_Q_A_Horisontal_Pod_Autoscaler&amp;diff=12430&amp;oldid=prev</id>
		<title>Sirmax в 11:18, 9 января 2024</title>
		<link rel="alternate" type="text/html" href="https://noname.com.ua/mediawiki/index.php?title=K8s_Q_A_Horisontal_Pod_Autoscaler&amp;diff=12430&amp;oldid=prev"/>
		<updated>2024-01-09T11:18:22Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://noname.com.ua/mediawiki/index.php?title=K8s_Q_A_Horisontal_Pod_Autoscaler&amp;amp;diff=12430&amp;amp;oldid=12415&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Sirmax</name></author>
	</entry>
	<entry>
		<id>https://noname.com.ua/mediawiki/index.php?title=K8s_Q_A_Horisontal_Pod_Autoscaler&amp;diff=12415&amp;oldid=prev</id>
		<title>Sirmax: Новая страница: «Категория:K8s Категория:K8s_Вопросы_И_Ответы Категория:Требуется форматирование текс...»</title>
		<link rel="alternate" type="text/html" href="https://noname.com.ua/mediawiki/index.php?title=K8s_Q_A_Horisontal_Pod_Autoscaler&amp;diff=12415&amp;oldid=prev"/>
		<updated>2024-01-09T08:29:24Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «&lt;a href=&quot;/mediawiki/index.php/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:K8s&quot; title=&quot;Категория:K8s&quot;&gt;Категория:K8s&lt;/a&gt; &lt;a href=&quot;/mediawiki/index.php/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:K8s_%D0%92%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D1%8B_%D0%98_%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B&quot; title=&quot;Категория:K8s Вопросы И Ответы&quot;&gt;Категория:K8s_Вопросы_И_Ответы&lt;/a&gt; Категория:Требуется форматирование текс...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Категория:K8s]]&lt;br /&gt;
[[Категория:K8s_Вопросы_И_Ответы]]&lt;br /&gt;
[[Категория:Требуется форматирование текста]]&lt;br /&gt;
&lt;br /&gt;
Знакомство с Kubernetes. Часть 19: HorizontalPodAutoscaler&lt;br /&gt;
&lt;br /&gt;
Jun 12, 2019 08:08 · 918 words · 5 minute read&lt;br /&gt;
KUBERNETES&lt;br /&gt;
В этой статье рассмотрим использование HorizontalPodAutoscaler - объектов, предназначенных для автоматического масштабирования количества подов (Pods) в Replication Controller, Replica Set или Deployment, основываясь на использовании CPU (или, при поддержке custom metrics, на других метриках приложения). Давайте разберемся!&lt;br /&gt;
&lt;br /&gt;
Сразу стоит отметить, что HorizontalPodAutoscaler не может быть применен к объектам, которые не предназначены для масштабирования, например DaemonSets. Horizontal Pod Autoscaler состоит из Kubernetes ресурса (объекта) и контроллера, поведение которого описывается ресурсом.&lt;br /&gt;
&lt;br /&gt;
C периодичностью 15 секунд (можно изменить с помощью параметра --horizontal-pod-autoscaler-sync-period), контроллер собирает данные по использованию метрик, определенных в манифесте ресурса HorizontalPodAutoscaler. Метрики собираются или с resource metrics API (метрики использования ресурсов подами) или с custom metrics API (остальные метрики, например, метрики приложения).&lt;br /&gt;
&lt;br /&gt;
Для каждого подконтрольного пода, контроллер собирает метрики (например, использования CPU) с resource metrics API (metrics.k8s.io, предоставляется metrics-server). Далее, происходит вычисление текущего значения использования CPU в процентах от запрошенных ресурсов (resource request) контейнерами каждого пода, после чего это значение сравнивается с “целевым” (target) значением - порогом, после которого количество подов должно быть увеличено.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим конкретный пример. Создадим файл test-hpa.yaml с описанием ресурса HorizontalPodAutoscaler такого содержания:&lt;br /&gt;
&lt;br /&gt;
apiVersion: autoscaling/v2beta1&lt;br /&gt;
kind: HorizontalPodAutoscaler&lt;br /&gt;
metadata:&lt;br /&gt;
  name: test-hpa&lt;br /&gt;
spec:&lt;br /&gt;
  scaleTargetRef:&lt;br /&gt;
    apiVersion: apps/v1&lt;br /&gt;
    kind: Deployment&lt;br /&gt;
    name: test-api-deploy&lt;br /&gt;
  minReplicas: 10&lt;br /&gt;
  maxReplicas: 29&lt;br /&gt;
  metrics:&lt;br /&gt;
  - type: Resource&lt;br /&gt;
    resource:&lt;br /&gt;
      name: cpu&lt;br /&gt;
      targetAverageUtilization: 80&lt;br /&gt;
Создадим данный объект в кластере Kubernetes:&lt;br /&gt;
&lt;br /&gt;
kubectl create -f test-hpa.yaml&lt;br /&gt;
Проверим наличие объекта:&lt;br /&gt;
&lt;br /&gt;
kubectl get horizontalpodautoscaler&lt;br /&gt;
NAME          REFERENCE                        TARGETS         MINPODS   MAXPODS   REPLICAS   AGE&lt;br /&gt;
test-hpa      Deployment/test-api-deploy       &amp;lt;unknown&amp;gt;/80%   10        29        0          7s&lt;br /&gt;
Спустя некоторое время, вместо &amp;lt;unknown&amp;gt;, мы должны увидеть текущее использование CPU подами в деплойменте test-api-deploy, однако в моем случае этого не произошло. Начинаем разбираться - для начала, убедимся, что metrics.k8s.io доступно:&lt;br /&gt;
&lt;br /&gt;
kubectl get --raw &amp;quot;/apis/metrics.k8s.io/&amp;quot; | jq&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;kind&amp;quot;: &amp;quot;APIGroup&amp;quot;,&lt;br /&gt;
  &amp;quot;apiVersion&amp;quot;: &amp;quot;v1&amp;quot;,&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;metrics.k8s.io&amp;quot;,&lt;br /&gt;
  &amp;quot;versions&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;groupVersion&amp;quot;: &amp;quot;metrics.k8s.io/v1beta1&amp;quot;,&lt;br /&gt;
      &amp;quot;version&amp;quot;: &amp;quot;v1beta1&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;preferredVersion&amp;quot;: {&lt;br /&gt;
    &amp;quot;groupVersion&amp;quot;: &amp;quot;metrics.k8s.io/v1beta1&amp;quot;,&lt;br /&gt;
    &amp;quot;version&amp;quot;: &amp;quot;v1beta1&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
Проверим, что метрики использования CPU доступны. Первый вариант:&lt;br /&gt;
&lt;br /&gt;
kubectl top pod | grep test-api-deploy&lt;br /&gt;
test-api-deploy-5f77b79896-2t9x9                        738m         43931Mi&lt;br /&gt;
test-api-deploy-5f77b79896-fhr7b                        643m         43999Mi&lt;br /&gt;
test-api-deploy-5f77b79896-gcrlc                        700m         44028Mi&lt;br /&gt;
test-api-deploy-5f77b79896-lx24k                        666m         44201Mi&lt;br /&gt;
test-api-deploy-5f77b79896-mzlzb                        660m         44048Mi&lt;br /&gt;
test-api-deploy-5f77b79896-ndjwx                        651m         44136Mi&lt;br /&gt;
test-api-deploy-5f77b79896-q2nvw                        654m         44177Mi&lt;br /&gt;
test-api-deploy-5f77b79896-qmw4t                        692m         44051Mi&lt;br /&gt;
test-api-deploy-5f77b79896-rl4bb                        650m         43979Mi&lt;br /&gt;
test-api-deploy-5f77b79896-xhpbx                        752m         44116Mi&lt;br /&gt;
Второй вариант (метрики только одного конкретного пода):&lt;br /&gt;
&lt;br /&gt;
kubectl get --raw /apis/metrics.k8s.io/v1beta1/namespaces/default/pods/test-api-deploy-5f77b79896-xhpbx | jq&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;kind&amp;quot;: &amp;quot;PodMetrics&amp;quot;,&lt;br /&gt;
  &amp;quot;apiVersion&amp;quot;: &amp;quot;metrics.k8s.io/v1beta1&amp;quot;,&lt;br /&gt;
  &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;test-api-deploy-5f77b79896-xhpbx&amp;quot;,&lt;br /&gt;
    &amp;quot;namespace&amp;quot;: &amp;quot;default&amp;quot;,&lt;br /&gt;
    &amp;quot;selfLink&amp;quot;: &amp;quot;/apis/metrics.k8s.io/v1beta1/namespaces/default/pods/test-api-deploy-5f77b79896-xhpbx&amp;quot;,&lt;br /&gt;
    &amp;quot;creationTimestamp&amp;quot;: &amp;quot;2019-06-11T13:50:00Z&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;timestamp&amp;quot;: &amp;quot;2019-06-11T13:49:41Z&amp;quot;,&lt;br /&gt;
  &amp;quot;window&amp;quot;: &amp;quot;30s&amp;quot;,&lt;br /&gt;
  &amp;quot;containers&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;envoy&amp;quot;,&lt;br /&gt;
      &amp;quot;usage&amp;quot;: {&lt;br /&gt;
        &amp;quot;cpu&amp;quot;: &amp;quot;489151208n&amp;quot;,&lt;br /&gt;
        &amp;quot;memory&amp;quot;: &amp;quot;45692Ki&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
      &amp;quot;usage&amp;quot;: {&lt;br /&gt;
        &amp;quot;cpu&amp;quot;: &amp;quot;7125240328n&amp;quot;,&lt;br /&gt;
        &amp;quot;memory&amp;quot;: &amp;quot;45515856Ki&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
Как видим, метрики доступны. Получим детальное описание нашего HorizontalPodAutoscaler:&lt;br /&gt;
&lt;br /&gt;
kubectl describe hpa test-hpa&lt;br /&gt;
Name:                                                  test-hpa&lt;br /&gt;
Namespace:                                             default&lt;br /&gt;
Labels:                                                app.kubernetes.io/managed-by=spinnaker&lt;br /&gt;
                                                       app.kubernetes.io/name=test&lt;br /&gt;
Annotations:                                           artifact.spinnaker.io/location: default&lt;br /&gt;
                                                       artifact.spinnaker.io/name: test-hpa&lt;br /&gt;
                                                       artifact.spinnaker.io/type: kubernetes/horizontalpodautoscaler&lt;br /&gt;
                                                       kubectl.kubernetes.io/last-applied-configuration:&lt;br /&gt;
                                                         {&amp;quot;apiVersion&amp;quot;:&amp;quot;autoscaling/v2beta1&amp;quot;,&amp;quot;kind&amp;quot;:&amp;quot;HorizontalPodAutoscaler&amp;quot;,&amp;quot;metadata&amp;quot;:{&amp;quot;annotations&amp;quot;:{&amp;quot;artifact.spinnaker.io/location&amp;quot;:&amp;quot;default&amp;quot;...&lt;br /&gt;
                                                       moniker.spinnaker.io/application: test&lt;br /&gt;
                                                       moniker.spinnaker.io/cluster: horizontalpodautoscaler test-hpa&lt;br /&gt;
CreationTimestamp:                                     Tue, 11 Jun 2019 11:21:03 +0300&lt;br /&gt;
Reference:                                             Deployment/test-api-deploy&lt;br /&gt;
Metrics:                                               ( current / target )&lt;br /&gt;
  resource cpu on pods  (as a percentage of request):  &amp;lt;unknown&amp;gt; / 80%&lt;br /&gt;
Min replicas:                                          10&lt;br /&gt;
Max replicas:                                          29&lt;br /&gt;
Deployment pods:                                       10 current / 10 desired&lt;br /&gt;
Conditions:&lt;br /&gt;
  Type           Status  Reason                   Message&lt;br /&gt;
  ----           ------  ------                   -------&lt;br /&gt;
  AbleToScale    True    SucceededGetScale        the HPA controller was able to get the target's current scale&lt;br /&gt;
  ScalingActive  False   FailedGetResourceMetric  the HPA was unable to compute the replica count: missing request for cpu&lt;br /&gt;
Events:&lt;br /&gt;
  Type     Reason                        Age                    From                       Message&lt;br /&gt;
  ----     ------                        ----                   ----                       -------&lt;br /&gt;
  Normal   SuccessfulRescale             7m17s                  horizontal-pod-autoscaler  New size: 10; reason: Current number of replicas below Spec.MinReplicas&lt;br /&gt;
  Warning  FailedComputeMetricsReplicas  4m15s (x12 over 7m2s)  horizontal-pod-autoscaler  failed to get cpu utilization: missing request for cpu&lt;br /&gt;
  Warning  FailedGetResourceMetric       2m15s (x20 over 7m2s)  horizontal-pod-autoscaler  missing request for cpu&lt;br /&gt;
Здесь самое важное - сообщение the HPA was unable to compute the replica count: missing request for cpu. И действительно, в манифесте развертывания (Deployment) не указаны resource requests для одного из контейнеров (с именем envoy):&lt;br /&gt;
&lt;br /&gt;
apiVersion: apps/v1&lt;br /&gt;
kind: Deployment&lt;br /&gt;
metadata:&lt;br /&gt;
  annotations:&lt;br /&gt;
# From https://www.spinnaker.io/reference/providers/kubernetes-v2/#strategy  &lt;br /&gt;
    strategy.spinnaker.io/use-source-capacity: &amp;quot;true&amp;quot;&lt;br /&gt;
  name: test-api-deploy&lt;br /&gt;
spec:&lt;br /&gt;
#  replicas: 15&lt;br /&gt;
  selector:&lt;br /&gt;
    matchLabels:&lt;br /&gt;
      deployment: test-api-deploy&lt;br /&gt;
  strategy:&lt;br /&gt;
    rollingUpdate:&lt;br /&gt;
      maxSurge: 0&lt;br /&gt;
    type: RollingUpdate&lt;br /&gt;
  template:&lt;br /&gt;
    metadata:&lt;br /&gt;
      labels:&lt;br /&gt;
        deployment: test-api-deploy&lt;br /&gt;
    spec:&lt;br /&gt;
      containers:&lt;br /&gt;
      - image: envoyproxy/envoy:v1.10.0&lt;br /&gt;
        name: envoy&lt;br /&gt;
        ports:&lt;br /&gt;
        - containerPort: 8080&lt;br /&gt;
          name: http&lt;br /&gt;
        volumeMounts:&lt;br /&gt;
        - mountPath: /etc/envoy&lt;br /&gt;
          name: envoy-config&lt;br /&gt;
      - env:&lt;br /&gt;
        - name: JAVA_OPTS&lt;br /&gt;
          value: -Xms40g -Xmx40g&lt;br /&gt;
        image: index.docker.io/ealebed/test:v1&lt;br /&gt;
        name: test&lt;br /&gt;
        resources:&lt;br /&gt;
          limits:&lt;br /&gt;
            memory: 55Gi&lt;br /&gt;
          requests:&lt;br /&gt;
            cpu: &amp;quot;10&amp;quot;&lt;br /&gt;
            memory: 55Gi&lt;br /&gt;
      volumes:&lt;br /&gt;
      - configMap:&lt;br /&gt;
          name: envoy-config&lt;br /&gt;
        name: envoy-config&lt;br /&gt;
Важно! Если не указаны resource request хотя бы для одного из контейнеров в Replication Controller, Replica Set или Deployment, то текущее значение использование CPU подами не может быть корректно определено, и, в результате, HorizontalPodAutoscaler не будет предпринимать никаких действий по масштабированию.&lt;br /&gt;
&lt;br /&gt;
После исправления этой досадной ошибки, HorizontalPodAutoscaler, базируясь на полученных метриках, начинает масштабировать поды в развертывании:&lt;br /&gt;
&lt;br /&gt;
kubectl get horizontalpodautoscaler                                                                                                              &lt;br /&gt;
NAME          REFERENCE                       TARGETS   MINPODS   MAXPODS   REPLICAS   AGE&lt;br /&gt;
test-hpa      Deployment/test-api-deploy      86%/80%   10        29        29         9m10&lt;br /&gt;
Формула, по которой HorizontalPodAutoscaler вычисляет требуемое количество реплик выглядит так:&lt;br /&gt;
&lt;br /&gt;
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]&lt;br /&gt;
Например, если текущее значение метрики (currentMetricValue) равно 200m, а ожидаемое (desiredMetricValue) установлено в 100m, то количество реплик будет удвоено (200.0 / 100.0 == 2.0). Если же текущее значение метрики равно всего лишь 50m, то количество реплик должно быть уменьшено вдвое (50.0 / 100.0 == 0.5). Если соотношение текущего значения метрики к ожидаемому значению достаточно близко к 1, то никаких действий не будет предпринято.&lt;br /&gt;
&lt;br /&gt;
Так как мы указали targetAverageUtilization при описании ресурса HorizontalPodAutoscaler, то текущее значение метрики (currentMetricValue) использования CPU рассчитывается как среднее значение этой метрики для всех подов, контролируемых данным автоскейлером.&lt;br /&gt;
&lt;br /&gt;
После того, как текущее значение использования CPU снизилось и оставалось низким в течении 5 минут (устанавливается с помощью параметра --horizontal-pod-autoscaler-downscale-stabilization), количество реплик было автоматически уменьшено:&lt;br /&gt;
&lt;br /&gt;
kubectl get horizontalpodautoscaler                                                                                                              &lt;br /&gt;
NAME          REFERENCE                       TARGETS   MINPODS   MAXPODS   REPLICAS   AGE&lt;br /&gt;
test-hpa      Deployment/test-api-deploy      70%/80%   20        29        23         1h&lt;br /&gt;
На этом все, в одной из следующих статей рассмотрим более сложный вариант автоскейлинга, базирующийся на метриках приложения.&lt;/div&gt;</summary>
		<author><name>Sirmax</name></author>
	</entry>
</feed>