Skip to content

网络策略(NetworkPolicy)

NetworkPolicy(网络策略)是集群内部(东西向)流量的访问控制:指定一批 Pod(容器组),然后声明它们允许哪些入站(Ingress)出站(Egress)流量。策略采用白名单模型——命中策略的 Pod 在某方向上的流量默认全部拒绝,只有规则中显式放行的才允许,从而在微服务之间做隔离。

text
入站 Ingress(别人 / 外部访问我)   →  出站 Egress(我去访问别人)
来源:Pod / 名称空间 / 网段          目标:Pod / 名称空间 / 网段

Kuboard 中位置:服务与网络 → 网络策略(资源 networking.k8s.io/v1,名称空间级)。

生效前提:依赖 CNI 网络插件

NetworkPolicy 不是 apiserver / kubelet 强制的机制,必须由集群的 CNI 网络插件(Container Network Interface)实现,例如 Calico、Cilium、Antrea、Weave Net、kube-router 等。

先确认插件支持再创建

默认的 flannel 及其他部分简化插件不实现 NetworkPolicy。若集群不支持,创建策略不会报错,但流量行为完全无变化。排查"策略不生效"时,先确认这一点。

理解两个默认状态,是看懂策略效果的前提:

状态流量行为
某 Pod 未被任何策略命中不做任何隔离,与任意对象互通(默认放行)
某 Pod 被策略命中其入站/出站方向该方向立即进入默认拒绝:只放行规则中显式允许的流量

入口位置

进入目标集群 → 名称空间后,点击左侧 服务与网络 → 网络策略

列表页为 Kuboard 通用资源列表:顶部可切换集群 / 名称空间(或树形导航)、按名称搜索、勾选后批量删除;行内提供 编辑 / YAML / 删除,点击名称进入详情页。

创建网络策略

  1. 进入 网络策略 列表页,点击右上角 创建
  2. 基本信息:填写名称(必填,名称空间内唯一)、标签、注解;
  3. 容器组选择器:定义这条策略作用于哪些 Pod;
  4. 入方向规则 / 出方向规则:按需求添加规则(可只写一个方向);
  5. 点击 保存,在 预览 YAML 中确认后提交,跳转到详情页。

第一步:容器组选择器(策略管哪些 Pod)

选择器用标签匹配 Pod,只会命中本名称空间内的容器组,其它名称空间不受影响。

配置项说明
matchLabelskey=value 精确匹配,多行之间是"与"(AND)。照抄工作负载(如 Deployment)模板里的标签即可命中对应 Pod
matchExpressions表达式匹配,操作符 In / NotIn / Exists / DoesNotExist,适合排除或集合匹配
  • 什么都不填:匹配本名称空间内的所有容器组(界面显示"未定义容器组选择器"字样,但语义为选中全部);
  • 填写后:只匹配标签符合的容器组。

标签从哪来

Deployment 等创建向导中,Kuboard 默认为 Pod 写入 app=<名称> 标签。创建策略时把同样的标签填进选择器,即可锁定这组 Pod。

第二步:填写规则(入方向 / 出方向)

两个标签页结构一致:点击 添加规则,得到一张"规则卡片"——左侧是源 / 目标(from:入站规则里的"来源";to:出站规则里的"去向"),右侧是端口

点击左侧 添加网段添加选择器 可添加多个来源/目标;点击右侧 添加端口 添加端口条目。

  • 多条规则之间是"或"(OR),规则内多个来源/目标之间也是"或"——满足任意一条即可放行;
  • 某方向不添加任何规则时,策略只"隔离"(默认拒绝)而不放行任何流量。

源 / 目标:网段(IP Block)

点击 添加网段

字段说明
有效网段CIDR 网段,如 192.168.1.0/242001:db9::/64,必填
排除网段在有效网段内再排除若干子网,如填 192.168.1.0/24、排除 192.168.1.64/26

源 / 目标:选择器(名称空间 + 容器组)

点击 添加选择器,出现一张选择器卡片,内含两个可勾选项:

勾选项不勾选勾选后
名称空间选择器仅限本名称空间(界面提示"仅限于名称空间 xxx")可用标签跨名称空间匹配;不填条件 = 所有名称空间
容器组选择器该维度不限可用标签匹配容器组;不填条件 = 所有容器组
  • 卡片内两个选择器同时生效时是"与"(AND):来源 = 满足名称空间选择器 满足容器组选择器的 Pod;
  • 界面校验:两个选择器不能同时为空
  • 多个选择器卡片之间仍是"或"(OR)。

跨名称空间放行的常见诉求

"允许 payments 名称空间的 Pod 访问我":勾选名称空间选择器,填 name=payments(Kuboard 为名称空间默认打 name=<名称> 标签),容器组选择器留空即可。

端口

