一文读懂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 小时前
面试实战 问题二十四 Spring 框架中循环依赖问题的解决方法
java·后端·spring
GetcharZp2 小时前
C++日志库新纪元:为什么说spdlog是现代C++开发者必备神器?
c++·后端
三木水3 小时前
Spring-rabbit使用实战七
java·分布式·后端·spring·消息队列·java-rabbitmq·java-activemq
快乐就是哈哈哈3 小时前
一篇文章带你玩转 EasyExcel(Java Excel 报表必学)
后端
快乐就是哈哈哈3 小时前
手把手教你用 Java 写出贪吃蛇小游戏(附源码)
后端
别来无恙1493 小时前
Spring Boot文件下载功能实现详解
java·spring boot·后端·数据导出
公众号_醉鱼Java4 小时前
Elasticsearch文档数迷思:为何count和stats结果打架?深度解析背后机制
后端·掘金·金石计划
程序员爱钓鱼4 小时前
Go语言实战案例:使用Gin处理路由参数和查询参数
后端
bobz9655 小时前
5070TI 本地推理
后端
bobz9655 小时前
gpt-oss-20b-base 是基础模型
后端