k8s-NetworkPolicy-网络策略
网络策略 NetworkPolicy
网络策略(NetworkPolicy)是允许pod组彼此之间以及和其他网络Endpoint端点通信的规则。
NetworkPolicy资源使用标签来选择Pods并定义规则,这些规则指定允许所选Pods的流量请求。
网络策略是在IP 地址或端口层面(OSI 第 3 层或第 4 层)控制网络流量。
应用场景
适用于有网络隔离、流量限制的需要场景比如项目组隔离和应用隔离,一般可以在每个项目组的namespace下设置默认的网络策略来制流量请求。
前提条件
网络策略由网络插件实现,因此你必须使用支持NetworkPolicy的网络解决方案。例如Calico、Cilium、Kube-router、Romana、WeaveNet等等。
创建一个 NetworkPolicy 资源对象而没有控制器来使它生效的话,是没有任何作用的。
隔离和非隔离的 Pod
默认情况下,Pod 是非隔离的,它们接受任何来源的流量。
当Pod 被某 NetworkPolicy 选中时进入被隔离状态,并且被选中的Pod将受限于这些策略的 入站(Ingress)/出站(Egress)规则。
PS: 网络策略不会冲突,如果一个pod被多个NetworkPolicy选中,会遵守这些流量策略规则的并集。
构成要素
NetworkPolicy基本构成要素:
- 匹配哪些 Pod
- 入口流量的规则,表示谁允许访问这些 Pod
- 出口流量的规则,表示这些 Pod 允许访问谁
基本规则
- 如果 Pod 没有被 NetworkPolicy 匹配到,那么它的流量是被允许的。
- 如果 Pod 被 NetworkPolicy 匹配到,但是没有出口(egress)/入口(ingress)规则声明,那么它的出口/入口流量是被禁止的。
例如,拥有标签app: test
的pod虽然被匹配到,但NetworkPolicy有声明Ingress策略但没有具体ingress规则,所以这些pod的入口流量是被禁止的。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
spec:
podSelector:
matchLabels:
app: test
policyTypes:
- Ingress
如果想要允许入站流量,则应该声明具体ingress规则,例如允许拥有app: test
标签pod的全部入站流量:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
spec:
podSelector:
matchLabels:
app: test
policyTypes:
- Ingress
ingress:
- {}
注意事项
-
没声明ingrss或egress的默认是空数组,表示拒绝所有。
-
只能指定规则来允许流量通行,而不能直接禁止流量通行。即通过白名单的方式控制pod的进出口流量,没有黑名单。
-
MatchLabels内部是
and
关系。ingress: - from: - podSelector: matchLabels: app: client1 app: client2
上述例子中只有同时拥有
app: client1
和app: client2
的pod才能被选中。 -
NetworkPolicy 默认的作用域是 Pod 所在的 Namespace.
-
通过namespaceSelector可允许其他命名空间下的流量。
例如,允许所有命名空间拥有标签为
group: kube-public
的pod的流量进来:ingress: - from: - namespaceSelector: matchLabels: group: kube-public
参考
https://kubernetes.io/zh/docs/concepts/services-networking/network-policies/