<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B_%D0%BF%D0%BE%D0%B4%D0%BE%D0%B2</id>
	<title>Эффективные ресурсы подов - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B_%D0%BF%D0%BE%D0%B4%D0%BE%D0%B2"/>
	<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B_%D0%BF%D0%BE%D0%B4%D0%BE%D0%B2&amp;action=history"/>
	<updated>2026-10-06T19:17:45Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://doc.ruscomtech.ru/index.php?title=%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B_%D0%BF%D0%BE%D0%B4%D0%BE%D0%B2&amp;diff=6725&amp;oldid=prev</id>
		<title>IKuznetsov: Новая страница: « = Эффективные ресурсы подов = Запросы и лимиты ресурсов для &#039;&#039;&#039;CPU&#039;&#039;&#039; и памяти можно задавать на уровне контейнера, на уровне init-контейнера, а начиная с &#039;&#039;&#039;Kubernetes&#039;&#039;&#039; 1.34 — на уровне пода. Поскольку разные типы контейнеров работают в разное время, вычисление эффе...»</title>
		<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B_%D0%BF%D0%BE%D0%B4%D0%BE%D0%B2&amp;diff=6725&amp;oldid=prev"/>
		<updated>2026-09-21T10:47:39Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: « = Эффективные ресурсы подов = Запросы и лимиты ресурсов для &amp;#039;&amp;#039;&amp;#039;CPU&amp;#039;&amp;#039;&amp;#039; и памяти можно задавать на уровне контейнера, на уровне init-контейнера, а начиная с &amp;#039;&amp;#039;&amp;#039;Kubernetes&amp;#039;&amp;#039;&amp;#039; 1.34 — на уровне пода. Поскольку разные типы контейнеров работают в разное время, вычисление эффе...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
