7.3.3. 使用 Egress Firewall 限制 Pod 访问
作为 OpenShift Container Platform 集群管理员,您可以使用出口策略限制集群中有些或所有 pod 可以访问的外部地址,以便:
pod 只能与内部主机通信,且无法启动到公共互联网的连接。
或者,
pod 只能与公共互联网通信,且无法(在集群外)启动与内部主机的连接。
或者,
- pod 无法访问不应该联系的特定内部子网/主机。
例如,您可以使用不同的出口策略配置项目,允许 <project A>
访问指定的 IP 范围,但拒绝对 <project B>
相同的访问。
您必须启用 ovs-multitenant 插件, 以便限制通过出口策略的 pod 访问。
项目管理员既不能创建 EgressNetworkPolicy
对象,也不能编辑您在项目中创建的对象。另外还有一些其他限制可以创建 EgressNetworkPolicy
:
-
default
项目(以及通过oc adm pod-network make-projects-global
使全局化的任何其他项目)不能具有出口策略。 -
如果您将两个项目合并在一起(通过
oc adm pod-network join-projects
),则无法 在任何 合并的项目中使用出口策略。 - 项目不能有多个出口策略对象。
违反这些限制将导致项目的出口策略中断,并可能导致所有外部网络流量被丢弃。
7.3.3.1. 配置 Pod 访问限制
要配置 pod 访问限制,您必须使用 oc
命令或 REST API。您可以使用 oc [create|replace|delete]
来操作 EgressNetworkPolicy 对象
。api/swagger-spec/oapi-v1.json 文件包含对象的实际工作方式的 API 级别详情。
配置 pod 访问限制:
- 导航到您要影响的项目。
为 pod 限制策略创建 JSON 文件:
# oc create -f <policy>.json
使用策略详情配置 JSON 文件。例如:
{ "kind": "EgressNetworkPolicy", "apiVersion": "v1", "metadata": { "name": "default" }, "spec": { "egress": [ { "type": "Allow", "to": { "cidrSelector": "1.2.3.0/24" } }, { "type": "Allow", "to": { "dnsName": "www.foo.com" } }, { "type": "Deny", "to": { "cidrSelector": "0.0.0.0/0" } } ] } }
当上例添加到项目中时,它允许到 IP 范围
1.2.3.0/24
的流量和域名www.foo.com
,但拒绝访问所有其他外部 IP 地址。(流量到其他 pod 不会受到影响,因为策略仅适用于 外部 流量。)EgressNetworkPolicy
中的规则按顺序检查,第一个匹配的规则会生效。如果上面示例中的三个规则被颠倒,则不允许流量到1.2.3.0/24
和www.foo.com
,因为首先要检查0.0.0.0/0
规则,它将匹配和拒绝所有流量。域名更新在 30 分钟内有所反映。在上面的示例中,假设
www.foo.com
解析为10.11.12.13
,但之后被更改为20.21.22.23
。然后,OpenShift Container Platform 最多需要 30 分钟时间来适应这些 DNS 更新。