字段说明
协议TCP / UDP / SCTP
端口1 - 65535
端口范围(endPort)与端口号构成区间,如 8000 - 9000;Kubernetes 1.25 及以上版本显示,更早版本的集群界面自动隐藏
  • 不填任何端口 = 匹配所有端口(界面提示"匹配所有端口");
  • 填了一个或多个端口后为"仅匹配如下端口",条目之间是"或"。

第三步:规则方向与默认拒绝(重点)

界面不单独设置 policyTypes(Ingress / Egress),由你填写了哪类规则决定:

  • 只填了入方向规则 → 策略只管控入站;
  • 只填了出方向规则 → 策略只管控出站;
  • 两个都填 → 双向管控。

填写规则即开启该方向的"默认拒绝"

只要策略命中了某个 Pod,被填写的方向就进入默认拒绝状态——即使你只写了一条放行规则,其余未放行的流量也会被拒绝。典型事故:只配置了入站规则觉得大功告成,Pod 的出站(如访问数据库、解析 DNS)却全被切断。出站方向也要按需补充 egress 规则。

反过来,若某方向不打算隔离,对该方向不添加任何规则即可(保持该方向默认放行)。

编辑与删除

  • 编辑:列表行内 编辑,复用创建表单,可随时修改选择器、规则、网段与端口;
  • 删除:行内删除或勾选后批量删除,需输入对象名称确认。
  • 删除后,该策略的隔离立即解除,相关 Pod 恢复为"未被策略命中"的默认放行状态。

修改策略即时生效

NetworkPolicy 由 CNI 控制器实时下发,保存/删除后无需重启任何对象,通常秒级生效。

详情页与查看"被哪些 Pod 影响"

详情页顶部为元数据信息卡与事件面板,下方三个只读标签页:容器组选择器入方向规则出方向规则(展示规则、网段、端口与"或"关系)。

界面不提供"受影响容器组清单",核对方式是"选择器 → Pod 标签"对照:

  1. 打开策略的 容器组选择器 标签页,记下 matchLabels / matchExpressions;
  2. 容器组(Pod) 列表页,用同一组标签筛选;
  3. 命中的容器组即策略的作用对象——策略只影响它们,不命中的容器组不受影响。

选择器没命中 = 策略形同虚设

标签拼错、大小写不符、表达式写反都会导致选择器不命中任何 Pod,策略自然不产生任何隔离效果。创建后先在容器组列表核对一遍命中情况。

排障与验证:策略是否真的生效

验证路径(端到端)

sh
# 1. 集群是否支持(有 ControllerRevision/CRD 或文档依据;不支持的插件需先更换)
kubectl get networkpolicy -A

# 2. 选择器是否命中:列出目标容器组标签,与策略 podSelector 对照
kubectl -n <ns> get pod -L app,tier

# 3. 查看策略当前定义(规则 / 端口 / policyTypes)
kubectl -n <ns> get networkpolicy <> -o yaml

再通过一次真实访问验证放行与拒绝:

构造测试 Pod

yaml
# test-src.yaml:源容器组(带标签 src=probe)
apiVersion: v1
kind: Pod
metadata:
  name: probe-src
  namespace: <ns>
  labels: { app: probe, src: "true" }
spec:
  containers:
    - name: nc
      image: busybox
      command: ["sh", "-c", "sleep 3600"]
sh
kubectl -n <ns> apply -f test-src.yaml
# 在源容器组内探测目标容器组的端口(能通 = 已放行;超时 = 被策略拒绝)
kubectl -n <ns> exec probe-src -- sh -c "echo | nc -w 2 <目标PodIP> <端口> && echo OK || echo BLOCKED"

常见问题对照

现象常见原因
创建策略后流量毫无变化CNI 插件不支持 NetworkPolicy;选择器未命中任何 Pod
策略一创建,前后端互通突然全断默认拒绝模型生效——规则只放行"显式允许",其余全拒(重点检查被漏掉的 egress)
Pod 无法解析域名egress 规则未放行 kube-system 名称空间、UDP 53 端口(kube-dns / CoreDNS)
放行某网段仍不通端口没放行(空白端口=全放行,但填了端口则只放行这些);协议填错(TCP 写成 UDP);网段 CIDR 写错
跨名称空间访问仍被拒名称空间选择器未勾选(默认仅限本名称空间)、或未匹配目标名称空间的标签
只想放行一条规则却"全通"规则内来源/端口留空 = 匹配任意,请补上具体来源与端口

命令行速查

sh
kubectl -n <ns> get networkpolicy
kubectl -n <ns> describe networkpolicy <>   # 结构与规则一目了然
kubectl -n <ns> get pod -o wide --show-labels   # 对照 Pod IP 与标签

策略对象本身通常不产生事件,异常更多体现在与其相关的 CNI 数据面(如 Calico 的 Felix 日志);Kuboard 详情页的事件面板可查看对象创建/更新等资源侧事件。

相关页面