Network Policy 说明

最近更新时间:2025-11-10 15:42:32

我的收藏

简介

组件介绍

Network Policy 是 Kubernetes 提供的一种资源,用于定义基于 Pod 的网络隔离策略。它描述了一组 Pod 是否可以与其他组 Pod,以及其他 Network Entities 进行通信。本组件提供了针对该资源的 Controller 实现。如果您希望在 IP 地址或端口层面(OSI 第3层或第4层)控制特定应用的网络流量,则可考虑使用本组件。

部署在集群内的 Kubernetes 对象

Kubernetes 对象名称
类型
请求资源
所属 Namespace
networkpolicy
DaemonSet
每个实例CPU:250m,Memory:250Mi
kube-system
networkpolicy
ClusterRole
-
-
networkpolicy
ClusterRoleBinding
-
-
networkpolicy
ServiceAccount
-
kube-system

组件权限说明

权限说明

该组件权限是当前功能实现的最小权限依赖。
需要获取集群内的 namespaces、pods、services、nodes、endpoints 和 networkpolicies,所以需要 list/get/watch 权限。

权限定义

登录 容器服务控制台,在集群详情页选择左侧导航中的授权管理,在 ClusterRole 页签,单击 networkpolicy 进行查看
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: networkpolicy
rules:
- apiGroups:
- ""
resources:
- namespaces
- pods
- services
- nodes
- endpoints
verbs:
- list
- get
- watch
- apiGroups:
- "networking.k8s.io"
resources:
- networkpolicies
verbs:
- list
- get
- watch
- apiGroups:
- extensions
resources:
- networkpolicies
verbs:
- get
- list
- watch

操作步骤

1. 登录 容器服务控制台,在左侧导航栏中选择集群
2. 在集群列表中,单击目标集群 ID,进入集群详情页。
3. 选择左侧菜单栏中的组件管理,在组件管理页面单击新建
4. 新建组件管理页面中勾选 NetworkPolicy。NetworkPolicy 详细配置可参见 Network Policy 最佳实践
5. 单击完成即可创建组件。

注意事项

与 NodeLocalDNSCache 组件的 iptables 版本兼容性问题

如果集群中同时安装了 Network Policy 和 NodeLocalDNSCache 组件,使用的 iptables 版本与 Network Policy 中的 iptables 版本可能会有兼容性问题,导致 iptables 规则被反复添加,大量 iptables 会导致网络转发变慢,时延变高,直到完全无法运行。
具体根因是 Network Policy 和 NodeLocalDNSCache 组件的 iptables 在使用 nft 后端时,Network Policy 中使用的 iptables 版本是 v1.8.7,而 NodeLocalDNSCache 中使用的 iptables 版本可能为 v1.8.9 (NodeLocalDNSCache 版本小于 1.0.2 时),而 iptables v1.8.8 在参数解析方面有一些不兼容的变化,导致两者共存时存在兼容性问题。
具体变化参考如下 commit:
[1] https://git.netfilter.org/iptables/commit/?h=v1.8.8&id=250dce876d924b9467ffa035af445912e86ea93b
[2] https://git.netfilter.org/iptables/commit/?h=v1.8.8&id=5795a1b5b611fbf7a64be34b2675f88e8f9bbaef
[3] https://git.netfilter.org/iptables/commit/?h=v1.8.8&id=5489493e6590b35765f676d6638c696bfe00c4b4
[4] https://git.netfilter.org/iptables/commit/?h=v1.8.8&id=94309632a13000e06ed02e08f0bcbed94080abb3

如果已经安装了 NodeLocalDNSCache 组件 1.0.2 以下版本(注意这里是组件版本而不是社区版 node-local-dns 的版本),需卸载后重新安装确保组件版本在 1.0.2 之上(NodeLocalDNSCache 组件暂不支持直接升级)。如果是自行安装的社区版 node-local-dns,需确保安装 1.22.24 以下的版本。

ipvs 模式下 Egress 规则会默认阻断 Service 请求

NetworkPolicy 组件使用 kube-router 实现,原理是通过 iptables 配置 Ingress 和 Egress 相关规则,在 ipvs 模式下,数据包被 kube-router 的 iptables 规则处理时,访问 Service 的请求目的 IP 还是 ClusterIP,没有被 DNAT 成 Pod IP,如果在 NetworkPolicy 中配置了 Egress 规则但又没显式放通 Service CIDR,就会导致访问 Service 不通,DNS 解析也会失败。
规避方法是在定义 NetworkPolicy 时,如果配置了 Egress 规则,且 Pod 需要访问 Service 的情况,显式将集群的 Service CIDR 加到 Egress 规则中,示例: