一文读懂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: 匹配该规则的流量将被接受并继续处理。
相关推荐
星释1 天前
Rust 练习册 :Leap与日期计算
开发语言·后端·rust
码事漫谈1 天前
C++死锁深度解析:从成因到预防与避免
后端
码事漫谈1 天前
智能体颠覆教育行业:现状、应用与未来展望调研报告
后端
蓝-萧1 天前
【玩转全栈】----Django基本配置和介绍
java·后端
priority_key1 天前
排序算法:堆排序、快速排序、归并排序
java·后端·算法·排序算法·归并排序·堆排序·快速排序
韩立学长1 天前
基于Springboot的旧时月历史论坛4099k6s9(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
汤姆yu1 天前
基于SpringBoot的动漫周边商场系统的设计与开发
java·spring boot·后端
灰小猿1 天前
Spring前后端分离项目时间格式转换问题全局配置解决
java·前端·后端·spring·spring cloud
RedJACK~1 天前
Go Ebiten小游戏开发:扫雷
开发语言·后端·golang
老夫的码又出BUG了1 天前
分布式Web应用场景下存在的Session问题
前端·分布式·后端