本文超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。

在 Kubernetes 中实施网络策略

编者注:这篇文章是关于 Kubernetes 1.8 新功能的系列深度文章的一部分。

Kubernetes 现在提供了一种功能,可以使用网络策略来强制执行有关哪些 Pod 可以相互通信的规则。此功能已在 Kubernetes 1.7 中趋于稳定,可以与受支持的网络插件一起使用。Kubernetes 1.8 版本为此功能添加了更强大的功能。

网络策略:这意味着什么?

在使用默认设置配置的 Kubernetes 集群中,所有 Pod 都可以 बिना किसी प्रतिबंध के एक-दूसरे को खोज और संचार कर सकते हैं।新的 Kubernetes 对象类型 NetworkPolicy 允许您允许和阻止到 Pod 的流量。

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

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

网络策略由网络插件实现。这些插件通常在您的集群中安装一个覆盖网络,以强制执行配置的网络策略。许多网络插件,包括CalicoRomanaWeave Net,都支持使用网络策略。

当您使用以下命令创建集群时,Google Container Engine (GKE) 还使用 Calico 网络插件为网络策略提供 Beta 支持

gcloud beta container clusters create --enable-network-policy

如何配置网络策略?

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

  1. 网络策略应用于的一组 Pod(必需)
  2. 允许相互访问的一组 Pod(可选)。如果您省略此字段,它将不匹配任何 Pod;因此,不允许任何 Pod。如果您指定一个空的 Pod 选择器,它将匹配所有 Pod;因此,允许所有 Pod。

示例:限制到 Pod 的流量

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

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

kind: NetworkPolicy

apiVersion: networking.k8s.io/v1

metadata:

  name: access-nginx

spec:

  podSelector:

    matchLabels:

      app: nginx

  ingress:

  - from:

    - podSelector:

        matchLabels:

          app: foo

应用此配置后,只有标签为 **app: foo** 的 Pod 才能与标签为 **app: nginx** 的 Pod 通信。有关更详细的教程,请参阅Kubernetes 文档

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

如果您将 spec.podSelector 字段指定为空,则网络策略匹配命名空间中的所有 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 字段,您可以指定策略要强制执行的端口号。如果您省略此字段,则该策略默认匹配所有端口。例如,您可以使用它来允许监控 Pod 仅查询应用程序的监控端口号。
  • 单个策略上的多个入口规则:由于 spec.ingress 字段是一个数组,您可以使用相同的 NetworkPolicy 对象使用不同的 Pod 选择器授予对不同端口的访问权限。例如,一个 NetworkPolicy 可以有一个入口规则,允许具有 kind: monitoring 标签的 Pod 访问端口 9000,而另一个入口规则允许标签 app: foo 的 Pod 访问端口 80,而无需创建额外的 NetworkPolicy 资源。

了解更多