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: client1app: 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/

posted @ 2020-10-09 15:34  Ashin5800  阅读(386)  评论(0编辑  收藏  举报