= Эффективные ресурсы подов =&lt;br /&gt;
Запросы и лимиты ресурсов для &amp;#039;&amp;#039;&amp;#039;CPU&amp;#039;&amp;#039;&amp;#039; и памяти можно задавать на уровне контейнера, на уровне init-контейнера, а начиная с &amp;#039;&amp;#039;&amp;#039;Kubernetes&amp;#039;&amp;#039;&amp;#039; 1.34 — на уровне пода. Поскольку разные типы контейнеров работают в разное время, вычисление эффективного лимита на уровне пода нелинейно: простое суммирование всех лимитов контейнеров даёт неверный результат во многих реальных подах.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ключ-АСТРОМ&amp;#039;&amp;#039;&amp;#039; вычисляет правильное эффективное значение во время приёма данных и корректирует метрику так, чтобы агрегированные представления по подам, рабочим нагрузкам, пространствам имён и кластерам всегда отражали то, что &amp;#039;&amp;#039;&amp;#039;Kubernetes&amp;#039;&amp;#039;&amp;#039; фактически применяет.&lt;br /&gt;
&lt;br /&gt;
Применяется только к мониторингу Latest. Требуется мониторинг &amp;#039;&amp;#039;&amp;#039;Kubernetes&amp;#039;&amp;#039;&amp;#039; через &amp;#039;&amp;#039;&amp;#039;АктивныйШлюз&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Если сервисная сетка, такая как &amp;#039;&amp;#039;&amp;#039;Istio&amp;#039;&amp;#039;&amp;#039;, настроена на использование нативных sidecar-контейнеров, эти sidecar-контейнеры принимаются и суммируются корректно в &amp;#039;&amp;#039;&amp;#039;АктивныйШлюз&amp;#039;&amp;#039;&amp;#039; версии 1.339+. Поды, использующие более ранние версии &amp;#039;&amp;#039;&amp;#039;Istio&amp;#039;&amp;#039;&amp;#039; (до 1.24 или с 1.24 по 1.26 без явной настройки), использовали app-контейнеры для прокси, которые уже учитывались. Обновление &amp;#039;&amp;#039;&amp;#039;Istio&amp;#039;&amp;#039;&amp;#039; до версии 1.27+ (где нативные sidecar-контейнеры используются по умолчанию) без одновременного обновления до &amp;#039;&amp;#039;&amp;#039;АктивныйШлюз&amp;#039;&amp;#039;&amp;#039; версии 1.339+ приведёт к тому, что ресурсы sidecar-контейнеров будут отсутствовать в метрике.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Сценарий&lt;br /&gt;
!&amp;#039;&amp;#039;&amp;#039;АктивныйШлюз&amp;#039;&amp;#039;&amp;#039; версии 1.339+&lt;br /&gt;
!&amp;#039;&amp;#039;&amp;#039;АктивныйШлюз&amp;#039;&amp;#039;&amp;#039; версии 1.343+&lt;br /&gt;
!&amp;#039;&amp;#039;&amp;#039;АктивныйШлюз&amp;#039;&amp;#039;&amp;#039; версии 1.345+&lt;br /&gt;
|-&lt;br /&gt;
|App-контейнеры&lt;br /&gt;
|✓&lt;br /&gt;
|✓&lt;br /&gt;
|✓&lt;br /&gt;
|-&lt;br /&gt;
|Нативные sidecar-контейнеры (restartPolicy: Always)&lt;br /&gt;
|✓&lt;br /&gt;
|✓&lt;br /&gt;
|✓&lt;br /&gt;
|-&lt;br /&gt;
|Init-контейнеры (добавлена компенсирующая дельта)&lt;br /&gt;
|—&lt;br /&gt;
|✓&lt;br /&gt;
|✓&lt;br /&gt;
|-&lt;br /&gt;
|Ресурсы уровня пода (spec.resources) — &amp;#039;&amp;#039;&amp;#039;Kubernetes&amp;#039;&amp;#039;&amp;#039; 1.34+ (добавлена компенсирующая дельта)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|✓&lt;br /&gt;
|-&lt;br /&gt;
|Накладные расходы пода (overhead в RuntimeClass) (добавлена компенсирующая дельта)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Как Kubernetes вычисляет эффективные лимиты подов ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kubernetes&amp;#039;&amp;#039;&amp;#039; определяет три типа контейнеров с различными окнами жизненного цикла. Поскольку они работают не одновременно, их вклад в ресурсы нельзя просто суммировать.&lt;br /&gt;
&lt;br /&gt;
Следующий пример показывает под с двумя init-контейнерами и одним app-контейнером. &amp;lt;code&amp;gt;kubectl describe pod&amp;lt;/code&amp;gt; сообщает лимиты каждого контейнера по отдельности; он не вычисляет эффективный лимит на уровне пода.&amp;lt;pre&amp;gt;&lt;br /&gt;
Init Containers:&lt;br /&gt;
  init-step-1:&lt;br /&gt;
    Limits:  cpu: 50m  memory: 32Mi&lt;br /&gt;
&lt;br /&gt;
  init-step-2:&lt;br /&gt;
    Limits:  cpu: 100m  memory: 60Mi&lt;br /&gt;
&lt;br /&gt;
Containers:&lt;br /&gt;
  app:&lt;br /&gt;
    Limits:  cpu: 4m  memory: 32Mi&lt;br /&gt;
