一文读懂NetworkPolicy的使用和原理

使用条件:

需要calico网络组件,flannel需要安装calico

使用案例展示:

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector: #规则作用的对象
    matchLabels:
      role: db
  policyTypes:
  - Ingress   #入流
  - Egress   #出
  ingress:
  - from:
    - ipBlock:    #ip白名单
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:  #命名空间标签选择
        matchLabels:
          project: myproject
    - podSelector:  #pod标签选择
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:  #出口ip和出口端口
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978
  1. 带-的是或的关系,不带-的是与的关系,可以看下例子
yaml 复制代码
# 这个是或
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          user: alice
    - podSelector:
        matchLabels:
          role: client
  ...
# 这个是与
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          user: alice
      podSelector:
        matchLabels:
          role: client
  1. 你把 podSelector 字段留空,那么这个 NetworkPolicy 就会作用于当前 Namespace 下的所有 Pod。
yaml 复制代码
spec:
 podSelector: {}

实现原理:

代码的实现展示:

go 复制代码
for dstIP := range 所有被 networkpolicy.spec.podSelector 选中的 Pod 的 IP 地址
  for srcIP := range 所有被 ingress.from.podSelector 选中的 Pod 的 IP 地址
    for port, protocol := range ingress.ports {
      iptables -A KUBE-NWPLCY-CHAIN -s $srcIP -d $dstIP -p $protocol -m $protocol --dport $port -j ACCEPT 
    }
  }
}

代码展示2:

css 复制代码
for pod := range 该 Node 上的所有 Pod {
    if pod 是 networkpolicy.spec.podSelector 选中的 {
        iptables -A FORWARD -d $podIP -m physdev --physdev-is-bridged -j KUBE-POD-SPECIFIC-FW-CHAIN
        iptables -A FORWARD -d $podIP -j KUBE-POD-SPECIFIC-FW-CHAIN
        ...
    }
}

内部路由规则列举和解析

sql 复制代码
iptables -A FORWARD -d $podIP -m physdev --physdev-is-bridged -j KUBE-POD-SPECIFIC-FW-CHAIN 
iptables -A FORWARD -d $podIP -j KUBE-POD-SPECIFIC-FW-CHAIN
目的: 这些规则用于将数据包转发到 KUBE-POD-SPECIFIC-FW-CHAIN,以处理特定于 Pod 的网络策略。
参数:
-A FORWARD: 将规则添加到 FORWARD 链中,该链处理跨主机的数据包。
-d $podIP: 指定目标是某个 Pod 的 IP 地址 ($podIP)。
-m physdev --physdev-is-bridged: 仅在数据包是通过桥接设备(用于 Pod 网络)时匹配。
-j KUBE-POD-SPECIFIC-FW-CHAIN: 将匹配到的包跳转到 KUBE-POD-SPECIFIC-FW-CHAIN 进行进一步处理。
sql 复制代码
iptables -A KUBE-POD-SPECIFIC-FW-CHAIN -j KUBE-NWPLCY-CHAIN 
iptables -A KUBE-POD-SPECIFIC-FW-CHAIN -j REJECT --reject-with icmp-port-unreachable

目的: 这些规则定义了在 KUBE-POD-SPECIFIC-FW-CHAIN 链中处理的流量的行为。
参数:
-A KUBE-POD-SPECIFIC-FW-CHAIN -j KUBE-NWPLCY-CHAIN: 将所有到达 KUBE-POD-SPECIFIC-FW-CHAIN 的流量转发到 KUBE-NWPLCY-CHAIN,以应用更一般的网络策略。
-A KUBE-POD-SPECIFIC-FW-CHAIN -j REJECT --reject-with icmp-port-unreachable: 如果流量未被上面的规则匹配,则拒绝该流量,并发送一个 ICMP 报文,告知源发出这条消息的端口不可到达。
bash 复制代码
iptables -A KUBE-NWPLCY-CHAIN -s $srcIP -d $dstIP -p $protocol -m $protocol --dport $port -j ACCEPT
目的: 允许来自指定源 IP ($srcIP) 到指定目标 IP ($dstIP) 的网络流量,这些流量的协议和端口都符合指定条件。
-A KUBE-NWPLCY-CHAIN: 将此规则添加到名为 KUBE-NWPLCY-CHAIN 的链中。
-s $srcIP: 指定流量的源 IP 地址。
-d $dstIP: 指定流量的目标 IP 地址。
-p $protocol: 指定流量的协议,例如 TCP、UDP 等。
-m $protocol: 该选项用于被动地匹配协议,确保后续规则应用于相应的协议。-p是指定协议,-m是启动这个协议相应的模块更细的功能规则
--dport $port: 指定目标端口,只有目标端口为 $port 的流量会被允许。
-j ACCEPT: 匹配该规则的流量将被接受并继续处理。
相关推荐
leobertlan4 小时前
2025年终总结
前端·后端·程序员
面向Google编程4 小时前
从零学习Kafka:数据存储
后端·kafka
易安说AI5 小时前
Claude Opus 4.6 凌晨发布,我体验了一整晚,说说真实感受。
后端
易安说AI5 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
易安说AI5 小时前
用 Claude Code 远程分析生产日志,追踪 Claude Max 账户被封原因
后端
颜酱6 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
Coder_Boy_9 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
掘金者阿豪10 小时前
关系数据库迁移的“暗礁”:金仓数据库如何规避数据完整性与一致性风险
后端
ServBay10 小时前
一个下午,一台电脑,终结你 90% 的 Symfony 重复劳动
后端·php·symfony
sino爱学习10 小时前
高性能线程池实践:Dubbo EagerThreadPool 设计与应用
java·后端