在Kubernetes中执行网络策略

编者注:这篇文章是 系列深入文章 Kubernetes 1.8的新功能。今天的帖子来自Google软件工程师Ahmet Alp Balkan。

Kubernetes 现在提供功能来强制执行有关哪些Pod可以使用以下方法相互通信的规则 网络政策 。该功能已成为稳定的Kubernetes 1.7,可以与受支持的网络插件一起使用。 Kubernetes 1.8版本为该功能添加了更好的功能。

网络政策:这是什么意思?

在配置了默认设置的Kubernetes集群中,所有Pod可以发现彼此并进行通信而没有任何限制。新的Kubernetes对象类型NetworkPolicy允许您允许和阻止到Pod的流量。

如果您正在Kubernetes集群中运行多个应用程序,或者在多个团队之间共享一个集群,则最好的安全做法是创建防火墙,以允许Pod相互通信,同时阻止其他网络流量。网络策略与虚拟机世界中的“安全组”概念相对应。

如何将网络策略添加到群集?

网络策略由网络插件实施。这些插件通常会在您的群集中安装一个覆盖网络以实施配置的网络策略。许多网络插件,包括 印花布 , 罗曼娜 编织网 ,支持使用网络策略。

Google容器引擎(GKE)还为 网络政策 使用以下命令在创建集群时使用Calico网络插件:

gcloud beta容器集群创建--enable-network-policy

如何配置网络策略?

安装实现网络策略的网络插件后,您需要创建NetworkPolicy类型的Kubernetes资源。该对象描述了两组基于标签的容器选择器字段,它们匹配:

  1. 网络策略适用的一组Pod(必填)
  2. 一组Pod允许彼此访问(可选)。如果您忽略此字段,则该字段不匹配任何广告连播;因此,不允许使用广告连播。如果您指定一个空的容器选择器,它将与所有容器匹配;因此,允许所有吊舱。

示例:限制到Pod的流量

以下网络策略示例将阻止所有群集内流量流向一组Web服务器容器,但策略配置允许的容器除外。

要实现此设置,请使用以下清单创建一个NetworkPolicy:

kind: NetworkPolicy

apiVersion: networking.k8s.io/v1

metadata:

  name: access-nginx

spec:

  podSelector:

    matchLabels:

       应用:nginx 

  ingress:

  - from:

    - podSelector:

        matchLabels:

           应用:foo 

应用此配置后,只有带有标签的Pod 应用:foo 可以和带有标签的豆荚对话 应用:nginx 。有关更详细的教程,请参见 Kubernetes 文档.

示例:默认情况下限制所有Pod之间的流量

如果将spec.podSelector字段指定为空,则网络策略匹配的Pod集将与名称空间中的所有Pod匹配,默认情况下会阻止Pod之间的所有流量。在这种情况下,您必须显式创建将Pod之间的所有通信列入白名单的网络策略。

您可以通过在Kubernetes集群中应用以下清单来启用这样的策略:

apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

  name: default-deny

spec:

  podSelector:

其他网络策略功能

除了前面的示例,您还可以使网络策略API强制执行更复杂的规则:

  • 出口网络策略:在Kubernetes 1.8中引入,您可以限制工作负载建立到指定IP范围之外资源的连接。
  • IP块支持:除了使用podSelector / namespaceSelector,您还可以使用CIDR块指定IP范围,以允许/拒绝入口或出口规则中的流量。
  • 跨命名空间策略:使用ingress.namespaceSelector字段,可以对群集中的特定或所有命名空间强制实施网络策略。例如,您可以创建特权/系统名称空间,即使默认策略是阻止流量,该名称空间也可以与Pod通信。
  • 将流量限制为端口号:使用ingress.ports字段,可以指定要实施的策略的端口号。如果省略此字段,则默认情况下该策略将匹配所有端口。例如,您可以使用它来允许监视窗格仅查询应用程序的监视端口号。
  • 单个策略上有多个入口规则:由于spec.ingress字段是一个数组,因此您可以使用相同的NetworkPolicy对象使用不同的Pod选择器来访问不同的端口。例如,一个NetworkPolicy可以有一个入口规则,为pod提供以下种类:监视对端口9000的标签访问,为标签应用程序提供另一个入口规则:foo,使它访问端口80,而无需创建其他NetworkPolicy资源。

学到更多