0%

K8s-网络策略

Network Policies 网络策略

Network Policies

Kubernetes 中,Network Policy(网络策略)定义了一组 Pod 是否允许相互通信,或者与网络中的其他端点 endpoint 通信。

NetworkPolicy 对象使用标签选择Pod,并定义规则指定选中的Pod可以执行什么样的网络通信

前提条件

Network Policy 由网络插件实现,因此,使用的网络插件必须能够支持 NetworkPolicy 才可以使用此特性。如果仅仅是创建了一个 Network Policy 对象,但使用的网络插件并不支持此特性,所创建的 Network Policy 对象是不生效的。

solated/Non-isolated Pods

默认情况下,Pod 都是非隔离的(non-isolated),可以接受来自任何请求方的网络请求。

如果一个 NetworkPolicy 的标签选择器选中了某个 Pod,则该 Pod 将变成隔离的(isolated),并将拒绝任何不被 NetworkPolicy 许可的网络连接。(名称空间中其他未被 NetworkPolicy 选中的 Pod 将认可接受来自任何请求方的网络请求。)

Network Police 不会相互冲突,而是相互叠加的。如果多个 NetworkPolicy 选中了同一个 Pod,则该 Pod 可以接受这些 NetworkPolicy 当中任何一个 NetworkPolicy 定义的(入口/出口)规则,是所有NetworkPolicy规则的并集,因此,NetworkPolicy 的顺序并不重要,因为不会影响到最终的结果。

NetworkPolicy对象

一个 NetworkPolicy 的 Example 如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
  • 基本信息: 同其他的 Kubernetes 对象一样,NetworkPolicy 需要 apiVersionkindmetadata 字段

  • spec: NetworkPolicyspec 字段包含了定义网络策略的主要信息:

    • podSelector: 同名称空间中,符合此标签选择器 .spec.podSelector 的 Pod 都将应用这个 NetworkPolicy。上面的 Example中的 podSelector 选择了 role=db 的 Pod。如果该字段为空,则将对名称空间中所有的 Pod 应用这个 NetworkPolicy
    • policyTypes: .spec.policyTypes 是一个数组类型的字段,该数组中可以包含 Ingress、Egress 中的一个,也可能两个都包含。该字段标识了此 NetworkPolicy 是否应用到 入方向的网络流量、出方向的网络流量、或者两者都有。如果不指定 policyTypes 字段,该字段默认将始终包含 Ingress,当 NetworkPolicy 中包含出方向的规则时,Egress 也将被添加到默认值。
    • ingress: ingress 是一个数组,代表入方向的白名单规则。每一条规则都将允许与 from 和 ports 匹配的入方向的网络流量发生。例子中的 ingress 包含了一条规则,允许的入方向网络流量必须符合如下条件:
      • Pod 的监听端口为 6379
      • 请求方可以是如下三种来源当中的任意一种:
        • ipBlock 为 172.17.0.0/16 网段,但是不包括 172.17.1.0/24 网段
        • namespaceSelector 标签选择器,匹配标签为 project=myproject
        • podSelector 标签选择器,匹配标签为 role=frontend
    • egress: egress 是一个数组,代表出方向的白名单规则。每一条规则都将允许与 to 和 ports 匹配的出方向的网络流量发生。例子中的 egress 允许的出方向网络流量必须符合如下条件:
      • 目标端口为 5978
      • 目标 ipBlock 10.0.0.0/24网段

因此,例子中的 NetworkPolicy 对网络流量做了如下限制:

  1. 隔离了 default 名称空间中带有 role=db 标签的所有 Pod 的入方向网络流量和出方向网络流量
  2. Ingress规则(入方向白名单规则):
    • 当请求方是如下三种来源当中的任意一种时,允许访问 default 名称空间中所有带 role=db 标签的 Pod 的 6379 端口:
      • ipBlock 为 172.17.0.0/16 网段,但是不包括 172.17.1.0/24 网段
      • namespaceSelector 标签选择器,匹配标签为 project=myproject
      • podSelector 标签选择器,匹配标签为 role=frontend
  1. Egress rules(出方向白名单规则):
    • 当如下条件满足时,允许出方向的网络流量:
      • 目标端口为 5978
      • 目标 ipBlock 为 10.0.0.0/24 网段