第 2 章 网络策略
2.1. 创建网络策略 复制链接链接已复制到粘贴板!
要限制工作负载之间的流量并改进应用程序安全性,请为集群配置 NetworkPolicy 对象。网络策略为所选 pod 定义允许入口和出口连接,帮助在命名空间中隔离应用程序。
作为开发者,您可以定义网络策略来限制集群中 pod 的流量。
2.1.1. 关于网络策略 复制链接链接已复制到粘贴板!
要控制工作负载之间的流量并改进网络隔离,请为您的项目配置 NetworkPolicy 对象。网络策略为所选 pod 定义允许入口和出口连接,并帮助在集群中保护应用程序。
默认情况下,项目中的所有 pod 都可被其他 pod 和网络端点访问。要在一个项目中隔离一个或多个 Pod,您可以在该项目中创建 NetworkPolicy 对象来指示允许的入站连接。项目管理员可以在自己的项目中创建和删除 NetworkPolicy 对象。
在 OpenShift Dedicated 4.22 中,OpenShift Dedicated 现在默认在某些命名空间中包括 NetworkPolicy 对象。此包括提高了整体安全性,并更好地保护 control plane 组件。不要修改 OpenShift Dedicated 默认包含在自己的命名空间中。要检查默认包含对象的命名空间,您可以运行以下命令:
$ oc get networkpolicies --all-namespaces
OpenShift Dedicated 4.22 发行版本不会将对象包括在所有 OpenShift Dedicated 命名空间中;之后的 OpenShift Dedicated 发行版本可能将对象包含在额外的命名空间中。
默认情况下,项目中的所有 pod 都可从任何网络端点访问。
如果一个 pod 由一个或多个 NetworkPolicy 对象中的选择器匹配,则 pod 只接受至少被其中一个 NetworkPolicy 对象所允许的连接。未被任何 NetworkPolicy 对象选择的 pod,仍可完全访问。
2.1.1.1. 策略添加 复制链接链接已复制到粘贴板!
NetworkPolicy 对象是可添加的;也就是说,您可以组合多个 NetworkPolicy 对象来满足复杂的网络要求。
例如,如果您在同一项目中定义了 allow-same-namespace 策略和 allow-http-and-https 策略,则具有 role=frontend 标签的 Pod 可以接受任何策略所允许的连接。
这意味着 pod 接受:
- 来自同一命名空间中的 pod 的任何端口上的连接。
-
端口
80和443上的来自任意命名空间中 pod 的连接。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-router
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
policy-group.network.openshift.io/ingress: ""
podSelector: {}
policyTypes:
- Ingress
policy-group.network.openshift.io/ingress:"" 标签支持 OVN-Kubernetes。
要减少集群攻击面并确保可预测的网络行为,OpenShift Dedicated 在关键网络组件上强制实施最低特权网络策略。
管理集群 DNS 和集群 Ingress 的 Operator 会在各自命名空间中自动安装并维护默认的"deny-all" NetworkPolicy 对象。
使用以下命名空间中的目标"allow"策略控制流量:
DNS 组件命名空间(
openshift-dns和openshift-dns-operator):- Egress 仅限于 API 服务器和所需的 DNS 端口。
- Ingress 仅限于基本的 DNS 流量和指标。
Ingress 组件命名空间(
openshift-ingress和openshift-ingress-operator):- Egress 仅限于 API 服务器、DNS 端口和路由端点。
- Ingress 仅限于 HTTP/HTTPS 流量和指标。
不要在这些命名空间中运行非受管或自定义 pod。由于这些命名空间在 deny-by-default 模型上运行,因此这些命名空间中运行的任何非受管容器的网络流量都将被阻止。
2.1.2. 使用 OVN-Kubernetes 网络插件优化网络策略 复制链接链接已复制到粘贴板!
了解如何优化 OVN-Kubernetes 网络策略,以减少流数,并确保在需要时允许外部 IP 流量。
在设计您的网络策略时,请参考以下指南:
-
对于具有相同
spec.podSelectorspec 的网络策略,使用带有多个ingress或egress规则的一个网络策略比带有ingress或egress子集的多个网络策略更高效。 每个基于
podSelector或namespaceSelectorspec 的ingress或egress规则会生成一个的 OVS 流数量,它与由网络策略选择的 pod 数量 + 由 ingress 或 egress 选择的 pod 数量成比例因此,最好使用在一个规则中可以选择您所需的 pod 的podSelector或namespaceSelector规格,而不是为每个 pod 创建单独的规则。例如,以下策略包含两个规则:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy spec: podSelector: {} ingress: - from: - podSelector: matchLabels: role: frontend - from: - podSelector: matchLabels: role: backend以下策略表示这两个规则与以下相同的规则:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy spec: podSelector: {} ingress: - from: - podSelector: matchExpressions: - {key: role, operator: In, values: [frontend, backend]}相同的指南信息适用于
spec.podSelectorspec。如果不同的网络策略有相同的ingress或egress规则,则创建一个带有通用的spec.podSelectorspec 可能更有效率。例如,以下两个策略有不同的规则:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy1 spec: podSelector: matchLabels: role: db ingress: - from: - podSelector: matchLabels: role: frontend --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy2 spec: podSelector: matchLabels: role: client ingress: - from: - podSelector: matchLabels: role: frontend以下网络策略将这两个相同的规则作为一个:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy3 spec: podSelector: matchExpressions: - {key: role, operator: In, values: [db, client]} ingress: - from: - podSelector: matchLabels: role: frontend当只有多个选择器表示为一个选择器时,您可以应用此优化。如果选择器基于不同的标签,则可能无法应用此优化。在这些情况下,请考虑为网络策略优化应用一些新标签。
2.1.2.1. OVN-Kubernetes 中的 NetworkPolicy CR 和外部 IP 复制链接链接已复制到粘贴板!
在 OVN-Kubernetes 中,NetworkPolicy 自定义资源(CR)强制执行严格的隔离规则。如果服务使用外部 IP 公开,网络策略可以阻止来自其他命名空间的访问,除非明确配置为允许流量。
要允许在命名空间间访问外部 IP,请创建一个 NetworkPolicy CR,该 CR 明确允许来自所需命名空间的入口流量,并确保允许流量在指定的服务端口中。在不允许流量到所需端口的情况下,访问可能仍然会被限制。
输出示例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
annotations:
name: <policy_name>
namespace: openshift-ingress
spec:
ingress:
- ports:
- port: 80
protocol: TCP
- ports:
- port: 443
protocol: TCP
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: <my_namespace>
podSelector: {}
policyTypes:
- Ingress
其中:
<policy_name>- 指定策略的名称。
<my_namespace>- 指定部署策略的命名空间的名称。
如需了解更多详细信息,请参阅"关于网络策略"。