&amp;lt;/pre&amp;gt;Эффективный лимит необходимо вывести вручную:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CPU&amp;#039;&amp;#039;&amp;#039;: MAX(MAX(50m, 100m), 4m) = 100m&lt;br /&gt;
* Память: MAX(MAX(32Mi, 60Mi), 32Mi) = 60Mi&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Когда работает&lt;br /&gt;
!Вклад в эффективный лимит пода&lt;br /&gt;
|-&lt;br /&gt;
|App-контейнер&lt;br /&gt;
|Весь жизненный цикл пода&lt;br /&gt;
|Добавляется к SUM фазы выполнения&lt;br /&gt;
|-&lt;br /&gt;
|Нативный sidecar-контейнер (restartPolicy: Always)&lt;br /&gt;
|Запускается во время init-фазы, работает весь жизненный цикл пода&lt;br /&gt;
|Добавляется к SUM фазы выполнения&lt;br /&gt;
|-&lt;br /&gt;
|Init-контейнер&lt;br /&gt;
|Последовательно до запуска app-контейнеров, затем завершается&lt;br /&gt;
|Вносит вклад в MAX init-фазы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;spec.resources&amp;lt;/code&amp;gt; уровня пода&lt;br /&gt;
|Н/Д — бюджет, применяемый ко всему поду&lt;br /&gt;
|Может ограничить эффективный лимит; может увеличить эффективный запрос&lt;br /&gt;
|}&lt;br /&gt;
Нативные sidecar-контейнеры — это init-контейнеры с &amp;lt;code&amp;gt;restartPolicy: Always&amp;lt;/code&amp;gt;, доступные с &amp;#039;&amp;#039;&amp;#039;Kubernetes&amp;#039;&amp;#039;&amp;#039; 1.29. В отличие от классических init-контейнеров, они не завершаются до запуска приложения — они сохраняются на весь жизненный цикл пода и работают одновременно с app-контейнерами.&lt;br /&gt;
&lt;br /&gt;
Эффективный лимит пода для ресурса:&amp;lt;pre&amp;gt;&lt;br /&gt;
effective limit = MAX(&lt;br /&gt;
    SUM(app containers + sidecar containers),          // running phase&lt;br /&gt;
    MAX(each init container + sidecars running before it)  // init phase&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;Если задан лимит на уровне пода и он ниже суммы фазы выполнения, &amp;#039;&amp;#039;&amp;#039;Kubernetes&amp;#039;&amp;#039;&amp;#039; применяет ограничение на уровне пода.&lt;br /&gt;
&lt;br /&gt;
Спецификация ресурсов на уровне пода (&amp;lt;code&amp;gt;spec.resources&amp;lt;/code&amp;gt;, feature gate PodLevelResources) — это бета-функция, включённая по умолчанию с версии &amp;#039;&amp;#039;&amp;#039;Kubernetes&amp;#039;&amp;#039;&amp;#039; 1.34. Некоторые веб-консоли и &amp;lt;code&amp;gt;kubectl describe node&amp;lt;/code&amp;gt; пока не учитывают ресурсы уровня пода при отображении; значения там могут не отражать то, что применяет &amp;#039;&amp;#039;&amp;#039;Kubernetes&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Как Ключ-АСТРОМ обеспечивает точность ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ключ-АСТРОМ&amp;#039;&amp;#039;&amp;#039; хранит метрики ресурсов на уровне контейнера (&amp;lt;code&amp;gt;dt.kubernetes.container.limits_cpu&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dt.kubernetes.container.requests_memory&amp;lt;/code&amp;gt; и так далее), чтобы сохранить гранулярность по контейнерам. Для большинства подов агрегирование этих метрик по контейнерам даёт правильный итог по поду.&lt;br /&gt;
&lt;br /&gt;
Когда простое агрегирование дало бы неверный эффективный лимит, во время приёма данных в ту же метрику добавляется компенсирующая дельта. Эта дельта делает агрегированный итог правильным, не изменяя отдельные точки данных контейнеров.&lt;br /&gt;
&lt;br /&gt;
Используя тот же пример пода, запрос &amp;lt;code&amp;gt;dt.kubernetes.container.limits_cpu&amp;lt;/code&amp;gt; по контейнеру показывает:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!k8s.container.name&lt;br /&gt;
!k8s.container.type&lt;br /&gt;
!cpu_millicore&lt;br /&gt;
!mem_mib&lt;br /&gt;
|-&lt;br /&gt;
|app&lt;br /&gt;
|app&lt;br /&gt;
|4&lt;br /&gt;
|32&lt;br /&gt;
|-&lt;br /&gt;
|(компенсирующая дельта)&lt;br /&gt;
|—&lt;br /&gt;
|96&lt;br /&gt;
|28&lt;br /&gt;
|-&lt;br /&gt;
|Итого (сумма)&lt;br /&gt;
|&lt;br /&gt;
|100&lt;br /&gt;
|60&lt;br /&gt;
|}&lt;br /&gt;
Строка компенсирующей дельты не имеет имени или типа контейнера. Суммирование по всем строкам даёт правильный эффективный лимит пода, который применяет &amp;#039;&amp;#039;&amp;#039;Kubernetes&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Значение дельты:&lt;br /&gt;
&lt;br /&gt;
* Положительное, когда пик init-фазы (init-контейнеры + уже работающие sidecar-контейнеры) превышает сумму фазы выполнения, или когда запрос уровня пода выше суммы контейнеров.&lt;br /&gt;
* Отрицательное, когда лимит &amp;#039;&amp;#039;&amp;#039;CPU&amp;#039;&amp;#039;&amp;#039; или памяти уровня пода ограничивает итог ниже суммы контейнеров. Это применяется только к лимитам; &amp;#039;&amp;#039;&amp;#039;Kubernetes&amp;#039;&amp;#039;&amp;#039; не позволяет запросам уровня пода быть ниже суммы контейнеров.&lt;br /&gt;
&lt;br /&gt;
Точка данных компенсирующей дельты не имеет размерности &amp;lt;code&amp;gt;dt.smartscape.container&amp;lt;/code&amp;gt;. Её &amp;lt;code&amp;gt;dt.smartscape_source.type&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;K8S_POD&amp;lt;/code&amp;gt;, даже когда дельта происходит из init-контейнера. Это позволяет при необходимости отличать её в запросах.&lt;br /&gt;
&lt;br /&gt;
Нативные sidecar-контейнеры не требуют компенсирующей дельты. Поскольку они работают весь жизненный цикл пода, их вклад линеен и суммируется напрямую со значениями app-контейнеров.&lt;br /&gt;
&lt;br /&gt;
== Проверка расчёта ==&lt;br /&gt;
Чтобы проверить, сохраняются ли точки данных компенсирующей дельты, выполните запрос по размерностям, связанным с контейнером. &amp;lt;code&amp;gt;k8s.cluster.name&amp;lt;/code&amp;gt; и подобные атрибуты — это свойства сущности, а не размерности метрики; используйте поля &amp;lt;code&amp;gt;dt.smartscape.*&amp;lt;/code&amp;gt; для группировки и идентификации дельт. Строки, где &amp;lt;code&amp;gt;dt.smartscape.container&amp;lt;/code&amp;gt; отсутствует, — это точки данных компенсирующей дельты.&amp;lt;pre&amp;gt;&lt;br /&gt;
timeseries sum(dt.kubernetes.container.limits_memory),&lt;br /&gt;
by: { dt.smartscape.k8s_pod, dt.smartscape.container, k8s.container.type }&lt;br /&gt;
&amp;lt;/pre&amp;gt;Чтобы ограничить конкретной рабочей нагрузкой, начните с метрики и присоедините контекст сущности из Smartscape. Присвойте псевдонимы полям &amp;lt;code&amp;gt;k8s.*&amp;lt;/code&amp;gt; внутри подзапроса lookup.&amp;lt;pre&amp;gt;&lt;br /&gt;
timeseries sum(dt.kubernetes.container.limits_memory),&lt;br /&gt;
by: { dt.smartscape.k8s_pod, dt.smartscape.container, k8s.container.type }&lt;br /&gt;
| lookup [&lt;br /&gt;
    smartscapeNodes &amp;quot;*&amp;quot;&lt;br /&gt;
    | filter type == &amp;quot;K8S_POD&amp;quot;&lt;br /&gt;
    | fields id, cluster = k8s.cluster.name, ns = k8s.namespace.name, wl = k8s.workload.name&lt;br /&gt;
  ], sourceField: dt.smartscape.k8s_pod, lookupField: id&lt;br /&gt;
| fieldsAdd cluster = lookup.cluster, ns = lookup.ns, wl = lookup.wl&lt;br /&gt;
| filter cluster == &amp;quot;&amp;lt;cluster-name&amp;gt;&amp;quot; and ns == &amp;quot;&amp;lt;namespace&amp;gt;&amp;quot; and wl == &amp;quot;&amp;lt;workload&amp;gt;&amp;quot;&lt;br /&gt;
| fields dt.smartscape.k8s_pod, dt.smartscape.container, k8s.container.type, cluster, ns, wl&lt;br /&gt;
&amp;lt;/pre&amp;gt;Если компенсирующая дельта отсутствует, проверьте версию &amp;#039;&amp;#039;&amp;#039;АктивныйШлюз&amp;#039;&amp;#039;&amp;#039; и значения свойств.&lt;/div&gt;</summary>
		<author><name>IKuznetsov</name></author>
	</entry>
</feed>