<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>CoreDNS被拒 on Zero Day Notes</title>
        <link>https://blog.5772447.xyz/tags/coredns%E8%A2%AB%E6%8B%92/</link>
        <description>Recent content in CoreDNS被拒 on Zero Day Notes</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Sun, 13 Jun 2021 07:00:00 +0800</lastBuildDate><atom:link href="https://blog.5772447.xyz/tags/coredns%E8%A2%AB%E6%8B%92/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>收紧 NetworkPolicy：一次误配导致集群内服务全隔离的排查与回退</title>
            <link>https://blog.5772447.xyz/posts/366a6499/</link>
            <pubDate>Sun, 13 Jun 2021 07:00:00 +0800</pubDate>
            <guid>https://blog.5772447.xyz/posts/366a6499/</guid>
            <description>&lt;h2 id=&#34;问题背景&#34;&gt;&lt;a href=&#34;#%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 集群，承载内部订单、库存、积分三套核心微服务，流量都在集群内走 Service 互通，对外只经 Ingress 入口。安全审计后要求「默认拒绝、按需放行」，落地动作是给业务命名空间补上 NetworkPolicy：先加一条 &lt;code&gt;default-deny-all&lt;/code&gt;，再按服务依赖补 Ingress / Egress 白名单。&lt;/p&gt;&#xA;&lt;p&gt;变更窗口选在业务低峰，运维按表格把三条网段策略 YAML 推上去，&lt;code&gt;kubectl apply&lt;/code&gt; 显示成功，当时用 &lt;code&gt;curl&lt;/code&gt; 测了 Ingress 入口和同 Pod 内 loopback，都正常，就认为落地完成。半小时后客服开始报「下单页加载中、接口超时」，监控面板上一片服务 5xx 与依赖超时。表面看「网络好像还在」，实际是集群内东西向通信被策略一把掐断，入口探测掩盖了真正的故障面。&lt;/p&gt;&#xA;&lt;h2 id=&#34;故障现象&#34;&gt;&lt;a href=&#34;#%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;高峰前的半小时内现象逐步放大：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;前端网关日志大量 &lt;code&gt;upstream timed out&lt;/code&gt;，调用订单服务 30 秒无响应。&lt;/li&gt;&#xA;&lt;li&gt;订单 Pod 日志频繁 &lt;code&gt;connection refused&lt;/code&gt; / &lt;code&gt;i/o timeout&lt;/code&gt;，目标正是库存与积分的 ClusterIP。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;kubectl get pods&lt;/code&gt; 全部 Running、Ready，无 Crash、无重启，节点 NotReady 也没有。&lt;/li&gt;&#xA;&lt;li&gt;从跳板机访问 Ingress 公网域名偶发能通（命中本地缓存或未依赖下游的静态接口），容易误判为「业务代码问题」。&lt;/li&gt;&#xA;&lt;li&gt;监控上 error rate 从 &amp;lt;0.1% 抬到 40%+，延迟 P99 从 80ms 飙到 20s+，告警刷屏但没有节点级 CPU / 内存尖刺。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;更迷惑的是：&lt;code&gt;kubectl exec&lt;/code&gt; 进业务 Pod 里 &lt;code&gt;ping&lt;/code&gt; 同命名空间其他 Pod IP 超时，&lt;code&gt;curl&lt;/code&gt; ClusterIP 直接 hang；同一节点上 &lt;code&gt;curl&lt;/code&gt; 本机 kube-proxy 监听端口却能通。看起来「节点还活着，只是容器网络策略把东西向流量拦了」。&lt;/p&gt;&#xA;&lt;h2 id=&#34;排查过程&#34;&gt;&lt;a href=&#34;#%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;br&gt;&#xA;&lt;code&gt;kubectl get nodes&lt;/code&gt; 全 Ready，&lt;code&gt;dmesg&lt;/code&gt; 无 OOM / 网卡 down。&lt;code&gt;ss -s&lt;/code&gt; 与 &lt;code&gt;conntrack -C&lt;/code&gt; 都在正常水位，排除了 conntrack 打满、本机端口耗尽这类老问题。容器侧 &lt;code&gt;kubectl top pod&lt;/code&gt; 也正常，不像资源压垮。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第二步：把故障面从「应用挂了」收敛到「东西向网络」。&lt;/strong&gt;&lt;br&gt;&#xA;在入口 Nginx 上抓一条失败请求的 request id，对到订单服务日志，发现失败点都在「调库存 gRPC」。在订单 Pod 里：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 同命名空间直连&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -v --connect-timeout &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; http://inventory-svc:8080/healthz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 结果：挂起直到超时&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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:#75715e&#34;&gt;# 看 Endpoints 是否存在&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get endpoints inventory-svc -n prod&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 后端 Pod IP 都在，说明 kube-proxy 映射正常&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;Endpoints 有、Pod Ready，但业务层连不上，基本指向 &lt;strong&gt;网络路径被策略拦&lt;/strong&gt;，而不是 Service 空后端。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第三步：核对近期变更与 NetworkPolicy 现状。&lt;/strong&gt;&lt;br&gt;&#xA;&lt;code&gt;kubectl get networkpolicy -n prod -o wide&lt;/code&gt; 一下蹦出三条新策略，其中一条名字叫 &lt;code&gt;default-deny-all&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;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;podSelector&lt;/span&gt;: {}          &lt;span style=&#34;color:#75715e&#34;&gt;# 选中本 ns 全部 Pod&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;policyTypes&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:#ae81ff&#34;&gt;Ingress&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:#ae81ff&#34;&gt;Egress&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:#75715e&#34;&gt;# 没有任何 from / to 白名单&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;Kubernetes 语义很明确：只要某个方向（Ingress 或 Egress）上&lt;strong&gt;存在任意一条&lt;/strong&gt; NetworkPolicy 选中了该 Pod，该方向就切到「只允许策略允许的流量」，其余一律丢弃。默认拒绝本身没错，问题出在配套白名单。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第四步：对比「该放行」与「实际放行」。&lt;/strong&gt;&lt;br&gt;&#xA;设计文档里白名单应包含：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;同命名空间内微服务互访（按 app label）&lt;/li&gt;&#xA;&lt;li&gt;Ingress Controller 所在命名空间的入站（通常带 &lt;code&gt;ingress-nginx&lt;/code&gt; 标签）&lt;/li&gt;&#xA;&lt;li&gt;出站到 CoreDNS（&lt;code&gt;kube-system&lt;/code&gt; 的 53/UDP+TCP）以及必要的外部依赖&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;实际 apply 的另外两条策略只写了：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;允许 Ingress Controller → 前端 gateway Pod（Ingress）&lt;/li&gt;&#xA;&lt;li&gt;允许 gateway → 订单（Egress / Ingress 一对）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;漏了：&lt;/strong&gt; 订单 → 库存 / 积分、全部服务 → CoreDNS、监控探针（Prometheus）从 monitoring ns 的刮取。结果是：公网经 Ingress 打到 gateway 偶发能通，gateway 再往下调用全死；Pod 内解析域名也开始间歇失败（UDP 53 被 Egress 默认拒绝）。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第五步：用对照实验一秒定性。&lt;/strong&gt;&lt;br&gt;&#xA;临时把 &lt;code&gt;default-deny-all&lt;/code&gt; 的 &lt;code&gt;policyTypes&lt;/code&gt; 里 Egress 注释掉再 apply（仅保留 Ingress 拒绝做小范围验证），订单 → 库存立刻恢复；再把整条 default-deny 删掉，全站 30 秒内 error rate 回落。根因锁定：&lt;strong&gt;策略语义理解偏差 + 白名单覆盖不全&lt;/strong&gt;，不是 CNI 插件本身坏了。&lt;/p&gt;&#xA;&lt;p&gt;附带排查了一眼 CNI：集群用 Calico，&lt;code&gt;calicoctl get gp&lt;/code&gt; 无全局异常，Felix 日志有大量 &lt;code&gt;Drop&lt;/code&gt; 计数飙升，与时间线完全吻合，进一步印证是策略丢包而非底层路由。&lt;/p&gt;&#xA;&lt;h2 id=&#34;解决方案&#34;&gt;&lt;a href=&#34;#%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;止血（变更窗口内 5 分钟完成）：&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;&lt;span style=&#34;color:#75715e&#34;&gt;# 先整体回退有问题的策略，恢复默认「无策略=全放行」语义&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl delete networkpolicy default-deny-all allow-ingress-to-gateway allow-gateway-to-order -n prod&#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;删除后 Calico 立刻收敛，东西向恢复，客服侧超时告警在两分钟内熄火。同步在变更单标记「紧急回退」，并通知安全侧：默认拒绝暂缓，改走「预发验证后再切」。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;根治（隔离环境验证后灰度）：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;拆策略，禁止一条 YAML 包打天下。&lt;/strong&gt; 按「DNS / 监控 / 东西向业务 / 南北向 Ingress」四类拆开，每类独立 NetworkPolicy，方便回滚单条。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;白名单用标签选择器，不用拍脑袋写 IP。&lt;/strong&gt; 例如：&lt;/li&gt;&#xA;&lt;/ol&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;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;14&#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;15&#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;16&#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;17&#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;18&#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;19&#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;20&#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;21&#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;22&#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;23&#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;24&#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;25&#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;26&#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;27&#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:#75715e&#34;&gt;# 允许同 ns 内 app 互访（东西向）&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;apiVersion&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;networking.k8s.io/v1&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;kind&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;NetworkPolicy&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;metadata&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;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;allow-intra-ns&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;namespace&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;prod&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;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;podSelector&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;policyTypes&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ingress&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Egress&amp;#34;&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;ingress&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;from&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;podSelector&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;egress&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;to&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;podSelector&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;to&lt;/span&gt;:   &lt;span style=&#34;color:#75715e&#34;&gt;# CoreDNS&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;namespaceSelector&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;matchLabels&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;kubernetes.io/metadata.name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;kube-system&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;podSelector&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;matchLabels&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;k8s-app&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;kube-dns&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;ports&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;protocol&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;UDP&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;port&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;53&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;protocol&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;TCP&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;port&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;53&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;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;&lt;strong&gt;灰度顺序：先监控命名空间 → 预发 → 单个业务 ns → 全量。&lt;/strong&gt; 每个阶段用脚本做「同 ns 互访 / 跨 ns 依赖 / DNS / Ingress / 指标刮取」五元组连通性检查，全绿再进下一 ns。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;变更配套：网络策略变更必须附回滚命令与「删除即恢复」预案&lt;/strong&gt;；Calico Felix Drop 计数纳入告警，骤升即页。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;按上述清单在预发演练两轮后，再于下一个变更窗分命名空间重新落地，未再出现全站隔离。&lt;/p&gt;&#xA;&lt;h2 id=&#34;根因分析&#34;&gt;&lt;a href=&#34;#%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;空白名单的 default-deny&lt;/strong&gt;（同时覆盖 Ingress 与 Egress），把 Kubernetes「有策略即默认拒绝」的语义触发到了极致，而配套放行策略只覆盖了南北向入口链路，&lt;strong&gt;漏掉东西向服务依赖与 DNS&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;深层原因有三条：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;把「主机防火墙思维」直接套到 K8s。&lt;/strong&gt; 主机上 default-drop 常先放 established；NetworkPolicy 没有状态防火墙那套隐性放行，必须显式写清每一跳。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;验证方法只测了 Ingress 入口和 Pod 内 loopback&lt;/strong&gt;，没有测「服务 A → 服务 B」和「Pod → CoreDNS」，用错误探针给了错误信心。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;变更颗粒度过大。&lt;/strong&gt; 三条策略一次 apply 到生产全部业务 ns，缺少金丝雀与自动连通性门禁，出问题就是爆炸半径拉满。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Calico 工作正常，丢包计数上升是策略按设计在 ren_der——锅在策略内容，不在 CNI。&lt;/p&gt;&#xA;&lt;h2 id=&#34;预防措施&#34;&gt;&lt;a href=&#34;#%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;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;NetworkPolicy 变更门禁&lt;/strong&gt;：CI 里用 &lt;code&gt;kubectl apply --dry-run=server&lt;/code&gt; + 自定义连通性 Job（curl 矩阵）做 PR 检查；无矩阵结果禁止合入。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;策略基线模板化&lt;/strong&gt;：平台提供「default-deny + DNS + 同 ns + Ingress + metrics」五件套 Helm chart，业务只填 label，禁止手写空 deny。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;可观测性&lt;/strong&gt;：Felix &lt;code&gt;iptables_denied&lt;/code&gt; / eBPF drop 指标接入告警；业务 SLI 出现依赖超时时自动附带「近 15 分钟 NetworkPolicy 变更」注解，缩短定位路径。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;演练&lt;/strong&gt;：每季度在预发做一次「误删白名单 / 误加 deny」故障注入，验证回退脚本与值班手册。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;权限收敛&lt;/strong&gt;：生产 &lt;code&gt;networkpolicies&lt;/code&gt; 的 create/update/delete 走变更单 + 双人复核，SA 默认只读。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;文档化依赖图&lt;/strong&gt;：服务依赖从代码/网格侧自动生成，生成 NetworkPolicy 时按图补边，减少漏写。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;总结&#34;&gt;&lt;a href=&#34;#%e6%80%bb%e7%bb%93&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;总结&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;这是一起典型的「安全加固动机正确、落地验证残缺」事故：default-deny 本身是最佳实践，但在 Kubernetes 里它是&lt;strong&gt;硬默认拒绝&lt;/strong&gt;，白名单少写一跳就是整片东西向网络静默黑洞。排查上不要被「Pod 都 Running」迷惑，Endpoints 在而 TCP 不通时，优先 &lt;code&gt;kubectl get networkpolicy&lt;/code&gt; 和 CNI drop 计数；止血优先删策略恢复默认放行，再在预发用连通性矩阵把白名单补全后灰度。&lt;/p&gt;&#xA;&lt;p&gt;对日常运维的提醒就一句：&lt;strong&gt;NetworkPolicy 的爆炸半径不亚于改路由，测入口不等于测全图，先矩阵、后全量，随时能 delete 回滚。&lt;/strong&gt;&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
