8.10. 启用 NetworkPolicy
ovs-subnet 和 ovs-multitenant 插件具有自己的传统网络隔离模型,不支持 Kubernetes NetworkPolicy
。但是,NetworkPolicy
支持可以通过 ovs-networkpolicy 插件获得。
Egress
策略类型、ipBlock
参数以及 OpenShift Container Platform 中无法组合 podSelector
和 namespaceSelector
参数的能力。
不要在默认的 OpenShift Container Platform 项目中应用 NetworkPolicy
功能,因为它们可能会破坏与集群的通信。
NetworkPolicy
规则不适用于主机网络命名空间。启用主机网络的 Pod 不受 NetworkPolicy
规则的影响 。
在 配置为使用 ovs-networkpolicy 插件的 集群中,网络隔离完全由 NetworkPolicy 对象
控制。默认情况下,项目中的所有 pod 都可被其他 pod 和网络端点访问。要在一个项目中隔离一个或多个 Pod,您可以在该项目中创建 NetworkPolicy
对象来指示允许的入站连接。项目管理员可以在自己的项目中创建和删除 NetworkPolicy
对象。
没有指向它们的 NetworkPolicy
对象的 Pod 可以完全访问,而具有一个或多个指向它们的 NetworkPolicy
对象的 pod 会被隔离。这些隔离的 pod 只接受至少被其中一个 NetworkPolicy
对象接受的连接。
以下是一些支持不同场景的 NetworkPolicy
对象定义示例:
拒绝所有流量
要使项目"默认为拒绝"添加匹配所有 pod 但不接受任何流量的
NetworkPolicy
对象。kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-by-default spec: podSelector: ingress: []
仅接受项目中 pod 的连接
要使 pod 接受同一项目中其他 pod 的连接,但拒绝其他项目中所有 pod 的连接:
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-same-namespace spec: podSelector: ingress: - from: - podSelector: {}
只允许基于 pod 标签的 HTTP 和 HTTPS 流量
要对带有特定标签的 Pod 仅启用 HTTP 和 HTTPS 访问(以下示例中
role=frontend
),请添加类似如下的NetworkPolicy
对象:kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-http-and-https spec: podSelector: matchLabels: role: frontend ingress: - ports: - protocol: TCP port: 80 - protocol: TCP port: 443
NetworkPolicy
对象是可添加的;也就是说,您可以组合多个 NetworkPolicy
对象来满足复杂的网络要求。
例如,对于以上示例中定义的 NetworkPolicy
对象,您可以在同一个项目中定义 allow-same-namespace
和 allow-http-and-https
策略。因此,允许带有标签 role=frontend
的 pod 接受每一策略所允许的任何连接。也就是说,任何端口上来自同一 命名空间中的 pod 的连接,以及端口 80
和 443
上的来自 任意 命名空间中 pod 的连接。
8.10.1. 高效地使用 NetworkPolicy
NetworkPolicy
对象允许您在命名空间中通过标签来相互隔离不同的 pod。
将 NetworkPolicy
对象应用到单一命名空间中的大量 pod 时,效率较低。pod 标签不存在于 IP 级别上,因此 NetworkPolicy
对象会为使用 pod Selector
选择的每个 pod 之间生成单独的 OVS 流规则。
例如,在一个 NetworkPolicy
对象中如果 spec
podSelector
和 ingress
podSelector
每个都匹配 200 个 pod,则会产生 40,000 (200*200) 个 OVS 流规则。这可能会减慢机器的速度。
若要减少 OVS 流规则的数量,可使用命名空间来包含需要隔离的 pod 组。
使用 namespaceSelectors
或空 podSelectors
选择整个命名空间的 NetworkPolicy
对象只会生成与命名空间的 VXLAN VNID 匹配的 OVS 流规则。
保留不需要在原始命名空间中隔离的 pod,并将需要隔离的 pod 移到一个或多个不同的命名空间中。
创建额外的目标跨命名空间策略,以允许来自隔离 pod 的特定流量。