[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"page-ru-/errors/linux/k8s-oomkilled":3,"mdc--9zd190-key":769,"mdc--4q9bt8-key":800,"mdc--9zy5pe-key":816,"mdc-fiiuun-key":846,"mdc--dr6zqa-key":901,"mdc-hc5tx5-key":952,"mdc--kob3e4-key":991,"mdc--re4i69-key":1016,"mdc-jm7v5e-key":1040,"mdc--rbyecn-key":1056,"related-/errors/linux/k8s-pod-pending,/guides/linux/k8s-resource-quotas,/errors/linux/docker-oom":1073},{"id":4,"title":5,"appliesTo":6,"author":11,"body":12,"canonical":695,"code":26,"createdAt":696,"description":697,"difficulty":698,"draft":699,"estimatedTime":700,"extension":701,"faq":702,"howToSteps":715,"howToTotalTime":734,"image":695,"keywords":735,"locale":744,"meta":745,"navigation":746,"path":747,"platform":748,"related":749,"section":753,"seo":754,"severity":755,"stem":756,"summary":757,"tags":758,"twitterCreator":695,"twitterSite":695,"type":767,"updatedAt":696,"__hash__":768},"content_ru/errors/linux/k8s-oomkilled.md","OOMKilled в Kubernetes: причины и быстрое решение",[7,8,9,10],"Kubernetes 1.20+","K3s","OpenShift 4.x","Любое CNCF-совместимое распределение","FixPedia Team",{"type":13,"value":14,"toc":683},"minimark",[15,20,49,52,56,132,136,141,144,341,361,365,368,440,444,447,483,491,498,505,560,577,596,599,603,679],[16,17,19],"h2",{"id":18},"что-означает-ошибка-oomkilled","Что означает ошибка OOMKilled",[21,22,23,27,28,32,33,36,37,40,41,44,45,48],"p",{},[24,25,26],"strong",{},"OOMKilled"," (Out Of Memory Killed) — это состояние контейнера в Kubernetes, означающее, что процесс внутри контейнера был принудительно завершён ядром Linux из-за превышения выделенного лимита памяти (cgroup memory limit). В выводе ",[29,30,31],"code",{},"kubectl get pods"," pod обычно переходит в статус ",[29,34,35],{},"CrashLoopBackOff"," или ",[29,38,39],{},"Error",", а в логах или событии ",[29,42,43],{},"kubectl describe pod"," вы увидите последнюю причину завершения: ",[29,46,47],{},"State: Terminated Reason: OOMKilled",".",[21,50,51],{},"Это системная ошибка, а не ошибка приложения. Kubernetes (через контейнерный рантайм, например, containerd) просто выполняет политику лимитов ресурсов, установленную вами в манифесте.",[16,53,55],{"id":54},"причины-возникновения","Причины возникновения",[57,58,59,77,83,102,116,126],"ol",{},[60,61,62,69,70,73,74,48],"li",{},[24,63,64,65,68],{},"Слишком низкий лимит памяти (",[29,66,67],{},"limits.memory",")",". Самая частая причина. В манифесте указано, например, ",[29,71,72],{},"512Mi",", а приложение в пике требует ",[29,75,76],{},"700Mi",[60,78,79,82],{},[24,80,81],{},"Утечка памяти (memory leak) в приложении",". Приложение постепенно потребляет всё больше RAM, пока не достигнет лимита.",[60,84,85,95,96,98,99,101],{},[24,86,87,88,91,92],{},"Несоответствие ",[29,89,90],{},"requests"," и ",[29,93,94],{},"limits",". Если ",[29,97,90],{}," сильно ниже ",[29,100,94],{},", pod может быть запланирован на узел с малым количеством свободной памяти, что приведёт к быстрому исчерпанию лимита.",[60,103,104,107,108,111,112,115],{},[24,105,106],{},"Неучтённые процессы внутри контейнера",". Фоновые процессы (например, ",[29,109,110],{},"cron",", ",[29,113,114],{},"sidecar","-контейнеры) могут потреблять дополнительную память.",[60,117,118,121,122,125],{},[24,119,120],{},"Проблемы с настройкой JVM/рантайма",". Для Java-приложений неправильно заданный ",[29,123,124],{},"-Xmx"," может привести к тому, что JVM попытается зарезервировать больше памяти, чем разрешено лимитом контейнера, и будет убита сразу.",[60,127,128,131],{},[24,129,130],{},"Использование памяти ядром (kernel memory) или page cache",". В некоторых конфигурациях cgroup учитывается не только память пользовательского пространства (RSS), но и кэш. Интенсивная файловая операция может \"съесть\" лимит.",[16,133,135],{"id":134},"способы-решения","Способы решения",[137,138,140],"h3",{"id":139},"способ-1-увеличение-лимита-памяти-в-манифесте","Способ 1: Увеличение лимита памяти в манифесте",[21,142,143],{},"Это прямое и часто самое быстрое решение.",[57,145,146,149,329,335],{},[60,147,148],{},"Найдите манифест, управляющий pod'ом (Deployment, StatefulSet, DaemonSet).",[60,150,151,152,155,156,158,159,162,163],{},"В секции ",[29,153,154],{},"spec.template.spec.containers[].resources"," увеличьте значения ",[29,157,67],{}," и, что важно, ",[29,160,161],{},"requests.memory",".\n",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-yaml shiki shiki-themes github-light github-dark","apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: myapp\nspec:\n  template:\n    spec:\n      containers:\n      - name: myapp-container\n        image: myapp:latest\n        resources:\n          requests:\n            memory: \"512Mi\"   # Увеличьте это значение\n          limits:\n            memory: \"1Gi\"     # Увеличьте это значение\n","yaml","",[29,171,172,189,200,209,220,228,236,244,252,266,277,285,293,308,316],{"__ignoreMap":169},[173,174,177,181,185],"span",{"class":175,"line":176},"line",1,[173,178,180],{"class":179},"s9eBZ","apiVersion",[173,182,184],{"class":183},"sVt8B",": ",[173,186,188],{"class":187},"sZZnC","apps/v1\n",[173,190,192,195,197],{"class":175,"line":191},2,[173,193,194],{"class":179},"kind",[173,196,184],{"class":183},[173,198,199],{"class":187},"Deployment\n",[173,201,203,206],{"class":175,"line":202},3,[173,204,205],{"class":179},"metadata",[173,207,208],{"class":183},":\n",[173,210,212,215,217],{"class":175,"line":211},4,[173,213,214],{"class":179},"  name",[173,216,184],{"class":183},[173,218,219],{"class":187},"myapp\n",[173,221,223,226],{"class":175,"line":222},5,[173,224,225],{"class":179},"spec",[173,227,208],{"class":183},[173,229,231,234],{"class":175,"line":230},6,[173,232,233],{"class":179},"  template",[173,235,208],{"class":183},[173,237,239,242],{"class":175,"line":238},7,[173,240,241],{"class":179},"    spec",[173,243,208],{"class":183},[173,245,247,250],{"class":175,"line":246},8,[173,248,249],{"class":179},"      containers",[173,251,208],{"class":183},[173,253,255,258,261,263],{"class":175,"line":254},9,[173,256,257],{"class":183},"      - ",[173,259,260],{"class":179},"name",[173,262,184],{"class":183},[173,264,265],{"class":187},"myapp-container\n",[173,267,269,272,274],{"class":175,"line":268},10,[173,270,271],{"class":179},"        image",[173,273,184],{"class":183},[173,275,276],{"class":187},"myapp:latest\n",[173,278,280,283],{"class":175,"line":279},11,[173,281,282],{"class":179},"        resources",[173,284,208],{"class":183},[173,286,288,291],{"class":175,"line":287},12,[173,289,290],{"class":179},"          requests",[173,292,208],{"class":183},[173,294,296,299,301,304],{"class":175,"line":295},13,[173,297,298],{"class":179},"            memory",[173,300,184],{"class":183},[173,302,303],{"class":187},"\"512Mi\"",[173,305,307],{"class":306},"sJ8bj","   # Увеличьте это значение\n",[173,309,311,314],{"class":175,"line":310},14,[173,312,313],{"class":179},"          limits",[173,315,208],{"class":183},[173,317,319,321,323,326],{"class":175,"line":318},15,[173,320,298],{"class":179},[173,322,184],{"class":183},[173,324,325],{"class":187},"\"1Gi\"",[173,327,328],{"class":306},"     # Увеличьте это значение\n",[60,330,331,332,48],{},"Примените изменения: ",[29,333,334],{},"kubectl apply -f deployment.yaml",[60,336,337,338,48],{},"Следите за перезапуском pod'а: ",[29,339,340],{},"kubectl rollout status deployment/myapp",[342,343,344],"blockquote",{},[21,345,346,347,350,351,353,354,357,358,360],{},"💡 ",[24,348,349],{},"Совет:"," Устанавливайте ",[29,352,94],{}," в 1.5-2 раза выше пикового потребления, которое вы оценили через ",[29,355,356],{},"kubectl top",". ",[29,359,90],{}," должен быть близок к среднему потреблению для корректного планирования.",[137,362,364],{"id":363},"способ-2-оптимизация-приложения-и-образа","Способ 2: Оптимизация приложения и образа",[21,366,367],{},"Если вы не хотите бесконечно увеличивать лимиты, нужно уменьшать потребление.",[57,369,370,403,421,434],{},[60,371,372,375,376],{},[24,373,374],{},"Профилирование памяти",". Запустите контейнер с отладкой.\n",[377,378,379,388,394],"ul",{},[60,380,381,382,36,385,48],{},"Для Java: ",[29,383,384],{},"jcmd \u003CPID> VM.native_memory summary",[29,386,387],{},"jmap -histo",[60,389,390,391,48],{},"Для Go: ",[29,392,393],{},"go tool pprof http://\u003Cpod-ip>:6060/debug/pprof/heap",[60,395,396,397,36,400,48],{},"Для Python: ",[29,398,399],{},"tracemalloc",[29,401,402],{},"memory-profiler",[60,404,405,408,409,411,412,415,416,418,419,48],{},[24,406,407],{},"Настройка JVM",". Если приложение на Java, явно задайте максимальный размер heap через ",[29,410,124],{},", например, ",[29,413,414],{},"-Xmx800m",". Убедитесь, что ",[29,417,124],{}," + метапространство + стек потока \u003C ",[29,420,67],{},[60,422,423,426,427,111,430,433],{},[24,424,425],{},"Уменьшение размера образа",". Используйте multi-stage сборки и легковесные базовые образы (",[29,428,429],{},"alpine",[29,431,432],{},"distroless","). Меньше слоёв — меньше накладных расходов на память.",[60,435,436,439],{},[24,437,438],{},"Оптимизация кода и конфигурации",". Уменьшите размеры кэшей (Redis, встроенные), настройте пуллы соединений, проверьте на утечки (открытые файловые дескрипторы, неосвобождаемые объекты).",[137,441,443],{"id":442},"способ-3-проверка-и-корректировка-конфигурации-узла-и-cgroup","Способ 3: Проверка и корректировка конфигурации узла и cgroup",[21,445,446],{},"Иногда проблема не в pod'е, а в конфигурации узла.",[57,448,449,458,470],{},[60,450,451,454,455,48],{},[24,452,453],{},"Проверьте swap на узле",". Kubernetes по умолчанию не рекомендует использовать swap. Если swap включён, система может \"подтормаживать\", а не убивать процессы, что сложнее диагностировать. Лучше отключить: ",[29,456,457],{},"sudo swapoff -a",[60,459,460,357,463,95,466,469],{},[24,461,462],{},"Узнайте версию cgroup",[29,464,465],{},"stat -fc %T /sys/fs/cgroup/",[29,467,468],{},"cgroup2",", убедитесь, что Docker/containerd корректно настроен для работы с ним. Некоторые старые версии рантаймов могут некорректно считать память в cgroup v2.",[60,471,472,475,476,479,480,48],{},[24,473,474],{},"Проверьте общую нагрузку на узел",". Возможно, на узле запущено слишком много pod'ов с высокими лимитами, и физической памяти просто не хватает. Используйте ",[29,477,478],{},"kubectl top node",". Рассмотрите увеличение узлов или настройку ",[29,481,482],{},"ResourceQuota",[137,484,486,487,490],{"id":485},"способ-4-настройка-oomscoreadj-выживание-при-нехватке-на-узле","Способ 4: Настройка ",[29,488,489],{},"oomScoreAdj"," (выживание при нехватке на узле)",[21,492,493,494,497],{},"Этот шаг не решит проблему внутри контейнера, но поможет ",[24,495,496],{},"критически важным pod'ам"," выжить, если память на узле закончится и ядро начнёт убивать процессы.",[21,499,500,501,504],{},"В манифесте pod'а добавьте ",[29,502,503],{},"securityContext",":",[164,506,508],{"className":166,"code":507,"language":168,"meta":169,"style":169},"spec:\n  containers:\n  - name: myapp\n    # ...\n  securityContext:\n    oomScoreAdj: -999  # Минимальный приоритет на убийство (только для Linux)\n",[29,509,510,516,523,534,539,546],{"__ignoreMap":169},[173,511,512,514],{"class":175,"line":176},[173,513,225],{"class":179},[173,515,208],{"class":183},[173,517,518,521],{"class":175,"line":191},[173,519,520],{"class":179},"  containers",[173,522,208],{"class":183},[173,524,525,528,530,532],{"class":175,"line":202},[173,526,527],{"class":183},"  - ",[173,529,260],{"class":179},[173,531,184],{"class":183},[173,533,219],{"class":187},[173,535,536],{"class":175,"line":211},[173,537,538],{"class":306},"    # ...\n",[173,540,541,544],{"class":175,"line":222},[173,542,543],{"class":179},"  securityContext",[173,545,208],{"class":183},[173,547,548,551,553,557],{"class":175,"line":230},[173,549,550],{"class":179},"    oomScoreAdj",[173,552,184],{"class":183},[173,554,556],{"class":555},"sj4cs","-999",[173,558,559],{"class":306},"  # Минимальный приоритет на убийство (только для Linux)\n",[21,561,562,563,566,567,569,570,572,573,576],{},"Чем ",[24,564,565],{},"меньше"," значение ",[29,568,489],{}," (от -1000 до 1000), тем ",[24,571,565],{}," шансов, что процесс будет убит первым. По умолчанию у контейнера 0. У ",[29,574,575],{},"kubelet"," и системных процессов — отрицательные значения.",[342,578,579],{},[21,580,581,582,585,586,592,593,595],{},"⚠️ ",[24,583,584],{},"Важно:"," Если pod всё равно получает OOMKilled, это значит, что ",[24,587,588,589],{},"он превысил свой собственный ",[29,590,591],{},"limit",", а не был жертвой общей нехватки на узле. ",[29,594,489],{}," здесь не поможет.",[597,598],"in-article-ad",{},[16,600,602],{"id":601},"профилактика","Профилактика",[57,604,605,623,640,653,673],{},[60,606,607,615,616,618,619,622],{},[24,608,609,610,612,613],{},"Всегда устанавливайте и ",[29,611,90],{},", и ",[29,614,94],{},". Никогда не оставляйте ",[29,617,94],{}," неограниченными (",[29,620,621],{},"unlimited",").",[60,624,625,628,629,632,633,91,636,639],{},[24,626,627],{},"Настройте мониторинг",". Используйте Prometheus + ",[29,630,631],{},"kube-state-metrics"," для сбора метрик ",[29,634,635],{},"kube_pod_container_resource_limits",[29,637,638],{},"container_memory_usage_bytes",". Настройте алерты (Alertmanager) на приближение использования к лимиту (например, >85%).",[60,641,642,645,646,36,649,652],{},[24,643,644],{},"Проводите нагрузочное тестирование",". Перед запуском в продакшене протестируйте приложение с инструментами вроде ",[29,647,648],{},"stress-ng",[29,650,651],{},"hey"," внутри контейнера, чтобы найти реальные пики потребления памяти.",[60,654,655,664,665,91,667,357,669,672],{},[24,656,657,658,36,661],{},"Используйте вертикальный автоскейлинг (VPA) в режиме ",[29,659,660],{},"Auto",[29,662,663],{},"Initial",". VPA может автоматически анализировать историческое потребление и рекомендовать (или применять) оптимальные значения ",[29,666,90],{},[29,668,94],{},[24,670,671],{},"Внимание:"," VPA не должен использоваться вместе с HPA на CPU/Memory одновременно без осторожности.",[60,674,675,678],{},[24,676,677],{},"Регулярно обновляйте образы",". Новые версии приложений и их зависимостей часто содержат исправления утечек памяти и оптимизации.",[680,681,682],"style",{},"html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":169,"searchDepth":191,"depth":191,"links":684},[685,686,687,694],{"id":18,"depth":191,"text":19},{"id":54,"depth":191,"text":55},{"id":134,"depth":191,"text":135,"children":688},[689,690,691,692],{"id":139,"depth":202,"text":140},{"id":363,"depth":202,"text":364},{"id":442,"depth":202,"text":443},{"id":485,"depth":202,"text":693},"Способ 4: Настройка oomScoreAdj (выживание при нехватке на узле)",{"id":601,"depth":191,"text":602},null,"2026-02-16 10:29:17","Контейнер завершается с ошибкой OOMKilled? Узнайте, как правильно настроить лимиты памяти, оптимизировать приложение и предотвратить аварийные остановки pod'ов в кластере. Пошаговая инструкция.","medium",false,"15-25 мин","md",[703,706,709,712],{"question":704,"answer":705},"В чём разница между requests и limits памяти, и как они влияют на OOMKilled?","`requests` — это гарантированный объём памяти для pod'а, `limits` — жёсткий потолок. Если контейнер превысит `limits`, ядро Linux убьёт его с сигналом SIGKILL, что и фиксируется как OOMKilled.",{"question":707,"answer":708},"Можно ли полностью отключить лимиты памяти, чтобы избежать OOMKilled?","Технически можно не указывать `limits`, но это антипаттерн. Без лимитов один \"прожорливый\" pod может исчерпать память на узле, что приведёт к остановке других pod'ов и нестабильности кластера.",{"question":710,"answer":711},"Почему приложение в контейнере падает с OOMKilled, хотя на хосте много свободной RAM?","Возможные причины: 1) Слишком низкий `limit` в манифесте pod'а. 2) Узость cgroup v1/v2. 3) Учёт памяти ядром (kernel memory) или page cache. Проверьте `kubectl describe pod` на событие `OOMKilled` и метрики использования.",{"question":713,"answer":714},"Какой инструмент лучше всего использовать для анализа утечек памяти в pod'е?","Для Java-приложений — `jcmd`/`jmap`. Для Go — `pprof`. Универсальный вариант — запуск контейнера с утилитой `top`/`htop` или `cat /sys/fs/cgroup/memory/memory.usage_in_bytes` (cgroup v1) для мониторинга в реальном времени.",[716,719,722,725,728,731],{"name":717,"text":718},"Определите проблемный pod и проверьте его статус","Выполните `kubectl get pods` и найдите pod в статусе `CrashLoopBackOff` или `Error`. Затем посмотрите детали: `kubectl describe pod \u003Cимя-pod>`. В секции `Events` ищите строку `OOMKilled`.",{"name":720,"text":721},"Проанализируйте текущие лимиты памяти","В выводе `kubectl describe pod` найдите контейнер и его секцию `Limits`. Обратите внимание на значение `memory`. Также проверьте `requests`. Сравните фактические потребление (см. шаг 3).",{"name":723,"text":724},"Оцените фактическое потребление памяти","Используйте `kubectl top pod \u003Cимя-pod>` для получения текущих метрик. Для исторических данных настройте мониторинг (Prometheus + Grafana) или проверьте логи `kubectl logs \u003Cимя-pod> --previous` после перезапуска.",{"name":726,"text":727},"Корректируйте лимиты в манифесте","Откройте YAML-манифест pod/deployment/statefulset. Увеличьте значение `spec.containers[].resources.limits.memory` на 30-50% от текущего пикового потребления. Не забывайте увеличивать и `requests` для стабильности планирования.",{"name":729,"text":730},"Оптимизируйте приложение внутри контейнера","Если увеличение лимитов нежелательно, начните оптимизацию: уменьшите размер кэшей, настройте JVM-опции (`-Xmx`), используйте более легковесные базовые образы (alpine, distroless), проверьте на утечки памяти.",{"name":732,"text":733},"Настройте OOM Score Adjustment (опционально)","В манифесте добавьте `securityContext: { oomScoreAdj: -999 }` для критически важных pod'ов. Это повысит их \"шанс\" выжить при нехватке памяти на узле, но не решит проблему внутри контейнера.","PT20M",[736,737,738,739,740,741,742,743],"oomkilled kubernetes","контейнер убит oomkilled","k8s oom killed ошибка","превышение лимита памяти pod","как исправить oomkilled","kubernetes memory limit exceeded","pod убит из-за памяти","oomkilled решение","ru_RU",{},true,"/errors/linux/k8s-oomkilled","linux",[750,751,752],"/errors/linux/k8s-pod-pending","/guides/linux/k8s-resource-quotas","/errors/linux/docker-oom","Ошибки Kubernetes",{"title":5,"description":697},"high","errors/linux/k8s-oomkilled","Статья подробно разбирает ошибку OOMKilled в Kubernetes, объясняет её причины (превышение лимитов памяти) и предлагает несколько практических способов решения: от корректировки ресурсов до оптимизации кода приложения.",[759,760,761,762,763,764,765,766],"k8s","kubernetes","oom","память","ресурсы","контейнеры","docker","cluster","error","lbR5_O4YMjLgeHCYKaEtXWG6ElXx8923D8BHpmm5hv8",{"data":770,"body":771},{},{"type":772,"children":773},"root",[774],{"type":775,"tag":21,"props":776,"children":777},"element",{},[778,784,786,791,793,798],{"type":775,"tag":29,"props":779,"children":781},{"className":780},[],[782],{"type":783,"value":90},"text",{"type":783,"value":785}," — это гарантированный объём памяти для pod'а, ",{"type":775,"tag":29,"props":787,"children":789},{"className":788},[],[790],{"type":783,"value":94},{"type":783,"value":792}," — жёсткий потолок. Если контейнер превысит ",{"type":775,"tag":29,"props":794,"children":796},{"className":795},[],[797],{"type":783,"value":94},{"type":783,"value":799},", ядро Linux убьёт его с сигналом SIGKILL, что и фиксируется как OOMKilled.",{"data":801,"body":802},{},{"type":772,"children":803},[804],{"type":775,"tag":21,"props":805,"children":806},{},[807,809,814],{"type":783,"value":808},"Технически можно не указывать ",{"type":775,"tag":29,"props":810,"children":812},{"className":811},[],[813],{"type":783,"value":94},{"type":783,"value":815},", но это антипаттерн. Без лимитов один \"прожорливый\" pod может исчерпать память на узле, что приведёт к остановке других pod'ов и нестабильности кластера.",{"data":817,"body":818},{},{"type":772,"children":819},[820],{"type":775,"tag":21,"props":821,"children":822},{},[823,825,830,832,837,839,844],{"type":783,"value":824},"Возможные причины: 1) Слишком низкий ",{"type":775,"tag":29,"props":826,"children":828},{"className":827},[],[829],{"type":783,"value":591},{"type":783,"value":831}," в манифесте pod'а. 2) Узость cgroup v1/v2. 3) Учёт памяти ядром (kernel memory) или page cache. Проверьте ",{"type":775,"tag":29,"props":833,"children":835},{"className":834},[],[836],{"type":783,"value":43},{"type":783,"value":838}," на событие ",{"type":775,"tag":29,"props":840,"children":842},{"className":841},[],[843],{"type":783,"value":26},{"type":783,"value":845}," и метрики использования.",{"data":847,"body":848},{},{"type":772,"children":849},[850],{"type":775,"tag":21,"props":851,"children":852},{},[853,855,861,863,869,871,877,879,885,886,892,893,899],{"type":783,"value":854},"Для Java-приложений — ",{"type":775,"tag":29,"props":856,"children":858},{"className":857},[],[859],{"type":783,"value":860},"jcmd",{"type":783,"value":862},"/",{"type":775,"tag":29,"props":864,"children":866},{"className":865},[],[867],{"type":783,"value":868},"jmap",{"type":783,"value":870},". Для Go — ",{"type":775,"tag":29,"props":872,"children":874},{"className":873},[],[875],{"type":783,"value":876},"pprof",{"type":783,"value":878},". Универсальный вариант — запуск контейнера с утилитой ",{"type":775,"tag":29,"props":880,"children":882},{"className":881},[],[883],{"type":783,"value":884},"top",{"type":783,"value":862},{"type":775,"tag":29,"props":887,"children":889},{"className":888},[],[890],{"type":783,"value":891},"htop",{"type":783,"value":36},{"type":775,"tag":29,"props":894,"children":896},{"className":895},[],[897],{"type":783,"value":898},"cat /sys/fs/cgroup/memory/memory.usage_in_bytes",{"type":783,"value":900}," (cgroup v1) для мониторинга в реальном времени.",{"data":902,"body":903},{},{"type":772,"children":904},[905],{"type":775,"tag":21,"props":906,"children":907},{},[908,910,915,917,922,923,928,930,936,938,944,946,951],{"type":783,"value":909},"Выполните ",{"type":775,"tag":29,"props":911,"children":913},{"className":912},[],[914],{"type":783,"value":31},{"type":783,"value":916}," и найдите pod в статусе ",{"type":775,"tag":29,"props":918,"children":920},{"className":919},[],[921],{"type":783,"value":35},{"type":783,"value":36},{"type":775,"tag":29,"props":924,"children":926},{"className":925},[],[927],{"type":783,"value":39},{"type":783,"value":929},". Затем посмотрите детали: ",{"type":775,"tag":29,"props":931,"children":933},{"className":932},[],[934],{"type":783,"value":935},"kubectl describe pod \u003Cимя-pod>",{"type":783,"value":937},". В секции ",{"type":775,"tag":29,"props":939,"children":941},{"className":940},[],[942],{"type":783,"value":943},"Events",{"type":783,"value":945}," ищите строку ",{"type":775,"tag":29,"props":947,"children":949},{"className":948},[],[950],{"type":783,"value":26},{"type":783,"value":48},{"data":953,"body":954},{},{"type":772,"children":955},[956],{"type":775,"tag":21,"props":957,"children":958},{},[959,961,966,968,974,976,982,984,989],{"type":783,"value":960},"В выводе ",{"type":775,"tag":29,"props":962,"children":964},{"className":963},[],[965],{"type":783,"value":43},{"type":783,"value":967}," найдите контейнер и его секцию ",{"type":775,"tag":29,"props":969,"children":971},{"className":970},[],[972],{"type":783,"value":973},"Limits",{"type":783,"value":975},". Обратите внимание на значение ",{"type":775,"tag":29,"props":977,"children":979},{"className":978},[],[980],{"type":783,"value":981},"memory",{"type":783,"value":983},". Также проверьте ",{"type":775,"tag":29,"props":985,"children":987},{"className":986},[],[988],{"type":783,"value":90},{"type":783,"value":990},". Сравните фактические потребление (см. шаг 3).",{"data":992,"body":993},{},{"type":772,"children":994},[995],{"type":775,"tag":21,"props":996,"children":997},{},[998,1000,1006,1008,1014],{"type":783,"value":999},"Используйте ",{"type":775,"tag":29,"props":1001,"children":1003},{"className":1002},[],[1004],{"type":783,"value":1005},"kubectl top pod \u003Cимя-pod>",{"type":783,"value":1007}," для получения текущих метрик. Для исторических данных настройте мониторинг (Prometheus + Grafana) или проверьте логи ",{"type":775,"tag":29,"props":1009,"children":1011},{"className":1010},[],[1012],{"type":783,"value":1013},"kubectl logs \u003Cимя-pod> --previous",{"type":783,"value":1015}," после перезапуска.",{"data":1017,"body":1018},{},{"type":772,"children":1019},[1020],{"type":775,"tag":21,"props":1021,"children":1022},{},[1023,1025,1031,1033,1038],{"type":783,"value":1024},"Откройте YAML-манифест pod/deployment/statefulset. Увеличьте значение ",{"type":775,"tag":29,"props":1026,"children":1028},{"className":1027},[],[1029],{"type":783,"value":1030},"spec.containers[].resources.limits.memory",{"type":783,"value":1032}," на 30-50% от текущего пикового потребления. Не забывайте увеличивать и ",{"type":775,"tag":29,"props":1034,"children":1036},{"className":1035},[],[1037],{"type":783,"value":90},{"type":783,"value":1039}," для стабильности планирования.",{"data":1041,"body":1042},{},{"type":772,"children":1043},[1044],{"type":775,"tag":21,"props":1045,"children":1046},{},[1047,1049,1054],{"type":783,"value":1048},"Если увеличение лимитов нежелательно, начните оптимизацию: уменьшите размер кэшей, настройте JVM-опции (",{"type":775,"tag":29,"props":1050,"children":1052},{"className":1051},[],[1053],{"type":783,"value":124},{"type":783,"value":1055},"), используйте более легковесные базовые образы (alpine, distroless), проверьте на утечки памяти.",{"data":1057,"body":1058},{},{"type":772,"children":1059},[1060],{"type":775,"tag":21,"props":1061,"children":1062},{},[1063,1065,1071],{"type":783,"value":1064},"В манифесте добавьте ",{"type":775,"tag":29,"props":1066,"children":1068},{"className":1067},[],[1069],{"type":783,"value":1070},"securityContext: { oomScoreAdj: -999 }",{"type":783,"value":1072}," для критически важных pod'ов. Это повысит их \"шанс\" выжить при нехватке памяти на узле, но не решит проблему внутри контейнера.",[1074,2061],{"id":1075,"title":1076,"appliesTo":1077,"author":11,"body":1081,"canonical":695,"code":1092,"createdAt":2006,"description":2007,"difficulty":698,"draft":699,"estimatedTime":2008,"extension":701,"faq":2009,"howToSteps":2021,"howToTotalTime":2034,"image":695,"keywords":2035,"locale":744,"meta":2046,"navigation":746,"path":750,"platform":2047,"related":2048,"section":753,"seo":2052,"severity":755,"stem":2053,"summary":2054,"tags":2055,"twitterCreator":695,"twitterSite":695,"type":767,"updatedAt":2006,"__hash__":2060},"content_ru/errors/linux/k8s-pod-pending.md","K8s Pod Pending: причины и быстрые решения",[7,1078,1079,1080],"Minikube 1.25+","k3s 1.20+","OpenShift 4.6+",{"type":13,"value":1082,"toc":1994},[1083,1087,1098,1101,1157,1160,1162,1165,1267,1269,1276,1282,1412,1414,1418,1425,1530,1534,1537,1751,1754,1772,1776,1779,1939,1941,1944,1988,1991],[16,1084,1086],{"id":1085},"что-означает-состояние-pending-у-pod-в-kubernetes","Что означает состояние Pending у Pod в Kubernetes?",[21,1088,1089,1090,1093,1094,1097],{},"Состояние ",[24,1091,1092],{},"Pending"," — это начальный этап жизненного цикла Pod в Kubernetes. Когда вы создаёте Pod (например, через ",[29,1095,1096],{},"kubectl apply -f pod.yaml","), система принимает его, но планировщик (scheduler) ещё не нашёл подходящую ноду для запуска контейнеров. Pod остаётся в этом состоянии, пока не будут выполнены все условия для размещения.",[21,1099,1100],{},"Обычно это выглядит так:",[164,1102,1106],{"className":1103,"code":1104,"language":1105,"meta":169,"style":169},"language-bash shiki shiki-themes github-light github-dark","$ kubectl get pods\nNAME                     READY   STATUS    RESTARTS   AGE\nmyapp-5d89d7c8b9-abcde   0/1     Pending   0          2m\n","bash",[29,1107,1108,1123,1140],{"__ignoreMap":169},[173,1109,1110,1114,1117,1120],{"class":175,"line":176},[173,1111,1113],{"class":1112},"sScJk","$",[173,1115,1116],{"class":187}," kubectl",[173,1118,1119],{"class":187}," get",[173,1121,1122],{"class":187}," pods\n",[173,1124,1125,1128,1131,1134,1137],{"class":175,"line":191},[173,1126,1127],{"class":1112},"NAME",[173,1129,1130],{"class":187},"                     READY",[173,1132,1133],{"class":187},"   STATUS",[173,1135,1136],{"class":187},"    RESTARTS",[173,1138,1139],{"class":187},"   AGE\n",[173,1141,1142,1145,1148,1151,1154],{"class":175,"line":202},[173,1143,1144],{"class":1112},"myapp-5d89d7c8b9-abcde",[173,1146,1147],{"class":187},"   0/1",[173,1149,1150],{"class":187},"     Pending",[173,1152,1153],{"class":555},"   0",[173,1155,1156],{"class":187},"          2m\n",[21,1158,1159],{},"Если Pod завис в Pending надолго (несколько минут и более), это указывает на проблему, которая мешает планировщику выбрать ноду. Давайте разберём основные причины и решения.",[16,1161,55],{"id":54},[21,1163,1164],{},"Вот наиболее частые причины, по которым Pod не покидает состояние Pending:",[57,1166,1167,1180,1192,1210,1229,1240,1252],{},[60,1168,1169,1172,1175,1176,1179],{},[24,1170,1171],{},"Недостаток ресурсов на нодах",[1173,1174],"br",{},"\nPod запрашивает через ",[29,1177,1178],{},"resources.requests"," больше CPU или памяти, чем доступно на любых нодах в кластере. Например, если все ноды имеют 2 ГБ свободной памяти, а Pod запрашивает 4 ГБ, он не будет запланирован.",[60,1181,1182,1185,1187,1188,1191],{},[24,1183,1184],{},"Несоответствие taints и tolerations",[1173,1186],{},"\nНоды могут иметь taints (например, ",[29,1189,1190],{},"dedicated=production:NoSchedule","), которые repel Pod без соответствующих tolerations в манифесте. Если Pod не имеет tolerations для таких taints, планировщик его не разместит.",[60,1193,1194,1197,1199,1200,91,1203,1206,1207,1209],{},[24,1195,1196],{},"Проблемы с PersistentVolumeClaim (PVC)",[1173,1198],{},"\nЕсли Pod требует тома через ",[29,1201,1202],{},"volumeMounts",[29,1204,1205],{},"persistentVolumeClaim.claimName",", а соответствующий PVC находится в состоянии ",[29,1208,1092],{}," (например, нет доступного PV или класс хранения недоступен), то Pod тоже останется в Pending.",[60,1211,1212,1215,1217,1218,111,1221,1224,1225,1228],{},[24,1213,1214],{},"Node selector, affinity, или anti-affinity",[1173,1216],{},"\nУсловия в ",[29,1219,1220],{},"spec.nodeSelector",[29,1222,1223],{},"spec.affinity"," могут быть слишком строгими. Например, если вы указали ",[29,1226,1227],{},"nodeSelector: {disktype: ssd}",", но ни одна нода не имеет такой метки, Pod не будет запланирован.",[60,1230,1231,1234,1236,1237,1239],{},[24,1232,1233],{},"Исчерпание ResourceQuota",[1173,1235],{},"\nВ namespace может быть установлен ",[29,1238,482],{},", который ограничивает общее количество Pod, CPU или памяти. Если квота превышена, новые Pod останутся в Pending.",[60,1241,1242,1245,1247,1248,1251],{},[24,1243,1244],{},"Ограничение на количество Pod на ноде",[1173,1246],{},"\nПараметр ",[29,1249,1250],{},"maxPods"," в конфигурации kubelet (обычно 110 по умолчанию) может быть достигнут на нодах, и планировщик не сможет добавить ещё Pod.",[60,1253,1254,1257,1259,1260,1263,1264,48],{},[24,1255,1256],{},"Отсутствие подходящих нод",[1173,1258],{},"\nВсе ноды могут быть заблокированы для обслуживания (например, через ",[29,1261,1262],{},"kubectl cordon",") или находятся в состоянии ",[29,1265,1266],{},"NotReady",[16,1268,135],{"id":134},[137,1270,1272,1273],{"id":1271},"способ-1-анализ-событий-pod-с-помощью-kubectl-describe","Способ 1: Анализ событий Pod с помощью ",[29,1274,1275],{},"kubectl describe",[21,1277,1278,1279,1281],{},"Это первый и самый важный шаг. Команда ",[29,1280,43],{}," показывает события (Events), где scheduler объясняет, почему не может разместить Pod.",[57,1283,1284,1315,1364],{},[60,1285,1286,1287],{},"Найдите имя Pod и namespace:",[164,1288,1290],{"className":1103,"code":1289,"language":1105,"meta":169,"style":169},"kubectl get pods --all-namespaces | grep Pending\n",[29,1291,1292],{"__ignoreMap":169},[173,1293,1294,1297,1299,1302,1305,1309,1312],{"class":175,"line":176},[173,1295,1296],{"class":1112},"kubectl",[173,1298,1119],{"class":187},[173,1300,1301],{"class":187}," pods",[173,1303,1304],{"class":555}," --all-namespaces",[173,1306,1308],{"class":1307},"szBVR"," |",[173,1310,1311],{"class":1112}," grep",[173,1313,1314],{"class":187}," Pending\n",[60,1316,1317,1318,91,1321,504,1324],{},"Описайте Pod, заменив ",[29,1319,1320],{},"\u003Cpod-name>",[29,1322,1323],{},"\u003Cnamespace>",[164,1325,1327],{"className":1103,"code":1326,"language":1105,"meta":169,"style":169},"kubectl describe pod \u003Cpod-name> -n \u003Cnamespace>\n",[29,1328,1329],{"__ignoreMap":169},[173,1330,1331,1333,1336,1339,1342,1345,1348,1351,1354,1356,1359,1361],{"class":175,"line":176},[173,1332,1296],{"class":1112},[173,1334,1335],{"class":187}," describe",[173,1337,1338],{"class":187}," pod",[173,1340,1341],{"class":1307}," \u003C",[173,1343,1344],{"class":187},"pod-nam",[173,1346,1347],{"class":183},"e",[173,1349,1350],{"class":1307},">",[173,1352,1353],{"class":555}," -n",[173,1355,1341],{"class":1307},[173,1357,1358],{"class":187},"namespac",[173,1360,1347],{"class":183},[173,1362,1363],{"class":1307},">\n",[60,1365,1366,1367,1369,1370,1377,1379,1380,1383,1384,1386,1387,1404],{},"В выводе найдите раздел ",[24,1368,943],{},". Пример сообщения:",[164,1371,1375],{"className":1372,"code":1374,"language":783},[1373],"language-text","Events:\n  Type    Reason            Age   From               Message\n  ----    ------            ----  ----               -------\n  Normal  Scheduled         5m    default-scheduler  Successfully assigned default/myapp-5d89d7c8b9-abcde to node-1\n  Warning FailedScheduling  4m    default-scheduler  0/3 nodes are available: 3 Insufficient cpu.\n",[29,1376,1374],{"__ignoreMap":169},[1173,1378],{},"Здесь ",[29,1381,1382],{},"Insufficient cpu"," указывает на нехватку CPU.",[1173,1385],{},"Другие возможные сообщения:",[377,1388,1389,1394,1399],{},[60,1390,1391],{},[29,1392,1393],{},"0/3 nodes are available: 3 node(s) had taint {key:value}, that the pod didn't tolerate.",[60,1395,1396],{},[29,1397,1398],{},"0/3 nodes are available: 2 node(s) had volume node affinity conflict.",[60,1400,1401],{},[29,1402,1403],{},"persistentvolumeclaim \"my-pvc\" not found",[342,1405,1406],{},[21,1407,346,1408,1411],{},[24,1409,1410],{},"Совет",": Если событий нет, возможно, Pod ещё не обработан scheduler. Подождите 1-2 минуты и повторите.",[597,1413],{},[137,1415,1417],{"id":1416},"способ-2-проверка-доступности-ресурсов-на-нодах","Способ 2: Проверка доступности ресурсов на нодах",[21,1419,1420,1421,1424],{},"После того как вы узнали причину из событий (например, ",[29,1422,1423],{},"Insufficient memory","), проверьте, сколько ресурсов действительно доступно.",[57,1426,1427,1461,1495],{},[60,1428,1429,1430,1445,1447,1448,1454,1456,1457,1460],{},"Посмотрите общее использование ресурсов нодами:",[164,1431,1433],{"className":1103,"code":1432,"language":1105,"meta":169,"style":169},"kubectl top nodes\n",[29,1434,1435],{"__ignoreMap":169},[173,1436,1437,1439,1442],{"class":175,"line":176},[173,1438,1296],{"class":1112},[173,1440,1441],{"class":187}," top",[173,1443,1444],{"class":187}," nodes\n",[1173,1446],{},"Вывод:",[164,1449,1452],{"className":1450,"code":1451,"language":783},[1373],"NAME     CPU(cores)   MEMORY(bytes)\nnode-1   150m         1900Mi\nnode-2   200m         2100Mi\n",[29,1453,1451],{"__ignoreMap":169},[1173,1455],{},"Обратите внимание на ",[29,1458,1459],{},"MEMORY(bytes)"," — если близко к лимиту ноды, это может быть причиной.",[60,1462,1463,1464,1467,1468,1485,1487,1488,1491,1492,48],{},"Подробно опишите конкретную ноду (например, ",[29,1465,1466],{},"node-1","):",[164,1469,1471],{"className":1103,"code":1470,"language":1105,"meta":169,"style":169},"kubectl describe node node-1\n",[29,1472,1473],{"__ignoreMap":169},[173,1474,1475,1477,1479,1482],{"class":175,"line":176},[173,1476,1296],{"class":1112},[173,1478,1335],{"class":187},[173,1480,1481],{"class":187}," node",[173,1483,1484],{"class":187}," node-1\n",[1173,1486],{},"В разделе ",[29,1489,1490],{},"Allocated resources"," вы увидите, сколько ресурсов уже выделено Pod'ам. Сравните с ",[29,1493,1494],{},"Capacity",[60,1496,1497,1498],{},"Если ресурсы исчерпаны, у вас есть варианты:",[377,1499,1500,1510],{},[60,1501,1502,1505,1506,1509],{},[24,1503,1504],{},"Увеличить ресурсы кластера",": добавить новую ноду (например, через ",[29,1507,1508],{},"kubectl scale --replicas=2 deployment/\u003Cdeployment-name>"," если используется Deployment с автоматическим масштабированием, или вручную в облачном провайдере).",[60,1511,1512,1515,1516,91,1519,1522,1523,1526,1527,48],{},[24,1513,1514],{},"Уменьшить запросы ресурсов в Pod",": отредактируйте манифест Pod, снизьте значения ",[29,1517,1518],{},"resources.requests.cpu",[29,1520,1521],{},"resources.requests.memory",". Например, с ",[29,1524,1525],{},"2Gi"," до ",[29,1528,1529],{},"1Gi",[137,1531,1533],{"id":1532},"способ-3-проверка-и-корректировка-манифеста-pod","Способ 3: Проверка и корректировка манифеста Pod",[21,1535,1536],{},"Часто проблема кроется в самом манифесте Pod или Deployment. Проверьте следующие разделы:",[57,1538,1539,1622,1671,1739],{},[60,1540,1541,1546,1548,1549],{},[24,1542,1543,1544,68],{},"Запросы ресурсов (",[29,1545,1178],{},[1173,1547],{},"\nУбедитесь, что запросы не превышают типичные ресурсы нод. Например, если у вас ноды по 2 ГБ RAM, не запрашивайте 1.5 ГБ на контейнер, если планируете запускать несколько контейнеров.",[164,1550,1552],{"className":166,"code":1551,"language":168,"meta":169,"style":169},"spec:\n  containers:\n  - name: myapp\n    image: myapp:latest\n    resources:\n      requests:\n        memory: \"256Mi\"   # ↓ уменьшите, если нужно\n        cpu: \"250m\"\n",[29,1553,1554,1560,1566,1576,1585,1592,1599,1612],{"__ignoreMap":169},[173,1555,1556,1558],{"class":175,"line":176},[173,1557,225],{"class":179},[173,1559,208],{"class":183},[173,1561,1562,1564],{"class":175,"line":191},[173,1563,520],{"class":179},[173,1565,208],{"class":183},[173,1567,1568,1570,1572,1574],{"class":175,"line":202},[173,1569,527],{"class":183},[173,1571,260],{"class":179},[173,1573,184],{"class":183},[173,1575,219],{"class":187},[173,1577,1578,1581,1583],{"class":175,"line":211},[173,1579,1580],{"class":179},"    image",[173,1582,184],{"class":183},[173,1584,276],{"class":187},[173,1586,1587,1590],{"class":175,"line":222},[173,1588,1589],{"class":179},"    resources",[173,1591,208],{"class":183},[173,1593,1594,1597],{"class":175,"line":230},[173,1595,1596],{"class":179},"      requests",[173,1598,208],{"class":183},[173,1600,1601,1604,1606,1609],{"class":175,"line":238},[173,1602,1603],{"class":179},"        memory",[173,1605,184],{"class":183},[173,1607,1608],{"class":187},"\"256Mi\"",[173,1610,1611],{"class":306},"   # ↓ уменьшите, если нужно\n",[173,1613,1614,1617,1619],{"class":175,"line":246},[173,1615,1616],{"class":179},"        cpu",[173,1618,184],{"class":183},[173,1620,1621],{"class":187},"\"250m\"\n",[60,1623,1624,1627,1629,1630,1661,1663,1664,1667,1668,48],{},[24,1625,1626],{},"Node selector и affinity",[1173,1628],{},"\nПроверьте, не задаёте ли вы слишком специфичные селекторы:",[164,1631,1633],{"className":166,"code":1632,"language":168,"meta":169,"style":169},"spec:\n  nodeSelector:\n    disktype: ssd   # Убедитесь, что ноды имеют такую метку: kubectl get nodes --show-labels\n",[29,1634,1635,1641,1648],{"__ignoreMap":169},[173,1636,1637,1639],{"class":175,"line":176},[173,1638,225],{"class":179},[173,1640,208],{"class":183},[173,1642,1643,1646],{"class":175,"line":191},[173,1644,1645],{"class":179},"  nodeSelector",[173,1647,208],{"class":183},[173,1649,1650,1653,1655,1658],{"class":175,"line":202},[173,1651,1652],{"class":179},"    disktype",[173,1654,184],{"class":183},[173,1656,1657],{"class":187},"ssd",[173,1659,1660],{"class":306},"   # Убедитесь, что ноды имеют такую метку: kubectl get nodes --show-labels\n",[1173,1662],{},"Если метки нет, Pod не будет запланирован. Либо удалите ",[29,1665,1666],{},"nodeSelector",", либо добавьте метку на ноду: ",[29,1669,1670],{},"kubectl label node \u003Cnode-name> disktype=ssd",[60,1672,1673,1676,1678,1679],{},[24,1674,1675],{},"Tolerations",[1173,1677],{},"\nЕсли ноды имеют taints (например, для выделенных рабочих нагрузок), Pod должен иметь соответствующие tolerations:",[164,1680,1682],{"className":166,"code":1681,"language":168,"meta":169,"style":169},"spec:\n  tolerations:\n  - key: \"dedicated\"\n    operator: \"Equal\"\n    value: \"production\"\n    effect: \"NoSchedule\"\n",[29,1683,1684,1690,1697,1709,1719,1729],{"__ignoreMap":169},[173,1685,1686,1688],{"class":175,"line":176},[173,1687,225],{"class":179},[173,1689,208],{"class":183},[173,1691,1692,1695],{"class":175,"line":191},[173,1693,1694],{"class":179},"  tolerations",[173,1696,208],{"class":183},[173,1698,1699,1701,1704,1706],{"class":175,"line":202},[173,1700,527],{"class":183},[173,1702,1703],{"class":179},"key",[173,1705,184],{"class":183},[173,1707,1708],{"class":187},"\"dedicated\"\n",[173,1710,1711,1714,1716],{"class":175,"line":211},[173,1712,1713],{"class":179},"    operator",[173,1715,184],{"class":183},[173,1717,1718],{"class":187},"\"Equal\"\n",[173,1720,1721,1724,1726],{"class":175,"line":222},[173,1722,1723],{"class":179},"    value",[173,1725,184],{"class":183},[173,1727,1728],{"class":187},"\"production\"\n",[173,1730,1731,1734,1736],{"class":175,"line":230},[173,1732,1733],{"class":179},"    effect",[173,1735,184],{"class":183},[173,1737,1738],{"class":187},"\"NoSchedule\"\n",[60,1740,1741,1744,1746,1747,1750],{},[24,1742,1743],{},"Affinity/anti-affinity",[1173,1745],{},"\nСложные правила affinity могут не находить подходящих нод. Временно упростите или удалите ",[29,1748,1749],{},"affinity"," раздел, чтобы проверить.",[21,1752,1753],{},"После изменений примените манифест:",[164,1755,1757],{"className":1103,"code":1756,"language":1105,"meta":169,"style":169},"kubectl apply -f pod.yaml\n",[29,1758,1759],{"__ignoreMap":169},[173,1760,1761,1763,1766,1769],{"class":175,"line":176},[173,1762,1296],{"class":1112},[173,1764,1765],{"class":187}," apply",[173,1767,1768],{"class":555}," -f",[173,1770,1771],{"class":187}," pod.yaml\n",[137,1773,1775],{"id":1774},"способ-4-проверка-persistentvolumeclaim-pvc-и-resourcequota","Способ 4: Проверка PersistentVolumeClaim (PVC) и ResourceQuota",[21,1777,1778],{},"Если Pod использует хранилище, убедитесь, что PVC готово.",[57,1780,1781,1869],{},[60,1782,1783,1784,1808,1810,1811,1813,1814,1846,1848,1849,1863,1865,1866,1868],{},"Проверьте статус PVC:",[164,1785,1787],{"className":1103,"code":1786,"language":1105,"meta":169,"style":169},"kubectl get pvc -n \u003Cnamespace>\n",[29,1788,1789],{"__ignoreMap":169},[173,1790,1791,1793,1795,1798,1800,1802,1804,1806],{"class":175,"line":176},[173,1792,1296],{"class":1112},[173,1794,1119],{"class":187},[173,1796,1797],{"class":187}," pvc",[173,1799,1353],{"class":555},[173,1801,1341],{"class":1307},[173,1803,1358],{"class":187},[173,1805,1347],{"class":183},[173,1807,1363],{"class":1307},[1173,1809],{},"Если PVC в состоянии ",[29,1812,1092],{},", проблема с томом. Описайте его:",[164,1815,1817],{"className":1103,"code":1816,"language":1105,"meta":169,"style":169},"kubectl describe pvc \u003Cpvc-name> -n \u003Cnamespace>\n",[29,1818,1819],{"__ignoreMap":169},[173,1820,1821,1823,1825,1827,1829,1832,1834,1836,1838,1840,1842,1844],{"class":175,"line":176},[173,1822,1296],{"class":1112},[173,1824,1335],{"class":187},[173,1826,1797],{"class":187},[173,1828,1341],{"class":1307},[173,1830,1831],{"class":187},"pvc-nam",[173,1833,1347],{"class":183},[173,1835,1350],{"class":1307},[173,1837,1353],{"class":555},[173,1839,1341],{"class":1307},[173,1841,1358],{"class":187},[173,1843,1347],{"class":183},[173,1845,1363],{"class":1307},[1173,1847],{},"Возможные причины:",[377,1850,1851,1857,1860],{},[60,1852,1853,1854,622],{},"Нет доступного PersistentVolume (PV) с подходящим классом хранения (",[29,1855,1856],{},"storageClassName",[60,1858,1859],{},"PV существует, но уже привязан к другому PVC.",[60,1861,1862],{},"Класс хранения не поддерживается в кластере.",[1173,1864],{},"Решение: создать соответствующий PV, изменить ",[29,1867,1856],{}," в PVC или использовать динамическое provisioning.",[60,1870,1871,1872,1923,1925,1926,91,1929,1932,1933,1935,1936,1938],{},"Проверьте ResourceQuota в namespace:",[164,1873,1875],{"className":1103,"code":1874,"language":1105,"meta":169,"style":169},"kubectl get resourcequota -n \u003Cnamespace>\nkubectl describe resourcequota \u003Cquota-name> -n \u003Cnamespace>\n",[29,1876,1877,1896],{"__ignoreMap":169},[173,1878,1879,1881,1883,1886,1888,1890,1892,1894],{"class":175,"line":176},[173,1880,1296],{"class":1112},[173,1882,1119],{"class":187},[173,1884,1885],{"class":187}," resourcequota",[173,1887,1353],{"class":555},[173,1889,1341],{"class":1307},[173,1891,1358],{"class":187},[173,1893,1347],{"class":183},[173,1895,1363],{"class":1307},[173,1897,1898,1900,1902,1904,1906,1909,1911,1913,1915,1917,1919,1921],{"class":175,"line":191},[173,1899,1296],{"class":1112},[173,1901,1335],{"class":187},[173,1903,1885],{"class":187},[173,1905,1341],{"class":1307},[173,1907,1908],{"class":187},"quota-nam",[173,1910,1347],{"class":183},[173,1912,1350],{"class":1307},[173,1914,1353],{"class":555},[173,1916,1341],{"class":1307},[173,1918,1358],{"class":187},[173,1920,1347],{"class":183},[173,1922,1363],{"class":1307},[1173,1924],{},"В выводе ищите ",[29,1927,1928],{},"hard",[29,1930,1931],{},"used"," limits. Если ",[29,1934,1931],{}," близко к ",[29,1937,1928],{},", новые Pod не будут создаваться. Увеличьте квоту или удалите лишние ресурсы.",[16,1940,602],{"id":601},[21,1942,1943],{},"Чтобы избежать состояния Pending в будущем:",[377,1945,1946,1955,1961,1970,1976,1982],{},[60,1947,1948,1951,1952,1954],{},[24,1949,1950],{},"Настраивайте запросы ресурсов реалистично",": тестируйте приложение и устанавливайте ",[29,1953,90],{}," на основе фактического использования, а не с запасом 100%.",[60,1956,1957,1960],{},[24,1958,1959],{},"Используйте автоматическое масштабирование кластера",": если вы в облаке, настройте Cluster Autoscaler, который добавляет ноды при нехватке ресурсов.",[60,1962,1963,1966,1967,1969],{},[24,1964,1965],{},"Регулярно мониторьте использование ресурсов",": инструменты вроде ",[29,1968,356],{},", Prometheus + Grafana помогут увидеть тренды и предсказать нехватку.",[60,1971,1972,1975],{},[24,1973,1974],{},"Правильно настраивайте taints/tolerations и affinity",": документируйте, какие ноды для каких workloads предназначены, и проверяйте соответствие.",[60,1977,1978,1981],{},[24,1979,1980],{},"Управляйте квотами ресурсов",": устанавливайте ResourceQuota в namespace с запасом, но не слишком высоким, чтобы избежать \"штурма\" ресурсов.",[60,1983,1984,1987],{},[24,1985,1986],{},"Проверяйте статус хранилища",": убедитесь, что классы хранения (StorageClass) доступны и PV создаются корректно.",[21,1989,1990],{},"Следуя этим рекомендациям, вы значительно снизите вероятность зависания Pod в состоянии Pending и обеспечите стабильную работу ваших приложений в Kubernetes.",[680,1992,1993],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":169,"searchDepth":191,"depth":191,"links":1995},[1996,1997,1998,2005],{"id":1085,"depth":191,"text":1086},{"id":54,"depth":191,"text":55},{"id":134,"depth":191,"text":135,"children":1999},[2000,2002,2003,2004],{"id":1271,"depth":202,"text":2001},"Способ 1: Анализ событий Pod с помощью kubectl describe",{"id":1416,"depth":202,"text":1417},{"id":1532,"depth":202,"text":1533},{"id":1774,"depth":202,"text":1775},{"id":601,"depth":191,"text":602},"2026-02-16 18:45:46","Pod в Kubernetes остаётся в состоянии Pending? Узнайте, как диагностировать и исправить проблему за 5-10 минут. Пошаговые инструкции для Linux.","10-20 мин",[2010,2012,2015,2018],{"question":1086,"answer":2011},"Состояние Pending означает, что Pod был принят системой, но ещё не запланирован на выполнение на любой ноде. Это обычно связано с нехваткой ресурсов или ограничениями.",{"question":2013,"answer":2014},"Как быстро узнать, почему Pod не запускается?","Используйте команду `kubectl describe pod \u003Cимя-пода>` и посмотрите раздел 'Events'. Там будут указаны причины, по которым планировщик не может разместить Pod.",{"question":2016,"answer":2017},"Может ли нехватка памяти на нодах вызвать Pending?","Да, если Pod запрашивает больше памяти, чем доступно на нодах, или если квоты ресурсов исчерпаны, Pod останется в Pending.",{"question":2019,"answer":2020},"Как предотвратить Pending состояние для Pod?","Настройте запросы ресурсов (requests) в манифесте Pod в соответствии с доступными ресурсами, используйте автоматическое масштабирование нод и регулярно проверяйте квоты ресурсов.",[2022,2025,2028,2031],{"name":2023,"text":2024},"Проверьте статус Pod","Выполните `kubectl get pods` и найдите Pod в состоянии Pending. Запишите его имя и namespace.",{"name":2026,"text":2027},"Изучите события Pod","Используйте `kubectl describe pod \u003Cимя-пода> -n \u003Cnamespace>` и посмотрите на раздел 'Events' в выводе. Ищите сообщения от scheduler.",{"name":2029,"text":2030},"Проверьте ресурсы нод","Запустите `kubectl describe nodes` или `kubectl top nodes` чтобы увидеть доступные ресурсы (CPU, memory) на каждой ноде.",{"name":2032,"text":2033},"Анализируйте манифест Pod","Откройте YAML-манифест Pod и проверьте разделы `resources.requests`, `nodeSelector`, `tolerations`, `affinity`. Убедитесь, что запросы реалистичны.","PT15M",[2036,2037,2038,2039,2040,2041,2042,2043,2044,2045],"k8s pod pending","kubernetes pod pending ошибка","pod pending состояние","как исправить pod pending","kubectl describe pod pending","k8s pod не планируется","pending pod reasons kubernetes","kubernetes pod pending ресурсы","minikube pod pending","k3s pod pending",{},"general",[2049,2050,2051],"/errors/linux/k8s-pod-crashloopbackoff","/errors/linux/k8s-imagepullbackoff","/guides/linux/k8s-troubleshooting-pods",{"title":1076,"description":2007},"errors/linux/k8s-pod-pending","Эта статья объясняет, почему Pod не переходит из состояния Pending в Running, и предоставляет проверенные способы устранения.",[760,759,2056,2057,2058,748,1296,2059],"pod","pending","ошибки","scheduler","jklyAMc51wr58eLVduZK19uIflFenuz7ziRNXNGF-BY",{"id":2062,"title":2063,"appliesTo":2064,"author":11,"body":2066,"canonical":695,"code":695,"createdAt":3063,"description":3064,"difficulty":698,"draft":699,"estimatedTime":700,"extension":701,"faq":3065,"howToSteps":3078,"howToTotalTime":734,"image":695,"keywords":3094,"locale":744,"meta":3103,"navigation":746,"path":751,"platform":748,"related":3104,"section":3107,"seo":3108,"severity":698,"stem":3109,"summary":3110,"tags":3111,"twitterCreator":695,"twitterSite":695,"type":3115,"updatedAt":3063,"__hash__":3116},"content_ru/guides/linux/k8s-resource-quotas.md","Настройка Resource Quotas в Kubernetes: контроль ресурсов",[7,2065],"kubectl 1.20+",{"type":13,"value":2067,"toc":3050},[2068,2072,2075,2079,2141,2144,2148,2152,2160,2212,2222,2251,2255,2262,2385,2389,2435,2439,2442,2458,2461,2467,2471,2474,2495,2513,2605,2607,2609,2613,2616,2859,2861,2865,2908,2912,3047],[16,2069,2071],{"id":2070},"введение-зачем-это-нужно","Введение / Зачем это нужно",[21,2073,2074],{},"Resource Quota — это механизм Kubernetes, который ограничивает суммарное потребление вычислительных ресурсов (CPU, память) и количество объектов (поды, сервисы, PersistentVolumeClaims) в рамках одного namespace. Это критически важно в мультитенантных средах, где несколько команд или проектов используют общий кластер. Без квот один \"прожорливый\" проект может исчерпать все ресурсы кластера, что приведёт к сбоям в работе других приложений. С помощью ResourceQuota администратор кластера может гарантировать справедливое распределение и предотвратить \"шумные соседи\".",[16,2076,2078],{"id":2077},"требования-подготовка","Требования / Подготовка",[57,2080,2081,2096,2120],{},[60,2082,2083,2086,2087,2089,2090,36,2093,622],{},[24,2084,2085],{},"Доступ к кластеру Kubernetes:"," У вас должен быть настроенный ",[29,2088,1296],{}," с правами на создание ресурсов в целевом namespace (обычно требуются права ",[29,2091,2092],{},"admin",[29,2094,2095],{},"edit",[60,2097,2098,2101,2102],{},[24,2099,2100],{},"Существующий namespace:"," Если тестового namespace нет, создайте его:\n",[164,2103,2105],{"className":1103,"code":2104,"language":1105,"meta":169,"style":169},"kubectl create namespace test-quota\n",[29,2106,2107],{"__ignoreMap":169},[173,2108,2109,2111,2114,2117],{"class":175,"line":176},[173,2110,1296],{"class":1112},[173,2112,2113],{"class":187}," create",[173,2115,2116],{"class":187}," namespace",[173,2118,2119],{"class":187}," test-quota\n",[60,2121,2122,2125,2126,2128,2129,2131,2132,111,2135,111,2138,48],{},[24,2123,2124],{},"Понимание базовых концепций:"," Знание о запросах (",[29,2127,90],{},") и лимитах (",[29,2130,94],{},") для контейнеров, а также о таких ресурсах, как ",[29,2133,2134],{},"pods",[29,2136,2137],{},"services",[29,2139,2140],{},"persistentvolumeclaims",[2142,2143],"hr",{},[16,2145,2147],{"id":2146},"пошаговая-инструкция","Пошаговая инструкция",[137,2149,2151],{"id":2150},"шаг-1-определение-политики-квоты","Шаг 1: Определение политики квоты",[21,2153,2154,2155,2157,2158,504],{},"Прежде чем писать манифест, решите, какие именно ресурсы и в каком объёме нужно ограничить. Типичные параметры для ",[29,2156,1928],{}," (жёсткий лимит) в ",[29,2159,482],{},[377,2161,2162,2172,2179,2188,2194,2200,2206],{},[60,2163,2164,2167,2168,2171],{},[29,2165,2166],{},"requests.cpu"," — Суммарные ",[24,2169,2170],{},"запросы"," на CPU для всех подов в namespace.",[60,2173,2174,2167,2176,2178],{},[29,2175,161],{},[24,2177,2170],{}," на память.",[60,2180,2181,2167,2184,2187],{},[29,2182,2183],{},"limits.cpu",[24,2185,2186],{},"лимиты"," на CPU.",[60,2189,2190,2167,2192,2178],{},[29,2191,67],{},[24,2193,2186],{},[60,2195,2196,2199],{},[29,2197,2198],{},"count.pods"," — Максимальное количество подов.",[60,2201,2202,2205],{},[29,2203,2204],{},"count.services"," — Максимальное количество сервисов.",[60,2207,2208,2211],{},[29,2209,2210],{},"count.persistentvolumeclaims"," — Количество PVC.",[21,2213,2214,2217,2218,2221],{},[24,2215,2216],{},"Пример политики:"," Для тестового namespace ",[29,2219,2220],{},"test-quota"," установим:",[377,2223,2224,2230,2236,2242,2248],{},[60,2225,2226,2227,68],{},"Запросы CPU: 2 ядра (",[29,2228,2229],{},"2",[60,2231,2232,2233,68],{},"Запросы памяти: 4 ГиБ (",[29,2234,2235],{},"4Gi",[60,2237,2238,2239,68],{},"Лимиты CPU: 4 ядра (",[29,2240,2241],{},"4",[60,2243,2244,2245,68],{},"Лимиты памяти: 8 ГиБ (",[29,2246,2247],{},"8Gi",[60,2249,2250],{},"Количество подов: 10",[137,2252,2254],{"id":2253},"шаг-2-создание-манифеста-resourcequota","Шаг 2: Создание манифеста ResourceQuota",[21,2256,2257,2258,2261],{},"Создайте файл ",[29,2259,2260],{},"quota.yaml"," со следующим содержимым:",[164,2263,2265],{"className":166,"code":2264,"language":168,"meta":169,"style":169},"apiVersion: v1\nkind: ResourceQuota\nmetadata:\n  name: compute-resources-quota\n  namespace: test-quota  # Укажите ваш namespace\nspec:\n  hard:\n    requests.cpu: \"2\"\n    requests.memory: 4Gi\n    limits.cpu: \"4\"\n    limits.memory: 8Gi\n    count.pods: \"10\"\n    # count.services: \"5\"  # Можно раскомментировать для ограничения сервисов\n    # count.persistentvolumeclaims: \"4\" # Или PVC\n",[29,2266,2267,2276,2285,2291,2300,2312,2318,2325,2335,2345,2355,2365,2375,2380],{"__ignoreMap":169},[173,2268,2269,2271,2273],{"class":175,"line":176},[173,2270,180],{"class":179},[173,2272,184],{"class":183},[173,2274,2275],{"class":187},"v1\n",[173,2277,2278,2280,2282],{"class":175,"line":191},[173,2279,194],{"class":179},[173,2281,184],{"class":183},[173,2283,2284],{"class":187},"ResourceQuota\n",[173,2286,2287,2289],{"class":175,"line":202},[173,2288,205],{"class":179},[173,2290,208],{"class":183},[173,2292,2293,2295,2297],{"class":175,"line":211},[173,2294,214],{"class":179},[173,2296,184],{"class":183},[173,2298,2299],{"class":187},"compute-resources-quota\n",[173,2301,2302,2305,2307,2309],{"class":175,"line":222},[173,2303,2304],{"class":179},"  namespace",[173,2306,184],{"class":183},[173,2308,2220],{"class":187},[173,2310,2311],{"class":306},"  # Укажите ваш namespace\n",[173,2313,2314,2316],{"class":175,"line":230},[173,2315,225],{"class":179},[173,2317,208],{"class":183},[173,2319,2320,2323],{"class":175,"line":238},[173,2321,2322],{"class":179},"  hard",[173,2324,208],{"class":183},[173,2326,2327,2330,2332],{"class":175,"line":246},[173,2328,2329],{"class":179},"    requests.cpu",[173,2331,184],{"class":183},[173,2333,2334],{"class":187},"\"2\"\n",[173,2336,2337,2340,2342],{"class":175,"line":254},[173,2338,2339],{"class":179},"    requests.memory",[173,2341,184],{"class":183},[173,2343,2344],{"class":187},"4Gi\n",[173,2346,2347,2350,2352],{"class":175,"line":268},[173,2348,2349],{"class":179},"    limits.cpu",[173,2351,184],{"class":183},[173,2353,2354],{"class":187},"\"4\"\n",[173,2356,2357,2360,2362],{"class":175,"line":279},[173,2358,2359],{"class":179},"    limits.memory",[173,2361,184],{"class":183},[173,2363,2364],{"class":187},"8Gi\n",[173,2366,2367,2370,2372],{"class":175,"line":287},[173,2368,2369],{"class":179},"    count.pods",[173,2371,184],{"class":183},[173,2373,2374],{"class":187},"\"10\"\n",[173,2376,2377],{"class":175,"line":295},[173,2378,2379],{"class":306},"    # count.services: \"5\"  # Можно раскомментировать для ограничения сервисов\n",[173,2381,2382],{"class":175,"line":310},[173,2383,2384],{"class":306},"    # count.persistentvolumeclaims: \"4\" # Или PVC\n",[21,2386,2387],{},[24,2388,584],{},[377,2390,2391,2402,2428],{},[60,2392,2393,2394,2397,2398,2401],{},"Значения для CPU можно указывать в ",[29,2395,2396],{},"m"," (миллиядрах, например ",[29,2399,2400],{},"500m"," = 0.5 ядра) или в целых числах.",[60,2403,2404,2405,111,2408,111,2411,2414,2415,111,2418,111,2421,2424,2425,48],{},"Значения для памяти используют суффиксы ",[29,2406,2407],{},"Ki",[29,2409,2410],{},"Mi",[29,2412,2413],{},"Gi"," (кратные 1024) или ",[29,2416,2417],{},"K",[29,2419,2420],{},"M",[29,2422,2423],{},"G"," (кратные 1000). Рекомендуется ",[29,2426,2427],{},"Gi/Mi",[60,2429,2430,2431,2434],{},"Поля ",[29,2432,2433],{},"count.*"," принимают целые числа.",[137,2436,2438],{"id":2437},"шаг-3-применение-квоты-к-namespace","Шаг 3: Применение квоты к namespace",[21,2440,2441],{},"Примените созданный манифест:",[164,2443,2445],{"className":1103,"code":2444,"language":1105,"meta":169,"style":169},"kubectl apply -f quota.yaml\n",[29,2446,2447],{"__ignoreMap":169},[173,2448,2449,2451,2453,2455],{"class":175,"line":176},[173,2450,1296],{"class":1112},[173,2452,1765],{"class":187},[173,2454,1768],{"class":555},[173,2456,2457],{"class":187}," quota.yaml\n",[21,2459,2460],{},"Вы должны увидеть подтверждение:",[164,2462,2465],{"className":2463,"code":2464,"language":783},[1373],"resourcequota/compute-resources-quota created\n",[29,2466,2464],{"__ignoreMap":169},[137,2468,2470],{"id":2469},"шаг-4-проверка-состояния-квоты","Шаг 4: Проверка состояния квоты",[21,2472,2473],{},"Чтобы убедиться, что квота активна и посмотреть текущее использование ресурсов, выполните:",[164,2475,2477],{"className":1103,"code":2476,"language":1105,"meta":169,"style":169},"kubectl describe quota compute-resources-quota -n test-quota\n",[29,2478,2479],{"__ignoreMap":169},[173,2480,2481,2483,2485,2488,2491,2493],{"class":175,"line":176},[173,2482,1296],{"class":1112},[173,2484,1335],{"class":187},[173,2486,2487],{"class":187}," quota",[173,2489,2490],{"class":187}," compute-resources-quota",[173,2492,1353],{"class":555},[173,2494,2119],{"class":187},[21,2496,2497,2498,2501,2502,2505,2506,2508,2509,2512],{},"В выводе вы увидите две таблицы: ",[29,2499,2500],{},"Hard"," (установленные лимиты) и ",[29,2503,2504],{},"Used"," (текущее потребление). Пока что ",[29,2507,2504],{}," будет ",[29,2510,2511],{},"0 / \u003Cvalue>"," для каждого ресурса.",[164,2514,2516],{"className":1103,"code":2515,"language":1105,"meta":169,"style":169},"Name:            compute-resources-quota\nNamespace:       test-quota\nResource         Used  Hard\n--------         ----  ----\nlimits.cpu       0     4\nlimits.memory    0     8Gi\nrequests.cpu     0     2\nrequests.memory  0     4Gi\ncount.pods       0     10\n",[29,2517,2518,2526,2534,2545,2556,2566,2576,2586,2596],{"__ignoreMap":169},[173,2519,2520,2523],{"class":175,"line":176},[173,2521,2522],{"class":1112},"Name:",[173,2524,2525],{"class":187},"            compute-resources-quota\n",[173,2527,2528,2531],{"class":175,"line":191},[173,2529,2530],{"class":1112},"Namespace:",[173,2532,2533],{"class":187},"       test-quota\n",[173,2535,2536,2539,2542],{"class":175,"line":202},[173,2537,2538],{"class":1112},"Resource",[173,2540,2541],{"class":187},"         Used",[173,2543,2544],{"class":187},"  Hard\n",[173,2546,2547,2550,2553],{"class":175,"line":211},[173,2548,2549],{"class":1112},"--------",[173,2551,2552],{"class":555},"         ----",[173,2554,2555],{"class":555},"  ----\n",[173,2557,2558,2560,2563],{"class":175,"line":222},[173,2559,2183],{"class":1112},[173,2561,2562],{"class":555},"       0",[173,2564,2565],{"class":555},"     4\n",[173,2567,2568,2570,2573],{"class":175,"line":230},[173,2569,67],{"class":1112},[173,2571,2572],{"class":555},"    0",[173,2574,2575],{"class":187},"     8Gi\n",[173,2577,2578,2580,2583],{"class":175,"line":238},[173,2579,2166],{"class":1112},[173,2581,2582],{"class":555},"     0",[173,2584,2585],{"class":555},"     2\n",[173,2587,2588,2590,2593],{"class":175,"line":246},[173,2589,161],{"class":1112},[173,2591,2592],{"class":555},"  0",[173,2594,2595],{"class":187},"     4Gi\n",[173,2597,2598,2600,2602],{"class":175,"line":254},[173,2599,2198],{"class":1112},[173,2601,2562],{"class":555},[173,2603,2604],{"class":555},"     10\n",[2142,2606],{},[597,2608],{},[137,2610,2612],{"id":2611},"шаг-5-тестирование-работы-квоты","Шаг 5: Тестирование работы квоты",[21,2614,2615],{},"Теперь попробуйте создать ресурс, который проверит работу квоты. Создайте простой под с явными запросами и лимитами.",[57,2617,2618,2774,2798,2827],{},[60,2619,2620,2625,2765,2767,2768,111,2771,622],{},[24,2621,2257,2622,504],{},[29,2623,2624],{},"test-pod.yaml",[164,2626,2628],{"className":166,"code":2627,"language":168,"meta":169,"style":169},"apiVersion: v1\nkind: Pod\nmetadata:\n  name: quota-test-pod\n  namespace: test-quota\nspec:\n  containers:\n  - name: nginx\n    image: nginx:latest\n    resources:\n      requests:\n        cpu: \"500m\"   # 0.5 ядра\n        memory: \"1Gi\"\n      limits:\n        cpu: \"1\"      # 1 ядро\n        memory: \"2Gi\"\n",[29,2629,2630,2638,2647,2653,2662,2671,2677,2683,2694,2703,2709,2715,2727,2736,2743,2755],{"__ignoreMap":169},[173,2631,2632,2634,2636],{"class":175,"line":176},[173,2633,180],{"class":179},[173,2635,184],{"class":183},[173,2637,2275],{"class":187},[173,2639,2640,2642,2644],{"class":175,"line":191},[173,2641,194],{"class":179},[173,2643,184],{"class":183},[173,2645,2646],{"class":187},"Pod\n",[173,2648,2649,2651],{"class":175,"line":202},[173,2650,205],{"class":179},[173,2652,208],{"class":183},[173,2654,2655,2657,2659],{"class":175,"line":211},[173,2656,214],{"class":179},[173,2658,184],{"class":183},[173,2660,2661],{"class":187},"quota-test-pod\n",[173,2663,2664,2666,2668],{"class":175,"line":222},[173,2665,2304],{"class":179},[173,2667,184],{"class":183},[173,2669,2670],{"class":187},"test-quota\n",[173,2672,2673,2675],{"class":175,"line":230},[173,2674,225],{"class":179},[173,2676,208],{"class":183},[173,2678,2679,2681],{"class":175,"line":238},[173,2680,520],{"class":179},[173,2682,208],{"class":183},[173,2684,2685,2687,2689,2691],{"class":175,"line":246},[173,2686,527],{"class":183},[173,2688,260],{"class":179},[173,2690,184],{"class":183},[173,2692,2693],{"class":187},"nginx\n",[173,2695,2696,2698,2700],{"class":175,"line":254},[173,2697,1580],{"class":179},[173,2699,184],{"class":183},[173,2701,2702],{"class":187},"nginx:latest\n",[173,2704,2705,2707],{"class":175,"line":268},[173,2706,1589],{"class":179},[173,2708,208],{"class":183},[173,2710,2711,2713],{"class":175,"line":279},[173,2712,1596],{"class":179},[173,2714,208],{"class":183},[173,2716,2717,2719,2721,2724],{"class":175,"line":287},[173,2718,1616],{"class":179},[173,2720,184],{"class":183},[173,2722,2723],{"class":187},"\"500m\"",[173,2725,2726],{"class":306},"   # 0.5 ядра\n",[173,2728,2729,2731,2733],{"class":175,"line":295},[173,2730,1603],{"class":179},[173,2732,184],{"class":183},[173,2734,2735],{"class":187},"\"1Gi\"\n",[173,2737,2738,2741],{"class":175,"line":310},[173,2739,2740],{"class":179},"      limits",[173,2742,208],{"class":183},[173,2744,2745,2747,2749,2752],{"class":175,"line":318},[173,2746,1616],{"class":179},[173,2748,184],{"class":183},[173,2750,2751],{"class":187},"\"1\"",[173,2753,2754],{"class":306},"      # 1 ядро\n",[173,2756,2758,2760,2762],{"class":175,"line":2757},16,[173,2759,1603],{"class":179},[173,2761,184],{"class":183},[173,2763,2764],{"class":187},"\"2Gi\"\n",[1173,2766],{},"Этот под запрашивает 0.5 CPU и 1Gi памяти, что вписывается в наши лимиты (",[29,2769,2770],{},"requests.cpu: 2",[29,2772,2773],{},"requests.memory: 4Gi",[60,2775,2776,2779,2795,2797],{},[24,2777,2778],{},"Создайте под:",[164,2780,2782],{"className":1103,"code":2781,"language":1105,"meta":169,"style":169},"kubectl apply -f test-pod.yaml\n",[29,2783,2784],{"__ignoreMap":169},[173,2785,2786,2788,2790,2792],{"class":175,"line":176},[173,2787,1296],{"class":1112},[173,2789,1765],{"class":187},[173,2791,1768],{"class":555},[173,2793,2794],{"class":187}," test-pod.yaml\n",[1173,2796],{},"Под должен успешно создаться.",[60,2799,2800,2803,2821,2823,2824,2826],{},[24,2801,2802],{},"Проверьте обновлённую квоту:",[164,2804,2805],{"className":1103,"code":2476,"language":1105,"meta":169,"style":169},[29,2806,2807],{"__ignoreMap":169},[173,2808,2809,2811,2813,2815,2817,2819],{"class":175,"line":176},[173,2810,1296],{"class":1112},[173,2812,1335],{"class":187},[173,2814,2487],{"class":187},[173,2816,2490],{"class":187},[173,2818,1353],{"class":555},[173,2820,2119],{"class":187},[1173,2822],{},"Теперь в колонке ",[29,2825,2504],{}," появятся значения, соответствующие запросам созданного пода (0.5 CPU, 1Gi памяти).",[60,2828,2829,2832,2833,2835,2836,2838,2839,2842,2843,2845,2846,2849,2850,2856,2858],{},[24,2830,2831],{},"Попробуйте превысить квоту."," Создайте ещё один под, который запросит, например, ",[29,2834,1525],{}," памяти. После применения второго пода, суммарные ",[29,2837,161],{}," станут ",[29,2840,2841],{},"3Gi",". Попробуйте создать третий под с запросом ",[29,2844,1525],{}," памяти. Операция ",[24,2847,2848],{},"провалится"," с ошибкой, похожей на:",[164,2851,2854],{"className":2852,"code":2853,"language":783},[1373],"Error from server (Forbidden): error when creating \"pod2.yaml\": ... \"exceeded quota: compute-resources-quota, requested: requests.memory=2Gi, used: requests.memory=3Gi, limited: requests.memory=4Gi\"\n",[29,2855,2853],{"__ignoreMap":169},[1173,2857],{},"Это доказывает, что квота работает.",[2142,2860],{},[16,2862,2864],{"id":2863},"проверка-результата","Проверка результата",[57,2866,2867,2879,2891],{},[60,2868,2869,2872,2873,2875,2876,2878],{},[24,2870,2871],{},"Основная проверка:"," Вы успешно создали ",[29,2874,482],{}," и наблюдаете за ростом поля ",[29,2877,2504],{}," при создании новых ресурсов (подов, PVC).",[60,2880,2881,2884,2885,2887,2888,48],{},[24,2882,2883],{},"Проверка на превышение:"," Попытка создать ресурс, который приведёт к превышению любого из ",[29,2886,1928],{},"-лимитов, завершается с ошибкой ",[29,2889,2890],{},"exceeded quota",[60,2892,2893,2896,2897,2900,2901,2903,2904,2907],{},[24,2894,2895],{},"Команда статуса:"," ",[29,2898,2899],{},"kubectl get quota -n \u003Cnamespace>"," показывает имя квоты и её ",[29,2902,2500],{}," лимиты. ",[29,2905,2906],{},"kubectl describe quota"," — детализированное использование.",[16,2909,2911],{"id":2910},"возможные-проблемы","Возможные проблемы",[377,2913,2914,2962,2986,3016],{},[60,2915,2916,2922],{},[24,2917,2918,2919,2921],{},"Ошибка ",[29,2920,2890],{}," при создании подa, который, кажется, вписывается в лимиты.",[377,2923,2924,2950],{},[60,2925,2926,2929,2930,2935,2936,91,2938,2896,2940,2944,2945,2947,2948,48],{},[24,2927,2928],{},"Причина:"," ResourceQuota суммирует ",[24,2931,2932,2933,68],{},"запросы (",[29,2934,90],{}," всех подов в namespace. Убедитесь, что сумма ",[29,2937,2166],{},[29,2939,161],{},[2941,2942,2943],"em",{},"всех существующих подов"," плюс запросы нового пода не превысят ",[29,2946,1928],{},"-значения. Проверьте текущее использование через ",[29,2949,2906],{},[60,2951,2952,2955,2956,2958,2959,2961],{},[24,2953,2954],{},"Решение:"," Либо увеличьте значения в ",[29,2957,482],{},", либо уменьшите ",[29,2960,90],{}," в манифесте нового пода.",[60,2963,2964,2967],{},[24,2965,2966],{},"Квота не применяется к уже запущенным подам.",[377,2968,2969,2978],{},[60,2970,2971,2973,2974,2977],{},[24,2972,2928],{}," Это ожидаемое поведение. ResourceQuota проверяет запросы на создание ",[2941,2975,2976],{},"новых"," объектов. Уже работающие поды не затрагиваются.",[60,2979,2980,2982,2983,2985],{},[24,2981,2954],{}," Чтобы включить существующие поды в учёт, необходимо либо вручную удалить и пересоздать их с корректными ",[29,2984,90],{},", либо увеличить квоту до уровня, который покрывает и существующие, и будущие запросы.",[60,2987,2988,2994],{},[24,2989,2990,2991,48],{},"Ошибка при создании ResourceQuota: ",[29,2992,2993],{},"unable to recognize \"...\": no matches for kind \"ResourceQuota\" in version \"v1\"",[377,2995,2996,3004],{},[60,2997,2998,3000,3001,48],{},[24,2999,2928],{}," Обычно указывает на устаревший кластер. В очень старых версиях Kubernetes (до 1.8) ResourceQuota мог быть в ",[29,3002,3003],{},"extensions/v1beta1",[60,3005,3006,3008,3009,3012,3013,48],{},[24,3007,2954],{}," Обновите кластер или используйте корректную apiVersion (",[29,3010,3011],{},"v1"," для Kubernetes 1.8+). Проверьте версию кластера: ",[29,3014,3015],{},"kubectl version --short",[60,3017,3018,3021],{},[24,3019,3020],{},"Неясно, какой именно ресурс исчерпан.",[377,3022,3023,3033],{},[60,3024,3025,3027,3028,3030,3031,622],{},[24,3026,2928],{}," Сообщение об ошибке ",[29,3029,2890],{}," обычно содержит имя квоты и конкретный ресурс, который превышен (например, ",[29,3032,161],{},[60,3034,3035,3037,3038,3041,3042,3044,3045,48],{},[24,3036,2954],{}," Всегда смотрите на имя квоты в ошибке и проверяйте её описание (",[29,3039,3040],{},"kubectl describe quota \u003Cname>",") для сравнения ",[29,3043,2504],{}," vs ",[29,3046,2500],{},[680,3048,3049],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":169,"searchDepth":191,"depth":191,"links":3051},[3052,3053,3054,3061,3062],{"id":2070,"depth":191,"text":2071},{"id":2077,"depth":191,"text":2078},{"id":2146,"depth":191,"text":2147,"children":3055},[3056,3057,3058,3059,3060],{"id":2150,"depth":202,"text":2151},{"id":2253,"depth":202,"text":2254},{"id":2437,"depth":202,"text":2438},{"id":2469,"depth":202,"text":2470},{"id":2611,"depth":202,"text":2612},{"id":2863,"depth":191,"text":2864},{"id":2910,"depth":191,"text":2911},"2026-02-17 14:05:33","Пошаговая инструкция по настройке лимитов ресурсов (CPU, память) для namespace в Kubernetes. Узнайте, как предотвратить исчерпание ресурсов кластера.",[3066,3069,3072,3075],{"question":3067,"answer":3068},"ResourceQuota влияет на уже запущенные поды?","Нет, ResourceQuota применяется только к новым запросам на создание ресурсов (Pod, PVC, Service и т.д.). Существующие поды не будут автоматически удалены или ограничены.",{"question":3070,"answer":3071},"Как проверить текущие квоты namespace?","Используйте команду: `kubectl describe quota -n \u003Cnamespace>`. Она покажет установленные лимиты и текущее использование.",{"question":3073,"answer":3074},"Что происходит, если квота превышена?","Новые запросы на создание ресурсов (например, новый Pod) будут отклоняться API-сервером с ошибкой `exceeded quota`. Существующие ресурсы продолжают работать.",{"question":3076,"answer":3077},"Можно ли установить разные квоты для разных типов ресурсов?","Да, в одном объекте ResourceQuota можно задавать лимиты для requests.cpu, limits.memory, count.of.pods, count.of.services и многих других типов ресурсов одновременно.",[3079,3082,3085,3088,3091],{"name":3080,"text":3081},"Подготовка кластера и namespace","Убедитесь, что у вас есть доступ к кластеру через `kubectl` и создайте тестовый namespace, если его нет.",{"name":3083,"text":3084},"Определение необходимых лимитов","Решите, какие ресурсы (CPU, память, количество объектов) нужно ограничить для namespace. Например: 2 ядра CPU, 4Gi памяти, 10 подов.",{"name":3086,"text":3087},"Создание YAML-манифеста ResourceQuota","Напишите файл `quota.yaml` с определением `ResourceQuota`, указав нужные поля `hard` и (опционально) `scopeSelector`.",{"name":3089,"text":3090},"Применение квоты к namespace","Примените манифест командой `kubectl apply -f quota.yaml -n \u003Cnamespace>`.",{"name":3092,"text":3093},"Проверка применения и тестирование","Попробуйте создать ресурс, который превышает квоту, чтобы убедиться в её работе. Используйте `kubectl describe quota` для просмотра статуса.",[3095,3096,3097,3098,3099,3100,3101,3102],"k8s resource quota","ограничение ресурсов kubernetes","как создать resourcequota","kubernetes namespace quota","лимиты cpu memory k8s","ResourceQuota пример","установка квоты kubernetes","контроль ресурсов namespace",{},[3105,3106],"/guides/linux/k8s-limitrange","/guides/linux/k8s-namespace-management","Гайды Kubernetes",{"title":2063,"description":3064},"guides/linux/k8s-resource-quotas","В этом гайде вы научитесь создавать и применять ResourceQuota в Kubernetes для ограничения потребления CPU и памяти в namespace. Это предотвратит ситуацию, когда один проект monopolizes ресурсы кластера.",[760,759,763,3112,3113,3114],"мониторинг","администрирование","quota","guide","ZkO9_g9zCIKb-7DJ5ro3c442tPPkFEO4Zr05wnfa-nQ"]