<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>LimitRange on Zero Day Notes</title>
        <link>https://blog.5772447.xyz/tags/limitrange/</link>
        <description>Recent content in LimitRange on Zero Day Notes</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Sat, 18 Jul 2026 07:00:00 +0800</lastBuildDate><atom:link href="https://blog.5772447.xyz/tags/limitrange/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>一次 Kubernetes 命名空间 ResourceQuota 配额耗尽导致 Pod 卡在 Pending 的排查记录</title>
            <link>https://blog.5772447.xyz/posts/fb3632b1/</link>
            <pubDate>Sat, 18 Jul 2026 07:00:00 +0800</pubDate>
            <guid>https://blog.5772447.xyz/posts/fb3632b1/</guid>
            <description>&lt;h2 id=&#34;一问题背景&#34;&gt;&lt;a href=&#34;#%e4%b8%80%e9%97%ae%e9%a2%98%e8%83%8c%e6%99%af&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;一、问题背景&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;平台组在多租户的 Kubernetes 集群里给每个业务命名空间（Namespace）统一下发了 &lt;code&gt;ResourceQuota&lt;/code&gt;，把 CPU、内存、Pod 数量等资源的&amp;quot;预算上限&amp;quot;钉死，用来做资源隔离和成本核算——谁超了谁自己负责。这套机制上线大半年一直相安无事，直到某天傍晚一次常规发布，线上突然冒出一批 &lt;code&gt;Pending&lt;/code&gt; 状态的 Pod，发布流水线卡在&amp;quot;等待调度&amp;quot;迟迟不结束。&lt;/p&gt;&#xA;&lt;p&gt;当时这个命名空间跑着一个在线推理服务（白天 2 副本，晚高峰弹性扩到 6 副本）外加几个后台批处理 Job。我们第一反应是节点资源不够，但监控里节点 CPU/内存使用率明明还有富余。问题显然不在&amp;quot;机器没油&amp;quot;，而在&amp;quot;配额被卡了脖子&amp;quot;。&lt;/p&gt;&#xA;&lt;h2 id=&#34;二故障现象&#34;&gt;&lt;a href=&#34;#%e4%ba%8c%e6%95%85%e9%9a%9c%e7%8e%b0%e8%b1%a1&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;二、故障现象&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;故障最直观的表现是：新版本的 Deployment 滚动发布时，只有旧副本被逐批删掉，新副本却始终 &lt;code&gt;Pending&lt;/code&gt;，&lt;code&gt;kubectl get pods -n &amp;lt;ns&amp;gt;&lt;/code&gt; 看到状态长时间停在 &lt;code&gt;ContainerCreating&lt;/code&gt; 之前、直接就是 &lt;code&gt;Pending&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;describe 这些 Pending Pod，Events 区反复刷出一条：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Warning  FailedScheduling  0/20 nodes are available:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  20 node(s) had untolerated taint ... (无关)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  pod &amp;#34;infer-svc-7d9c-&amp;#34; is forbidden:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  exceeded quota: compute-resources,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  requested: cpu=500m, memory=512Mi,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  used: cpu=7800m, memory=14Gi,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  limited: cpu=8, memory=16Gi&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;也就是说：调度器根本没走到&amp;quot;找节点&amp;quot;那一步，就在准入阶段被 &lt;code&gt;ResourceQuota&lt;/code&gt; 的准入控制器（QuotaAdmission）直接拦下了——&lt;code&gt;used&lt;/code&gt; 已经摸到 &lt;code&gt;limited&lt;/code&gt; 的天花板，&lt;code&gt;requested&lt;/code&gt; 再多一点点就超。&lt;/p&gt;&#xA;&lt;p&gt;更迷惑的是，同一时间还有两三个&lt;strong&gt;资源请求极小&lt;/strong&gt;（yaml 里没写 &lt;code&gt;resources.requests&lt;/code&gt;）的辅助 Pod 也卡在 Pending，看 describe 报的 &lt;code&gt;requested: cpu=100m&lt;/code&gt; 这种微不足道的量，却同样 &lt;code&gt;forbidden: exceeded quota&lt;/code&gt;。节点明明有空闲，配额数字也对不上&amp;quot;肉眼可见的用量&amp;quot;，现场一度让人怀疑是集群 bug。&lt;/p&gt;&#xA;&lt;h2 id=&#34;三排查过程&#34;&gt;&lt;a href=&#34;#%e4%b8%89%e6%8e%92%e6%9f%a5%e8%bf%87%e7%a8%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;三、排查过程&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;第一步，确认是不是真超配额。&lt;/strong&gt; 直接看配额实况：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get resourcequota -n &amp;lt;ns&amp;gt; -o yaml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl describe quota compute-resources -n &amp;lt;ns&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;输出里 &lt;code&gt;Status.Hard&lt;/code&gt; 是上限（cpu: 8 / memory: 16Gi / pods: 30），&lt;code&gt;Status.Used&lt;/code&gt; 是已用（cpu: 7800m / memory: 14Gi / pods: 28）。CPU 已用 7.8 核逼近 8 核上限，新 Pod 再要 500m 必然超。这一步坐实了：&lt;strong&gt;不是节点不够，是命名空间配额见顶&lt;/strong&gt;，调度器在准入阶段就拒了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第二步，搞清楚&amp;quot;谁把配额吃没了&amp;quot;。&lt;/strong&gt; 列出该 ns 下所有 Pod 的 requests 累加：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get pods -n &amp;lt;ns&amp;gt; -o custom-columns&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;POD:.metadata.name,CPU_REQ:.spec.containers&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;0&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;.resources.requests.cpu,&lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MEM_REQ:.spec.containers&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;0&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;.resources.requests.memory&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;一眼看清：推理服务晚高峰扩到 6 副本，每副本 &lt;code&gt;cpu: 1.5 / mem: 2Gi&lt;/code&gt;，单这一个服务就吃掉 9 核里的 7.8 核——正是把 CPU 配额顶满的元凶。副本数一涨，request 总量线性叠加，瞬间撞线。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第三步，破解&amp;quot;小 Pod 也 Pending&amp;quot;的反常。&lt;/strong&gt; 那几个没写 &lt;code&gt;resources.requests&lt;/code&gt; 的辅助容器，为什么也要 100m？查该 ns 的 &lt;code&gt;LimitRange&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get limitrange -n &amp;lt;ns&amp;gt; -o yaml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;里面有一条 &lt;code&gt;defaultRequest: cpu: 100m, memory: 128Mi&lt;/code&gt;。&lt;strong&gt;关键点来了&lt;/strong&gt;：当 Pod 不声明 requests 时，LimitRange 会&lt;strong&gt;自动注入默认 request&lt;/strong&gt;；而 &lt;code&gt;ResourceQuota&lt;/code&gt; 统计的是&amp;quot;实际生效的 request&amp;quot;（含被注入的默认值），不是 yaml 里写的。于是这些&amp;quot;看似零请求&amp;quot;的 Pod，每个悄悄占 100m，十几个叠起来又吃掉近 1.5 核，和推理服务的用量凑在一起，把本就不宽裕的配额彻底顶爆。节点有空闲毫无意义——quota 是先于节点调度的硬门槛。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第四步，定位&amp;quot;为什么没人早发现&amp;quot;。&lt;/strong&gt; 翻历史：配额是半年前一次性设的，之后业务多次扩容、加新服务，但&lt;strong&gt;没有任何 quota 使用率的监控和告警&lt;/strong&gt;。团队下意识以为 ResourceQuota &amp;ldquo;只限制 limit、不限制 request&amp;rdquo;，于是不少 yaml 只写了 &lt;code&gt;limits&lt;/code&gt; 没写 &lt;code&gt;requests&lt;/code&gt;，结果 request 被 LimitRange 注入默认值的规则反噬，谁也说不清真实占用。&lt;/p&gt;&#xA;&lt;h2 id=&#34;四解决方案&#34;&gt;&lt;a href=&#34;#%e5%9b%9b%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;四、解决方案&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;止血（分钟级）：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;紧急把推理服务副本从 6 缩回 3（&lt;code&gt;kubectl scale deploy infer-svc --replicas=3 -n &amp;lt;ns&amp;gt;&lt;/code&gt;），立刻释放约 4.5 核，Pending Pod 随之被调度起来，发布流水线恢复。&lt;/li&gt;&#xA;&lt;li&gt;同步给真正重要的几个小服务&lt;strong&gt;显式补上合理的 requests&lt;/strong&gt;（去掉对 LimitRange 默认值的依赖），让配额占用透明可控。&lt;/li&gt;&#xA;&lt;li&gt;临时上调 ResourceQuota 天花板（&lt;code&gt;kubectl edit resourcequota compute-resources -n &amp;lt;ns&amp;gt;&lt;/code&gt;，cpu 8→12），给当晚高峰留缓冲——这是临时措施，不是根治。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;根治（周内）：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;给所有 Deployment 补全 &lt;code&gt;resources.requests/limits&lt;/code&gt;，消除&amp;quot;裸 Pod 靠 LimitRange 兜底&amp;quot;的盲区。&lt;/li&gt;&#xA;&lt;li&gt;把 LimitRange 的 &lt;code&gt;defaultRequest&lt;/code&gt; 调小到与真实负载匹配，避免默认值虚高吃掉配额。&lt;/li&gt;&#xA;&lt;li&gt;按&amp;quot;团队/环境&amp;quot;拆分命名空间，各自独立配额，不再多个团队挤一个 ns 共享预算。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;五根因分析&#34;&gt;&lt;a href=&#34;#%e4%ba%94%e6%a0%b9%e5%9b%a0%e5%88%86%e6%9e%90&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;五、根因分析&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;根因是&lt;strong&gt;对 ResourceQuota 的计量口径理解错误 + 默认注入的隐性放大&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;code&gt;ResourceQuota&lt;/code&gt; 同时约束 &lt;code&gt;requests&lt;/code&gt; 和 &lt;code&gt;limits&lt;/code&gt; 的总量，而不仅仅限制 limit；&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;LimitRange&lt;/code&gt; 对未声明资源的容器会注入 &lt;code&gt;defaultRequest/defaultLimit&lt;/code&gt;，这些值&lt;strong&gt;计入&lt;/strong&gt; ResourceQuota 统计，等于&amp;quot;看不见的请求&amp;quot;也在吃预算；&lt;/li&gt;&#xA;&lt;li&gt;多团队共用一个 namespace 的单一配额，缺乏隔离，任一服务扩容都会挤占他人额度；&lt;/li&gt;&#xA;&lt;li&gt;完全缺失 quota 使用率监控，配额在&amp;quot;温水煮青蛙&amp;quot;中耗尽，直到发布失败才暴露。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;一句话：调度失败的根因不在节点，而在&lt;strong&gt;命名空间级准入控制把资源预算卡死&lt;/strong&gt;，且这个预算被&amp;quot;副本扩容 + 默认注入&amp;quot;两股力量悄悄吃满。&lt;/p&gt;&#xA;&lt;h2 id=&#34;六预防措施&#34;&gt;&lt;a href=&#34;#%e5%85%ad%e9%a2%84%e9%98%b2%e6%8e%aa%e6%96%bd&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;六、预防措施&#xD;&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;配额隔离&lt;/strong&gt;：按团队、按环境拆分命名空间，每个 ns 独立 ResourceQuota，互不挤占；重要业务单独配额。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;LimitRange 收敛&lt;/strong&gt;：把 &lt;code&gt;defaultRequest/defaultLimit&lt;/code&gt; 设为贴近真实的小值，别让&amp;quot;默认值&amp;quot;变成隐性大户；同时用 &lt;code&gt;default&lt;/code&gt; 与 &lt;code&gt;max/min&lt;/code&gt; 约束单容器资源上下限。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;强制声明资源&lt;/strong&gt;：通过准入控制（如 Kyverno/Gatekeeper 策略）禁止无 &lt;code&gt;requests/limits&lt;/code&gt; 的 Pod 入库，杜绝 LimitRange 兜底带来的不透明。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;配额监控告警&lt;/strong&gt;：用 Prometheus 采集 &lt;code&gt;kube_resourcequota&lt;/code&gt; 系列指标，对 &lt;code&gt;used/hard&lt;/code&gt; 超 80% 的命名空间提前告警，把&amp;quot;发布失败&amp;quot;前移成&amp;quot;容量预警&amp;quot;。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;发布前 dry-run&lt;/strong&gt;：CI 里用 &lt;code&gt;kubectl apply --dry-run=server&lt;/code&gt; 配合配额校验，扩容类变更先评估 request 增量是否越线。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;七总结&#34;&gt;&lt;a href=&#34;#%e4%b8%83%e6%80%bb%e7%bb%93&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;七、总结&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;这次故障的教训是：Kubernetes 的资源约束是&lt;strong&gt;多层叠加&lt;/strong&gt;的——ResourceQuota（命名空间预算）、LimitRange（默认值注入）、节点可分配资源（真实算力）各管一段，而调度失败往往出在最上游那道&amp;quot;配额门&amp;quot;上。节点有空闲只是必要条件，命名空间配额见顶照样让 Pod 永远 Pending。&lt;/p&gt;&#xA;&lt;p&gt;排查的核心动作就是三板斧：&lt;code&gt;kubectl describe quota&lt;/code&gt; 看 used vs hard 是否顶满 → &lt;code&gt;kubectl get pods&lt;/code&gt; 累加 requests 找&amp;quot;吃配额的大户&amp;quot; → &lt;code&gt;kubectl get limitrange&lt;/code&gt; 确认是否有默认请求被隐性注入。把配额当预算管、加监控、拆隔离，就能让这类&amp;quot;发布到一半卡住&amp;quot;的事故从偶发变成可预警。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
