一文读懂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: 匹配该规则的流量将被接受并继续处理。
相关推荐
韩立学长8 小时前
Springboot森林资源检测管理系统xowdi7nq(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
rannn_1118 小时前
【SQL题解】力扣高频 SQL 50题|DAY5
数据库·后端·sql·leetcode·题解
+VX:Fegn08958 小时前
计算机毕业设计|基于springboot + vue健康茶饮销售管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
陈橘又青8 小时前
vLLM-Ascend推理部署与性能调优深度实战指南:架构解析、环境搭建与核心配置
人工智能·后端·ai·架构·restful·数据·vllm
ChineHe8 小时前
Gin框架基础篇004_中间件的使用与机制详解
后端·golang·gin
serendipity_hky8 小时前
【go语言 | 第6篇】Go Modules 依赖解决
开发语言·后端·golang
weixin_425023009 小时前
Spring boot 2.7.18使用knife4j
java·spring boot·后端
IT_陈寒9 小时前
Python性能翻倍的5个隐藏技巧:让你的代码跑得比同事快50%
前端·人工智能·后端
最贪吃的虎9 小时前
Spring Boot 自动装配(Auto-Configuration)深度实现原理全解析
java·运维·spring boot·后端·mysql