容器服务 Network Policy 说明

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: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: networkpolicyrules: – 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 规则中,示例:

赞 (0)
上一篇 4天前
下一篇 4天前