<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Calico on Zero Day Notes</title>
        <link>https://blog.5772447.xyz/tags/calico/</link>
        <description>Recent content in Calico on Zero Day Notes</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Tue, 21 Jul 2026 19:00:00 +0800</lastBuildDate><atom:link href="https://blog.5772447.xyz/tags/calico/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>一次 Kubernetes CNI 插件 IP 池耗尽导致新增 Pod 无法分配 IP 的排查记录</title>
            <link>https://blog.5772447.xyz/posts/1908b3a5/</link>
            <pubDate>Tue, 21 Jul 2026 19:00:00 +0800</pubDate>
            <guid>https://blog.5772447.xyz/posts/1908b3a5/</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 生产集群原规划 120 个节点，CNI 采用 Calico + IPAM 模式，初始分配了 3 个 &lt;code&gt;/16&lt;/code&gt; 的 Pod CIDR 池（共约 19.6 万地址）。随着业务扩容，节点数已接近 200，集群中运行着大量短生命周期的 Job 与 CronJob。某天凌晨开始，发布流水线频繁失败，报错均为「CNI failed to allocate IP: no IP addresses available in pool」。调度器显示 Pod 处于 &lt;code&gt;ContainerCreating&lt;/code&gt;，事件日志里反复出现 &lt;code&gt;failed to allocate for range 0: no IP addresses available in range set&lt;/code&gt;。&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;ul&gt;&#xA;&lt;li&gt;新增 Pod 大量卡在 &lt;code&gt;ContainerCreating&lt;/code&gt;，&lt;code&gt;kubectl describe&lt;/code&gt; 事件显示 &lt;code&gt;Failed create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox ... no IP addresses available&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;li&gt;已有 Running 的 Pod 网络正常，说明问题仅影响「新分配 IP」的请求。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;calicoctl get ippool&lt;/code&gt; 显示所有池的 &lt;code&gt;blockSize&lt;/code&gt; 仍为默认 &lt;code&gt;/26&lt;/code&gt;，但 &lt;code&gt;calicoctl get block&lt;/code&gt; 列出已分配的 IP 块数量远超预期，部分节点出现「借用其他节点 block」的现象。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;calicoctl get ipam show&lt;/code&gt; 报告「Total IPs: 196608，Allocated: 196607，Unallocated: 1」，几乎耗尽。&lt;/li&gt;&#xA;&lt;li&gt;新节点加入集群后，kubelet 日志出现 &lt;code&gt;cni.go:237] error adding container to network: failed to allocate for range 0&lt;/code&gt;，节点整体 NotReady。&lt;/li&gt;&#xA;&lt;/ul&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;第一步：确认 CNI 插件状态&lt;/strong&gt;。&lt;code&gt;kubectl get pods -n kube-system -l k8s-app=calico-node&lt;/code&gt; 显示所有 calico-node Pod 均 Running，&lt;code&gt;calicoctl node status&lt;/code&gt; 也正常，排除插件本身 crash。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第二步：检查 IPAM 配置&lt;/strong&gt;。&lt;code&gt;calicoctl get ippool -o yaml&lt;/code&gt; 发现默认池配置了 &lt;code&gt;ipipMode: Always&lt;/code&gt;、&lt;code&gt;natOutgoing: true&lt;/code&gt;，但关键字段 &lt;code&gt;allowedUses: [&amp;quot;Workload&amp;quot;,&amp;quot;Tunnel&amp;quot;]&lt;/code&gt; 正常。最可疑的是 &lt;code&gt;blockSize: 26&lt;/code&gt;（默认 64 地址/块），而集群规模已从 120 节点涨到 200 节点，理论上需要更多 block。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第三步：查看 IP 分配详情&lt;/strong&gt;。用 &lt;code&gt;calicoctl get block --output wide&lt;/code&gt; 发现大量 block 被「借用」——一个节点的 IP 块被其他节点上的 Pod 占用。Calico 的 IPAM 默认会尽量把同一节点的 Pod 分配到同一 block 以减少路由表膨胀，但当池即将耗尽时，会跨节点借用，导致 block 碎片化。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第四步：定位自动扩容上限&lt;/strong&gt;。Calico 支持 IP 池自动扩容（&lt;code&gt;strictAffinity: false&lt;/code&gt; + &lt;code&gt;autoAllocateBlocks: true&lt;/code&gt;），但在 &lt;code&gt;IPPool&lt;/code&gt; CRD 中发现：&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;/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-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;spec&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;cidr&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;10.244.0.0&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;/16&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;blockSize&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;26&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;ipipMode&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Always&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;natOutgoing&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;disabled&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&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;maxBlocksPerHost&lt;/code&gt; 限制，且 &lt;code&gt;allowedUses&lt;/code&gt; 只包含 Workload/Tunnel，没有为「新节点自动分配 block」预留空间。更致命的是，集群升级时曾手动把 &lt;code&gt;blockSize&lt;/code&gt; 从默认 26 改成 28（16 地址/块）以节省地址，却忘记同步更新 &lt;code&gt;ippool&lt;/code&gt; 的 &lt;code&gt;cidr&lt;/code&gt; 范围，导致实际可用地址比规划少 75%。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第五步：确认碎片与借用风暴&lt;/strong&gt;。当池中仅剩 1 个地址时，任何新 Pod 都必须「从已有 block 里再挤」，但因为 &lt;code&gt;strictAffinity&lt;/code&gt; 为 false，分配器会尝试在全集群范围内找可用 block，造成大量「跨节点借用」请求。calico-node 的 felix 组件在处理这些借用请求时出现延迟，进一步放大分配失败率。&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;ol&gt;&#xA;&lt;li&gt;紧急扩容 IP 池：新增一个 &lt;code&gt;/16&lt;/code&gt; 的新池，&lt;code&gt;blockSize&lt;/code&gt; 设为 26，并设置 &lt;code&gt;allowedUses: [&amp;quot;Workload&amp;quot;]&lt;/code&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;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; 8&#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; 9&#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;10&#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;11&#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;12&#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;13&#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;calicoctl apply -f - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;&amp;lt;EOF&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;apiVersion: projectcalico.org/v3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;kind: IPPool&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;metadata:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  name: pool-prod-v2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;spec:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  cidr: 10.245.0.0/16&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  blockSize: 26&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  ipipMode: Always&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  natOutgoing: true&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  disabled: false&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  allowedUses: [&amp;#34;Workload&amp;#34;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;EOF&lt;/span&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;/li&gt;&#xA;&lt;li&gt;对已分配 IP 的 Pod 不做处理，仅让新 Pod 落在新池。Calico 的分配器会优先使用未禁用的池，因此新 Pod 立即能拿到 IP。&lt;/li&gt;&#xA;&lt;li&gt;对已处于 &lt;code&gt;ContainerCreating&lt;/code&gt; 的 Pod 执行 &lt;code&gt;kubectl delete pod xxx --grace-period=0 --force&lt;/code&gt;，让它们重新调度到新池。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;strong&gt;根治&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;把默认池的 &lt;code&gt;blockSize&lt;/code&gt; 改回 26（16→64 地址），并开启 &lt;code&gt;strictAffinity: true&lt;/code&gt; 减少跨节点借用。&lt;/li&gt;&#xA;&lt;li&gt;设置 &lt;code&gt;maxBlocksPerHost: 8&lt;/code&gt;，限制单节点最多借用 8 个 block，避免单点耗尽过多地址。&lt;/li&gt;&#xA;&lt;li&gt;在集群规模规划阶段即预留 2~3 个 &lt;code&gt;/16&lt;/code&gt; 池，并设置告警：当池利用率 &amp;gt; 70% 时自动扩容或告警。&lt;/li&gt;&#xA;&lt;li&gt;升级 Calico 版本到 v3.26+，利用其「IP 池自动扩容」特性（&lt;code&gt;autoAllocateBlocks: true&lt;/code&gt; + &lt;code&gt;autoCreateBlocks: true&lt;/code&gt;）。&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;Calico IPAM 的核心设计是「按需分配 block」，默认 &lt;code&gt;blockSize=/26&lt;/code&gt; 意味着每 64 个 Pod 地址占用一个路由条目。当节点数从 120 涨到 200，且业务以短生命周期 Job 为主时，Pod 创建/销毁频率极高，block 分配/释放操作频繁。若池大小规划不足（仅 19.6 万地址对应 3000 Pod 左右），加上 &lt;code&gt;blockSize&lt;/code&gt; 曾被误改小，实际可用地址进一步缩水，最终在凌晨高频 Job 集中创建时耗尽。&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;：节点数 ×（平均 Pod/节点）× 1.5（冗余）作为 IP 池大小，并预留 2~3 个独立池做滚动扩容。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;监控告警&lt;/strong&gt;：在 Prometheus 中增加 &lt;code&gt;calico_ipam_blocks_total&lt;/code&gt; / &lt;code&gt;calico_ipam_allocations_total&lt;/code&gt; 指标，当利用率 &amp;gt; 70% 立即告警。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;配置收敛&lt;/strong&gt;：禁止随意修改 &lt;code&gt;blockSize&lt;/code&gt;，统一使用 26；设置 &lt;code&gt;maxBlocksPerHost&lt;/code&gt; 防止单点借用过多。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;自动扩容演练&lt;/strong&gt;：定期在 staging 环境演练「池耗尽 → 新增池 → Pod 自动落新池」的全流程，确保生产环境不会翻车。&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;CNI 的 IP 池耗尽是「规模化集群的隐形杀手」——它不影响已有 Pod，只在「新增 Pod」时才暴露，且往往在凌晨高频任务集中爆发。防御的关键是「规划时多留一倍地址 + 监控利用率 + 限制单节点 block 借用」，把 IPAM 当成「另一种形式的资源配额」来治理。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
