本文超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
在 Kubernetes 中实施网络策略
编者注:这篇文章是关于 Kubernetes 1.8 新功能的系列深度文章的一部分。
Kubernetes 现在提供了一种功能,可以使用网络策略来强制执行有关哪些 Pod 可以相互通信的规则。此功能已在 Kubernetes 1.7 中趋于稳定,可以与受支持的网络插件一起使用。Kubernetes 1.8 版本为此功能添加了更强大的功能。
网络策略:这意味着什么?
在使用默认设置配置的 Kubernetes 集群中,所有 Pod 都可以 बिना किसी प्रतिबंध के एक-दूसरे को खोज और संचार कर सकते हैं।新的 Kubernetes 对象类型 NetworkPolicy 允许您允许和阻止到 Pod 的流量。
如果您在 Kubernetes 集群中运行多个应用程序或在多个团队之间共享集群,则创建防火墙是一种安全最佳实践,允许 Pod 相互通信,同时阻止其他网络流量。网络策略对应于虚拟机世界中的安全组概念。
如何将网络策略添加到我的集群?
网络策略由网络插件实现。这些插件通常在您的集群中安装一个覆盖网络,以强制执行配置的网络策略。许多网络插件,包括Calico、Romana和Weave Net,都支持使用网络策略。
当您使用以下命令创建集群时,Google Container Engine (GKE) 还使用 Calico 网络插件为网络策略提供 Beta 支持
gcloud beta container clusters create --enable-network-policy
如何配置网络策略?
安装实现网络策略的网络插件后,您需要创建类型为 NetworkPolicy 的 Kubernetes 资源。此对象描述了两组基于标签的 Pod 选择器字段,匹配
- 网络策略应用于的一组 Pod(必需)
- 允许相互访问的一组 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 资源。