使用条件:
需要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
- 带-的是或的关系,不带-的是与的关系,可以看下例子
yaml
# 这个是或
ingress:
- from:
- namespaceSelector:
matchLabels:
user: alice
- podSelector:
matchLabels:
role: client
...
# 这个是与
ingress:
- from:
- namespaceSelector:
matchLabels:
user: alice
podSelector:
matchLabels:
role: client
- 你把 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: 匹配该规则的流量将被接受并继续处理。