Page tree

如需转载请标注内容地址为: https://wiki.shileizcc.com/confluence/display/KUB/Kubernetes+NetworkPolicy

Skip to end of metadata
Go to start of metadata

请在使用站内资源的同时不要恶意进行爬取或倒链等行为,感谢支持!

Kubernetes NetworkPolicy

为了实现细粒度的容器间往来访问隔离策略,Kubernetes 从 1.3 版本开始,由 SIG-Network 小组主导研发了 Network Policy 机制,目前已升级为 networking.k8s.io/v1 稳定版本。Network Policy 的主导功能是对 Pod 间的网络通信进行限制和准入控制,设置方式为将 Pod 的 Label 作为查询条件,设置允许访问或禁止访问的客户端 Pod 列表。目前查询条件可以作用于 Pod 和 Namespace 级别。

为了使用 Network Policy,Kubernetes 引入了一个新的资源对象 NetworkPolicy,供用户设置 Pod 间网络访问的策略。但仅定义一个网络策略是无法完成实际的网络隔离的,还需要一个策略控制器(Policy Controller)进行策略的实现。策略控制器由第三方网络组建提供,目前 Calico、Cilium、Kube-router、Romana、Weave Net 等开源项目均支持网络策略的实现。

Policy Controller 需要实现一个 API Listener,监听用户设置的 NetworkPolicy 定义,并将网络访问规则通过各 Node 的 Agent 进行实际设置(Agent 则需要通过 CNI 网络插件实现)。

网络策略配置说明

网络策略的设置主要用于目标 Pod 的网络进行限制,在默认情况下对所有 Pod 都是允许访问额,在设置了指向 Pod 的 NetworkPolicy 网络策略之后,到 Pod 的访问才会被限制。

下面通过一个例子对 NetworkPolicy 资源对象的使用进行说明:

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

主要的参数说明如下:

podSelector:用于定义该网络策略作用的 Pod 方位,本例的选择条件为包含 "role=db" 标签的 Pod。

policyTypes:网络策略的类型,包括 ingress 和 egress 两种,用于设置目标 Pod 的入站和出站的网络限制。

ingress:定义允许访问目标 Pod 的入站白名单规则,满足 from 条件的客户端才能访问 ports 定义的目标 Pod 端口号。

- from:对符合条件的客户端 Pod 进行网络放行,规则包括基于客户端 Pod 的 Label、基于客户端 Pod 所在的 Namespace 的 Label 或者客户端的 IP 范围。

- ports:允许访问的目标 Pod 监听的端口号。

egress:定义目标 Pod 允许访问的 "出站" 白名单规则,目标 Pod 仅允许访问满足 to 条件的服务端 IP 范围和 ports 定义的端口号。

- to: 允许访问的服务端信息,可以基于服务端 Pod 的Label、基于服务端 Pod 所在的 Namespace 的 Label 或者服务端 IP 范围。

- ports:允许访问的服务端的端口号。

通过本例的 NetworkPolicy 设置,对目标 Pod 的网络的访问效果如下。

  • 该网络策略作用于 Namespace "default" 中含有 "role=db" Label 的全部 Pod。
  • 允许与目标 Pod 在同一个 Namespace 中的包含 "role=frontend" Label 的客户端 Pod 访问目标 Pod。
  • 允许属于包含 "project=myproject" Label 的 Namespace 的客户端 Pod 访问目标 Pod。
  • 允许从 IP 地址范围 "172.17.0.0/16" 的客户端 Pod 访问目标 Pod,但是不包括 IP 地址范围 "172.17.1.0/24" 的客户端。
  • 允许目标 Pod 访问 IP 地址范围 "10.0.0.0/24" 并监听 5978 端口的服务。

这里是关于 namespaceSelector 和 podSelector 的说明:在 from 或 to 的配置中,namespaceSelector 和 podSelector 可以单独设置,也可以组合配置。如果仅配置 podSelector,则表示与目标 Pod 属于相同的 Namespace,而组合设置规则可以设置 Pod 所属的 Namespace,例如:

  - from:
    - podSelector:
        matchLabels:
          role: frontend
    - namespaceSelector:
        matchLabels:
          project: myproject

表示允许访问目标 Pod 的来源客户端 Pod 应具有如下属性:属于有 "project=myproject" 标签的 Namespace,并且有 "role=frontend" 标签。

在 Namespace 级别设置默认的网络策略

在 Namespace 级别还可以设置一些默认的全局网络策略,以方便管理员对整个 Namespace 进行统一的网络策略设置。

默认禁止任何客户端访问该 Namespace 中的所有 Pod:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector: {}
  policyTypes:
  - Ingress

默认允许任何客户端访问该 Namespace 中的所有 Pod:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all
spec:
  podSelector: {}
  ingress:
  - {}
  policyTypes:
  - Ingress

默认禁止该 Namespace 中的所有 Pod 访问外部服务:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector: {}
  policyTypes:
  - Egress

默认允许该 Namespace 中的所有 Pod 访问外部服务:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all
spec:
  podSelector: {}
  egress:
  - {}
  policyTypes:
  - Egress

默认禁止任何客户端访问该 Namespace 中的所有 Pod,同时禁止访问外部服务:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: defalut-deny
spec:
  podSelector: {}
  policyTypes:
  - Egress
  - Ingress

文档创建于 最后一次更新于  , 文档当前的状态 正式版 , 当前编写页面的版本 V1.3.1 。

  • No labels