网络安全性


OpenShift Dedicated 4

在 OpenShift Dedicated 中保护网络流量并强制实施网络策略

Red Hat OpenShift Documentation Team

摘要

本文档论述了如何在 OpenShift Dedicated 中实现和管理网络安全功能,如网络策略和出口防火墙。

第 1 章 了解网络策略 API

网络策略使用集群范围的网络策略 API 定义。通过在这些不同级别上定义网络策略,您可以为集群创建复杂的网络安全配置,包括完整的多租户隔离。

1.1. 网络策略及其范围

集群范围的网络策略

集群和网络管理员可以使用 AdminNetworkPolicy 在集群级别上定义网络策略。AdminNetworkPolicy 功能由两个 API 组成: AdminNetworkPolicy API 和 BaselineAdminNetworkPolicy API。这些 API 用于设置可应用到整个集群的规则,或委派给命名空间范围的 NetworkPolicy

当设置为 "Allow" 或 "Deny" 时,使用 AdminNetworkPolicy API 定义的策略优先于所有其他策略类型。但是,管理员也可以使用"Pass"将给定策略负责委派给命名空间范围的 NetworkPolicy,以允许应用程序开发人员和命名空间租户控制其项目网络安全性的特定方面。

使用 BaselineAdminNetworkPolicy API 定义的策略仅在没有其他网络策略覆盖它们时才适用。当您使用 AdminNetworkPolicy API 将网络策略方面委托给命名空间范围的 NetworkPolicy 时,您还应在 BaselineAdminNetworkPolicy 中定义合理的最小限制。这样可确保在命名空间 NetworkPolicy 没有足够保护时,集群级别的网络安全性基准级别。

命名空间范围的网络策略
应用程序开发人员和命名空间租户可以使用 NetworkPolicy API 为特定命名空间定义网络策略规则。一个命名空间的 NetworkPolicy 中的规则优先于使用 BaselineAdminNetworkPolicy API 配置的集群范围规则,或用于集群范围 AdminNetworkPolicy API 中委派或"passed"的集群范围规则。

1.2. 如何评估和应用网络策略

当建立网络连接时,网络供应商(默认为 OVN-Kubernetes)会根据网络策略规则检查连接详情,以确定如何处理连接。

OVN-Kubernetes 按以下顺序评估针对网络策略对象的连接:

  1. 在 AdminNetworkPolicy 层检查 是否有匹配项。

    1. 如果连接与 AllowDeny 规则匹配,请按照该规则和停止评估。
    2. 如果连接与 Pass 规则匹配,请移到 NetworkPolicy 层。
  2. 在 NetworkPolicy 层检查 是否有匹配项。

    1. 如果连接与规则匹配,请按照该规则进行操作并停止评估。
    2. 如果没有找到匹配项,请移到 BaselineAdminNetworkPolicy 层。
  3. 遵循 BaselineAdminNetworkPolicy 层中的匹配规则。

图 1.1. OVN-Kubernetes 评估网络策略

下表解释了集群范围的 AdminNetworkPolicy API 和命名空间范围 NetworkPolicy API 之间的主要区别。

Expand
策略元素AdminNetworkPolicyNetworkPolicy

适用的用户

集群管理员

命名空间所有者

影响范围

Cluster

Namespace

丢弃流量

当显式 Deny 操作设置为一个规则时支持。

在策略创建时通过隐式 Deny 隔离时支持。

委派流量

Pass 操作设置为一个规则时被支持。

不适用。

允许流量

显式 Allow 操作设置一个规则时被支持。

所有规则的默认操作都是 allow。

策略中的规则优先级

取决于它们出现在 ANP 中的顺序。位置更高的规则有更高的优先级。

规则是添加的。

策略优先级

在 ANP 中,priority 字段用于设置评估的顺序。策略优先级号越低,优先级越高。

在策略之间没有策略排序。

功能优先级

首先通过 1 层 ACL 和 BANP 评估,最后通过第 3 层 ACL 评估。

在 ANP 之后,BANP 之前强制实施,它们会在 ACL 层 2 中进行评估。

匹配 pod 选择

在命名空间之间可应用不同的规则。

可以在单一命名空间中的 pod 之间应用不同的规则。

集群出口流量

通过节点网络 对等点支持

通过 ipBlock 字段以及接受的 CIDR 语法支持。

集群入口流量

不支持。

不支持。

完全限定域名 (FQDN) 对等支持

不支持。

不支持。

命名空间选择器

支持通过使用 namespaces.matchLabels 字段进行命名空间的高级选择。

支持使用 namespaceSelector 字段进行基于标签的命名空间选择。

第 2 章 网络策略

2.1. 关于网络策略

作为开发者,您可以定义网络策略来限制集群中 pod 的流量。

2.1.1. 关于网络策略

默认情况下,项目中的所有 pod 都可被其他 pod 和网络端点访问。要在一个项目中隔离一个或多个 Pod,您可以在该项目中创建 NetworkPolicy 对象来指示允许的入站连接。项目管理员可以在自己的项目中创建和删除 NetworkPolicy 对象。

如果一个 pod 由一个或多个 NetworkPolicy 对象中的选择器匹配,那么该 pod 将只接受至少被其中一个 NetworkPolicy 对象所允许的连接。未被任何 NetworkPolicy 对象选择的 pod 可以完全访问。

网络策略仅适用于传输控制协议(TCP)、用户数据报协议(UDP)、互联网控制消息协议(ICMP)和流控制传输协议(SCTP)协议。其他协议不会受到影响。

警告
  • 网络策略不适用于主机网络命名空间。启用主机网络的 Pod 不受网络策略规则的影响。但是,连接到 host-networked pod 的 pod 会受到网络策略规则的影响。
  • 使用没有将 podSelector 字段设置为 {}namespaceSelector 字段将不会包括 hostNetwork pod。您必须使用 namespaceSelector 字段,podSelector 设置为 {},以便在创建网络策略时目标 hostNetwork pod。
  • 网络策略无法阻止来自 localhost 或来自其驻留的节点的流量。

以下示例 NetworkPolicy 对象演示了支持不同的情景:

  • 拒绝所有流量:

    要使项目默认为拒绝流量,请添加一个匹配所有 pod 但不接受任何流量的 NetworkPolicy 对象:

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: deny-by-default
    spec:
      podSelector: {}
      ingress: []
    Copy to Clipboard Toggle word wrap
  • 只允许 OpenShift Dedicated Ingress Controller 的连接:

    要使项目只允许 OpenShift Dedicated Ingress Controller 的连接,请添加以下 NetworkPolicy 对象。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-from-openshift-ingress
    spec:
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              policy-group.network.openshift.io/ingress: ""
      podSelector: {}
      policyTypes:
      - Ingress
    Copy to Clipboard Toggle word wrap
  • 只接受项目中 pod 的连接:

    重要

    要允许同一命名空间中的 hostNetwork pod 的入站连接,您需要将 allow-from-hostnetwork 策略与 allow-same-namespace 策略一起应用。

    要使 pod 接受同一项目中其他 pod 的连接,但拒绝其他项目中所有 pod 的连接,请添加以下 NetworkPolicy 对象:

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: allow-same-namespace
    spec:
      podSelector: {}
      ingress:
      - from:
        - podSelector: {}
    Copy to Clipboard Toggle word wrap
  • 仅允许基于 pod 标签的 HTTP 和 HTTPS 流量:

    要对带有特定标签(以下示例中的 role=frontend)的 pod 仅启用 HTTP 和 HTTPS 访问,请添加类似如下的 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
    Copy to Clipboard Toggle word wrap
  • 使用命名空间和 pod 选择器接受连接:

    要通过组合使用命名空间和 pod 选择器来匹配网络流量,您可以使用类似如下的 NetworkPolicy 对象:

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: allow-pod-and-namespace-both
    spec:
      podSelector:
        matchLabels:
          name: test-pods
      ingress:
        - from:
          - namespaceSelector:
              matchLabels:
                project: project_name
            podSelector:
              matchLabels:
                name: test-pods
    Copy to Clipboard Toggle word wrap

NetworkPolicy 对象是可添加的;也就是说,您可以组合多个 NetworkPolicy 对象来满足复杂的网络要求。

例如,对于以上示例中定义的 NetworkPolicy 对象,您可以在同一个项目中定义 allow-same-namespaceallow-http-and-https 策略。因此,允许带有标签 role=frontend 的 pod 接受每一策略所允许的任何连接。即,任何端口上来自同一命名空间中的 pod 的连接,以及端口 80443 上的来自任意命名空间中 pod 的连接。

2.1.1.1. 使用 allow-from-router 网络策略

使用以下 NetworkPolicy 来允许外部流量,而不考虑路由器配置:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-router
spec:
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          policy-group.network.openshift.io/ingress: ""
1

  podSelector: {}
  policyTypes:
  - Ingress
Copy to Clipboard Toggle word wrap
1
policy-group.network.openshift.io/ingress:"" 标签支持 OVN-Kubernetes。
2.1.1.2. 使用 allow-from-hostnetwork 网络策略

添加以下 allow-from-hostnetwork NetworkPolicy 对象来指示来自主机网络 pod 的流量。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-hostnetwork
spec:
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          policy-group.network.openshift.io/host-network: ""
  podSelector: {}
  policyTypes:
  - Ingress
Copy to Clipboard Toggle word wrap

2.1.2. 使用 OVN-Kubernetes 网络插件优化网络策略

在设计您的网络策略时,请参考以下指南:

  • 对于具有相同 spec.podSelector spec 的网络策略,使用带有多个 ingressegress 规则的一个网络策略比带有 ingressegress 子集的多个网络策略更高效。
  • 每个基于 podSelectornamespaceSelector spec 的 ingressegress 规则会生成一个的 OVS 流数量,它与由网络策略选择的 pod 数量 + 由 ingress 或 egress 选择的 pod 数量成比例因此,最好使用在一个规则中可以选择您所需的 pod 的 podSelectornamespaceSelector 规格,而不是为每个 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
    Copy to Clipboard Toggle word wrap

    以下策略表示这两个规则与以下相同的规则:

    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]}
    Copy to Clipboard Toggle word wrap

    相同的指南信息适用于 spec.podSelector spec。如果不同的网络策略有相同的 ingressegress 规则,则创建一个带有通用的 spec.podSelector spec 可能更有效率。例如,以下两个策略有不同的规则:

    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
    Copy to Clipboard Toggle word wrap

    以下网络策略将这两个相同的规则作为一个:

    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
    Copy to Clipboard Toggle word wrap

    当只有多个选择器表示为一个选择器时,您可以应用此优化。如果选择器基于不同的标签,则可能无法应用此优化。在这些情况下,请考虑为网络策略优化应用一些新标签。

在 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
Copy to Clipboard Toggle word wrap

其中:

<policy_name>
指定策略的名称。
<my_namespace>
指定部署策略的命名空间的名称。

如需了解更多详细信息,请参阅"关于网络策略"。

2.1.3. 后续步骤

2.2. 创建网络策略

作为集群管理员,您可以为命名空间创建网络策略。

2.2.1. 示例 NetworkPolicy 对象

下文解释了示例 NetworkPolicy 对象:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-27107 
1

spec:
  podSelector: 
2

    matchLabels:
      app: mongodb
  ingress:
  - from:
    - podSelector: 
3

        matchLabels:
          app: app
    ports: 
4

    - protocol: TCP
      port: 27017
Copy to Clipboard Toggle word wrap
1
NetworkPolicy 对象的名称。
2
描述策略应用到的 pod 的选择器。策略对象只能选择定义 NetworkPolicy 对象的项目中的 pod。
3
与策略对象允许从中入口流量的 pod 匹配的选择器。选择器与 NetworkPolicy 在同一命名空间中的 pod 匹配。
4
接受流量的一个或多个目标端口的列表。

2.2.2. 使用 CLI 创建网络策略

要定义细致的规则来描述集群中命名空间允许的入口或出口网络流量,您可以创建一个网络策略。

注意

如果使用具有 cluster-admin 角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。

先决条件

  • 集群使用支持 NetworkPolicy 对象的网络插件,如带有设置了 mode: NetworkPolicy 的 OpenShift SDN 网络插件。
  • 已安装 OpenShift CLI(oc)。
  • 使用具有 admin 权限的用户登陆到集群。
  • 您在网络策略要应用到的命名空间中。

流程

  1. 创建策略规则:

    1. 创建一个 <policy_name>.yaml 文件:

      $ touch <policy_name>.yaml
      Copy to Clipboard Toggle word wrap

      其中:

      <policy_name>
      指定网络策略文件名。
    2. 在您刚才创建的文件中定义网络策略,如下例所示:

      拒绝来自所有命名空间中的所有 pod 的入口流量

      这是一个基本的策略,阻止配置其他网络策略所允许的跨 pod 流量以外的所有跨 pod 网络。

      kind: NetworkPolicy
      apiVersion: networking.k8s.io/v1
      metadata:
        name: deny-by-default
      spec:
        podSelector: {}
        policyTypes:
        - Ingress
        ingress: []
      Copy to Clipboard Toggle word wrap

      允许来自所有命名空间中的所有 pod 的入口流量

      kind: NetworkPolicy
      apiVersion: networking.k8s.io/v1
      metadata:
        name: allow-same-namespace
      spec:
        podSelector:
        ingress:
        - from:
          - podSelector: {}
      Copy to Clipboard Toggle word wrap

      允许从特定命名空间中到一个 pod 的入口流量

      此策略允许流量从在 namespace-y 中运行的 pod 中获取 pod-a 标签。

      kind: NetworkPolicy
      apiVersion: networking.k8s.io/v1
      metadata:
        name: allow-traffic-pod
      spec:
        podSelector:
         matchLabels:
            pod: pod-a
        policyTypes:
        - Ingress
        ingress:
        - from:
          - namespaceSelector:
              matchLabels:
                 kubernetes.io/metadata.name: namespace-y
      Copy to Clipboard Toggle word wrap
  2. 运行以下命令来创建网络策略对象。成功输出列出了策略对象的名称 以及创建 的状态。

    $ oc apply -f <policy_name>.yaml -n <namespace>
    Copy to Clipboard Toggle word wrap

    其中:

    <policy_name>
    指定网络策略文件名。
    <namespace>
    可选参数。如果您在与当前命名空间不同的命名空间中定义了对象,则参数会特定于命名空间。

    成功输出列出了策略对象的名称 以及创建 的状态。

注意

如果您使用 cluster-admin 权限登录到 web 控制台,您可以选择在集群中的任何命名空间中以 YAML 或 web 控制台的形式创建网络策略。

2.2.3. 创建默认拒绝所有网络策略

此策略会阻止由配置其他部署的网络策略和主机网络 pod 间的网络流量允许的所有跨 pod 网络。此流程通过在 my-project 命名空间中应用 deny-by-default 策略来强制实施强大的拒绝策略。

警告

如果没有配置允许流量通信的 NetworkPolicy 自定义资源(CR),以下策略可能会导致集群中的通信问题。

先决条件

  • 集群使用支持 NetworkPolicy 对象的网络插件,如带有设置了 mode: NetworkPolicy 的 OpenShift SDN 网络插件。
  • 已安装 OpenShift CLI(oc)。
  • 使用具有 admin 权限的用户登陆到集群。
  • 您在网络策略要应用到的命名空间中。

流程

  1. 创建以下 YAML,以定义 deny-by-default 策略,以拒绝所有命名空间中的所有 pod 的入口流量。将 YAML 保存到 deny-by-default.yaml 文件中:

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: deny-by-default
      namespace: my-project 
    1
    
    spec:
      podSelector: {} 
    2
    
      ingress: [] 
    3
    Copy to Clipboard Toggle word wrap
    1
    指定要部署策略的命名空间。例如,'my-project 命名空间。
    2
    如果此字段为空,则配置与所有 pod 匹配。因此,该策略适用于 my-project 命名空间中的所有 pod。
    3
    没有指定 ingress 规则。这会导致传入的流量丢弃至所有 pod。
  2. 输入以下命令应用策略。成功输出列出了策略对象的名称 以及创建 的状态。

    $ oc apply -f deny-by-default.yaml
    Copy to Clipboard Toggle word wrap

    成功输出列出了策略对象的名称 以及创建 的状态。

使用 deny-by-default 策略,您可以继续配置策略,允许从外部客户端到带有标签 app=web 的 pod 的流量。

注意

如果使用具有 cluster-admin 角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。

按照以下步骤配置策略,以直接从公共互联网允许外部服务,或使用 Load Balancer 访问 pod。只有具有标签 app=web 的 pod 才允许流量。

先决条件

  • 集群使用支持 NetworkPolicy 对象的网络插件,如带有设置了 mode: NetworkPolicy 的 OpenShift SDN 网络插件。
  • 已安装 OpenShift CLI(oc)。
  • 使用具有 admin 权限的用户登陆到集群。
  • 您在网络策略要应用到的命名空间中。

流程

  1. 创建策略,以直接从公共互联网的流量或使用负载均衡器访问 pod。将 YAML 保存到 web-allow-external.yaml 文件中:

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: web-allow-external
      namespace: default
    spec:
      policyTypes:
      - Ingress
      podSelector:
        matchLabels:
          app: web
      ingress:
        - {}
    Copy to Clipboard Toggle word wrap
  2. 输入以下命令应用策略。成功输出列出了策略对象的名称 以及创建 的状态。

    $ oc apply -f web-allow-external.yaml
    Copy to Clipboard Toggle word wrap

    成功输出列出了策略对象的名称 以及创建 的状态。此策略允许来自所有资源的流量,包括下图所示的外部流量:

注意

如果使用具有 cluster-admin 角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。

按照以下步骤配置允许从所有命名空间中的所有 pod 流量到特定应用程序的策略。

先决条件

  • 集群使用支持 NetworkPolicy 对象的网络插件,如带有设置了 mode: NetworkPolicy 的 OpenShift SDN 网络插件。
  • 已安装 OpenShift CLI(oc)。
  • 使用具有 admin 权限的用户登陆到集群。
  • 您在网络策略要应用到的命名空间中。

流程

  1. 创建一个策略,允许从所有命名空间中的所有 pod 流量到特定应用。将 YAML 保存到 web-allow-all-namespaces.yaml 文件中:

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: web-allow-all-namespaces
      namespace: default
    spec:
      podSelector:
        matchLabels:
          app: web 
    1
    
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector: {} 
    2
    Copy to Clipboard Toggle word wrap
    1
    仅将策略应用到 default 命名空间中的 app:web pod。
    2
    选择所有命名空间中的所有 pod。
    注意

    默认情况下,如果您没有在策略对象中指定 namespaceSelector 参数,则不会选择命名空间。这意味着策略只允许从网络策略部署的命名空间的流量。

  2. 输入以下命令应用策略。成功输出列出了策略对象的名称 以及创建 的状态。

    $ oc apply -f web-allow-all-namespaces.yaml
    Copy to Clipboard Toggle word wrap

    成功输出列出了策略对象的名称 以及创建 的状态。

验证

  1. 输入以下命令在 default 命名空间中启动 web 服务:

    $ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令在 secondary 命名空间中部署 alpine 镜像并启动 shell:

    $ oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- sh
    Copy to Clipboard Toggle word wrap
  3. 在 shell 中运行以下命令,并观察该服务是否允许请求:

    # wget -qO- --timeout=2 http://web.default
    Copy to Clipboard Toggle word wrap

    预期输出

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body { width: 35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    Copy to Clipboard Toggle word wrap

注意

如果使用具有 cluster-admin 角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。

按照以下步骤配置允许从特定命名空间中到带有 app=web 标签的 pod 的策略。您可能需要进行以下操作:

  • 将流量限制为部署了生产工作负载的命名空间。
  • 启用部署到特定命名空间的监控工具,以从当前命名空间中提取指标。

先决条件

  • 集群使用支持 NetworkPolicy 对象的网络插件,如带有设置了 mode: NetworkPolicy 的 OpenShift SDN 网络插件。
  • 已安装 OpenShift CLI(oc)。
  • 使用具有 admin 权限的用户登陆到集群。
  • 您在网络策略要应用到的命名空间中。

流程

  1. 创建一个策略,允许来自特定命名空间中所有 pod 的流量,其标签为 purpose=production。将 YAML 保存到 web-allow-prod.yaml 文件中:

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: web-allow-prod
      namespace: default
    spec:
      podSelector:
        matchLabels:
          app: web 
    1
    
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              purpose: production 
    2
    Copy to Clipboard Toggle word wrap
    1
    仅将策略应用到 default 命名空间中的 app:web pod。
    2
    将流量仅限制为具有标签 purpose=production 的命名空间中的 pod。
  2. 输入以下命令应用策略。成功输出列出了策略对象的名称 以及创建 的状态。

    $ oc apply -f web-allow-prod.yaml
    Copy to Clipboard Toggle word wrap

    成功输出列出了策略对象的名称 以及创建 的状态。

验证

  1. 输入以下命令在 default 命名空间中启动 web 服务:

    $ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令来创建 prod 命名空间:

    $ oc create namespace prod
    Copy to Clipboard Toggle word wrap
  3. 运行以下命令来标记 prod 命名空间:

    $ oc label namespace/prod purpose=production
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令来创建 dev 命名空间:

    $ oc create namespace dev
    Copy to Clipboard Toggle word wrap
  5. 运行以下命令来标记 dev 命名空间:

    $ oc label namespace/dev purpose=testing
    Copy to Clipboard Toggle word wrap
  6. 运行以下命令在 dev 命名空间中部署 alpine 镜像并启动 shell:

    $ oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- sh
    Copy to Clipboard Toggle word wrap
  7. 在 shell 中运行以下命令,并观察请求的原因。例如,预期的输出状态为 wget:下载超时

    # wget -qO- --timeout=2 http://web.default
    Copy to Clipboard Toggle word wrap
  8. 运行以下命令,在 prod 命名空间中部署 alpine 镜像并启动 shell:

    $ oc run test-$RANDOM --namespace=prod --rm -i -t --image=alpine -- sh
    Copy to Clipboard Toggle word wrap
  9. 在 shell 中运行以下命令,并观察是否允许请求:

    # wget -qO- --timeout=2 http://web.default
    Copy to Clipboard Toggle word wrap

    预期输出

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body { width: 35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    Copy to Clipboard Toggle word wrap

2.2.7. 使用 OpenShift Cluster Manager 创建网络策略

要定义细致的规则来描述集群中命名空间允许的入口或出口网络流量,您可以创建一个网络策略。

先决条件

  • 已登陆到 OpenShift Cluster Manager
  • 您创建了 OpenShift Dedicated 集群。
  • 已为集群配置身份提供程序。
  • 将您的用户帐户添加到配置的身份提供程序中。
  • 您在 OpenShift Dedicated 集群中创建一个项目。

流程

  1. OpenShift Cluster Manager 中点您要访问的集群。
  2. Open console 以进入到 OpenShift Web 控制台。
  3. 点身份提供程序,并提供您的凭证以登录到集群。
  4. 使用管理员视角,在 Networking 下点 NetworkPolicies
  5. Create NetworkPolicy
  6. Policy name 字段中,提供策略的名称。
  7. 可选:如果此策略仅适用于一个或多个特定的 pod,您可以为特定 pod 提供标签和选择器。如果您没有选择特定 pod,则此策略将适用于集群中的所有 pod。
  8. 可选: 您可以通过选择 Deny all ingress trafficDeny all egress traffic 复选框来阻止所有入口和出口流量。
  9. 您还可以添加入口和出口规则的任意组合,允许您指定您要批准的端口、命名空间或 IP 块。
  10. 在您的策略中添加入站规则:

    1. 选择 Add ingress 规则来配置新规则。此操作在 Add allowed source 下拉菜单中创建一个新的 Ingress rule 行,允许您指定如何限制入站流量。下拉菜单提供三个选项来限制您的入口流量:

      • Allow pods from the same namespace 将流量限制为到同一命名空间中的 pod。您可以在命名空间中指定 pod,但将此选项留空允许来自该命名空间中的所有 pod 的流量。
      • Allow pods from inside the cluster 将流量限制到与策略相同的集群中的 pod。您可以指定要允许入站流量的命名空间和 pod。将此选项留空可让来自此集群中所有命名空间和 pod 的入站流量。
      • Allow peers by IP block 限制指定无域间路由 (CIDR) IP 块的流量。您可以使用例外选项阻止特定的 IP。将 CIDR 字段留空允许所有外部来源的所有入站流量。
    2. 您可以将所有入站流量限制为端口。如果您不添加任何端口,则流量可以访问所有端口。
  11. 在您的网络策略中添加出口规则:

    1. 选择 Add egress rule 来配置新规则。此操作会创建一个带有 Add allowed destination"* 下拉菜单的新 Egress 规则 行,它允许您指定如何限制出站流量。下拉菜单提供三个选项来限制您的出口流量:

      • Allow pods from the same namespace 将出站流量限制为同一命名空间中的 pod。您可以在命名空间中指定 pod,但将此选项留空允许来自该命名空间中的所有 pod 的流量。
      • Allow pods from inside the cluster 将流量限制到与策略相同的集群中的 pod。您可以指定要允许出站流量的命名空间和 pod。将这个选项留空允许来自此集群中所有命名空间和 pod 的出站流量。
      • Allow peers by IP block 限制指定 CIDR IP 块的流量。您可以使用例外选项阻止特定的 IP。将 CIDR 字段留空允许所有外部来源的出站流量。
    2. 您可以将所有出站流量限制为端口。如果您不添加任何端口,则流量可以访问所有端口。

2.3. 查看网络策略

作为集群管理员,您可以查看命名空间的网络策略。

2.3.1. 示例 NetworkPolicy 对象

下文解释了示例 NetworkPolicy 对象:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-27107 
1

spec:
  podSelector: 
2

    matchLabels:
      app: mongodb
  ingress:
  - from:
    - podSelector: 
3

        matchLabels:
          app: app
    ports: 
4

    - protocol: TCP
      port: 27017
Copy to Clipboard Toggle word wrap
1
NetworkPolicy 对象的名称。
2
描述策略应用到的 pod 的选择器。策略对象只能选择定义 NetworkPolicy 对象的项目中的 pod。
3
与策略对象允许从中入口流量的 pod 匹配的选择器。选择器与 NetworkPolicy 在同一命名空间中的 pod 匹配。
4
接受流量的一个或多个目标端口的列表。

2.3.2. 使用 CLI 查看网络策略

您可以检查命名空间中的网络策略。

注意

如果使用具有 cluster-admin 角色的用户登录,您可以查看集群中的任何网络策略。

前提条件

  • 已安装 OpenShift CLI(oc)。
  • 您可以使用具有 admin 权限的用户登陆到集群。
  • 您在网络策略所在的命名空间中。

流程

  • 列出命名空间中的网络策略:

    • 要查看命名空间中定义的网络策略对象,请输入以下命令:

      $ oc get networkpolicy
      Copy to Clipboard Toggle word wrap
    • 可选: 要检查特定的网络策略,请输入以下命令:

      $ oc describe networkpolicy <policy_name> -n <namespace>
      Copy to Clipboard Toggle word wrap

      其中:

      <policy_name>
      指定要检查的网络策略的名称。
      <namespace>
      可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。

      例如:

      $ oc describe networkpolicy allow-same-namespace
      Copy to Clipboard Toggle word wrap

      oc describe 命令的输出

      Name:         allow-same-namespace
      Namespace:    ns1
      Created on:   2021-05-24 22:28:56 -0400 EDT
      Labels:       <none>
      Annotations:  <none>
      Spec:
        PodSelector:     <none> (Allowing the specific traffic to all pods in this namespace)
        Allowing ingress traffic:
          To Port: <any> (traffic allowed to all ports)
          From:
            PodSelector: <none>
        Not affecting egress traffic
        Policy Types: Ingress
      Copy to Clipboard Toggle word wrap

注意

如果您使用 cluster-admin 权限登录到 web 控制台,您可以选择在集群中的任何命名空间中以 YAML 或 web 控制台的形式查看网络策略。

2.3.3. 使用 OpenShift Cluster Manager 查看网络策略

您可以在 Red Hat OpenShift Cluster Manager 中查看网络策略的配置详情。

先决条件

  • 已登陆到 OpenShift Cluster Manager
  • 您创建了 OpenShift Dedicated 集群。
  • 已为集群配置身份提供程序。
  • 将您的用户帐户添加到配置的身份提供程序中。
  • 您创建了网络策略。

流程

  1. 从 OpenShift Cluster Manager Web 控制台的 Administrator 视角,在 Networking 下点 NetworkPolicies
  2. 选择要查看的网络策略。
  3. Network Policy 详情页面中,您可以查看所有相关入口和出口规则。
  4. 选择网络策略详情上的 YAML 以 YAML 格式查看策略配置。

    注意

    您只能查看这些策略的详情。您不能编辑这些策略。

2.4. 删除网络策略

作为集群管理员,您可以从命名空间中删除网络策略。

2.4.1. 使用 CLI 删除网络策略

您可以删除命名空间中的网络策略。

注意

如果使用具有 cluster-admin 角色的用户登录,您可以删除集群中的任何网络策略。

先决条件

  • 集群使用支持 NetworkPolicy 对象的网络插件,如带有设置了 mode: NetworkPolicy 的 OpenShift SDN 网络插件。
  • 已安装 OpenShift CLI(oc)。
  • 使用具有 admin 权限的用户登陆到集群。
  • 您在网络策略所在的命名空间中。

流程

  • 要删除网络策略对象,请输入以下命令。成功输出列出了策略对象的名称以及 已删除的 状态。

    $ oc delete networkpolicy <policy_name> -n <namespace>
    Copy to Clipboard Toggle word wrap

    其中:

    <policy_name>
    指定网络策略的名称。
    <namespace>
    可选参数。如果您在与当前命名空间不同的命名空间中定义了对象,则参数会特定于命名空间。

    成功输出列出了策略对象的名称以及 已删除的 状态。

注意

如果使用 cluster-admin 权限登录到 web 控制台,您可以选择在集群上以 YAML 或通过 Actions 菜单从 web 控制台中的策略删除网络策略。

2.4.2. 使用 OpenShift Cluster Manager 删除网络策略

您可以删除命名空间中的网络策略。

先决条件

  • 已登陆到 OpenShift Cluster Manager
  • 您创建了 OpenShift Dedicated 集群。
  • 已为集群配置身份提供程序。
  • 将您的用户帐户添加到配置的身份提供程序中。

流程

  1. 从 OpenShift Cluster Manager Web 控制台的 Administrator 视角,在 Networking 下点 NetworkPolicies
  2. 使用以下方法删除您的网络策略:

    • Network Policies 表中删除策略:

      1. Network Policies 表中,选择您要删除的网络策略行的堆栈菜单,然后点 Delete NetworkPolicy
    • 使用独立网络策略详情中的 Actions 下拉菜单删除策略:

      1. 点网络策略的 Actions 下拉菜单。
      2. 从菜单中选择 Delete NetworkPolicy

2.5. 使用网络策略配置多租户隔离

作为集群管理员,您可以配置网络策略以为多租户网络提供隔离功能。

注意

如本节所述配置网络策略,提供了与 OpenShift Dedicated 的早期版本中 OpenShift SDN 的多租户模式类似的网络隔离。

2.5.1. 使用网络策略配置多租户隔离

您可以配置项目,使其与其他项目命名空间中的 pod 和服务分离。

先决条件

  • 集群使用支持 NetworkPolicy 对象的网络插件,如带有设置了 mode: NetworkPolicy 的 OpenShift SDN 网络插件。
  • 已安装 OpenShift CLI(oc)。
  • 您可以使用具有 admin 权限的用户登陆到集群。

流程

  1. 创建以下 NetworkPolicy 对象:

    1. 名为 allow-from-openshift-ingress 的策略。

      $ cat << EOF| oc create -f -
      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: allow-from-openshift-ingress
      spec:
        ingress:
        - from:
          - namespaceSelector:
              matchLabels:
                policy-group.network.openshift.io/ingress: ""
        podSelector: {}
        policyTypes:
        - Ingress
      EOF
      Copy to Clipboard Toggle word wrap
      注意

      policy-group.network.openshift.io/ingress: "" 是 OVN-Kubernetes 的首选命名空间选择器标签。

    2. 名为 allow-from-openshift-monitoring 的策略:

      $ cat << EOF| oc create -f -
      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: allow-from-openshift-monitoring
      spec:
        ingress:
        - from:
          - namespaceSelector:
              matchLabels:
                network.openshift.io/policy-group: monitoring
        podSelector: {}
        policyTypes:
        - Ingress
      EOF
      Copy to Clipboard Toggle word wrap
    3. 名为 allow-same-namespace 的策略:

      $ cat << EOF| oc create -f -
      kind: NetworkPolicy
      apiVersion: networking.k8s.io/v1
      metadata:
        name: allow-same-namespace
      spec:
        podSelector:
        ingress:
        - from:
          - podSelector: {}
      EOF
      Copy to Clipboard Toggle word wrap
    4. 名为 allow-from-kube-apiserver-operator 的策略:

      $ cat << EOF| oc create -f -
      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: allow-from-kube-apiserver-operator
      spec:
        ingress:
        - from:
          - namespaceSelector:
              matchLabels:
                kubernetes.io/metadata.name: openshift-kube-apiserver-operator
            podSelector:
              matchLabels:
                app: kube-apiserver-operator
        policyTypes:
        - Ingress
      EOF
      Copy to Clipboard Toggle word wrap

      如需了解更多详细信息,请参阅 新的kube-apiserver-operator Webhook 控制器验证 Webhook 的健康状况

  2. 可选: 要确认当前项目中存在网络策略,请输入以下命令:

    $ oc describe networkpolicy
    Copy to Clipboard Toggle word wrap

    输出示例

    Name:         allow-from-openshift-ingress
    Namespace:    example1
    Created on:   2020-06-09 00:28:17 -0400 EDT
    Labels:       <none>
    Annotations:  <none>
    Spec:
      PodSelector:     <none> (Allowing the specific traffic to all pods in this namespace)
      Allowing ingress traffic:
        To Port: <any> (traffic allowed to all ports)
        From:
          NamespaceSelector: policy-group.network.openshift.io/ingress:
      Not affecting egress traffic
      Policy Types: Ingress
    
    
    Name:         allow-from-openshift-monitoring
    Namespace:    example1
    Created on:   2020-06-09 00:29:57 -0400 EDT
    Labels:       <none>
    Annotations:  <none>
    Spec:
      PodSelector:     <none> (Allowing the specific traffic to all pods in this namespace)
      Allowing ingress traffic:
        To Port: <any> (traffic allowed to all ports)
        From:
          NamespaceSelector: network.openshift.io/policy-group: monitoring
      Not affecting egress traffic
      Policy Types: Ingress
    Copy to Clipboard Toggle word wrap

第 3 章 OpenShift Dedicated 集群的网络验证

当您将 OpenShift Dedicated 集群部署到现有的 Virtual Private Cloud (VPC) 或创建带有集群新子网的额外机器池时,网络验证检查会自动运行。检查会验证您的网络配置并突出显示错误,允许您在集群部署前解决配置问题。

您还可以手动运行网络验证检查以验证现有集群的配置。

3.1. 了解 OpenShift Dedicated 集群的网络验证

当您将 OpenShift Dedicated 集群部署到现有的 Virtual Private Cloud (VPC) 中,或使用集群的新子网创建额外的机器池时,网络验证会自动运行。这有助于您在集群部署前识别并解决配置问题。

当使用 Red Hat OpenShift Cluster Manager 准备安装集群时,会在 Virtual Private Cloud (VPC)子网设置页面中将子网输入到子网 ID 字段中运行自动检查。

当您添加一个机器池,它带有对于集群来说是新的子网时,自动网络验证会检查子网,以确保在置备机器池前可以使用网络连接。

自动网络验证完成后,会将记录发送到服务日志。记录提供验证检查的结果,包括任何网络配置错误。您可以在部署前解决发现的问题,从而使部署成功的机会更大。

您还可以为现有集群手动运行网络验证。这可让您在配置更改后验证集群的网络配置。有关手动运行网络验证检查的步骤,请参阅手动运行网络验证

3.2. 网络验证检查的范围

网络验证包括以下每个要求:

  • 存在父虚拟私有云 (VPC)。
  • 所有指定子网都属于 VPC。
  • VPC 已启用了 enableDnsSupport
  • VPC 已启用了 enableDnsHostnames
  • egress 可用于 AWS 防火墙先决条件 部分中指定的所需域和端口组合。

3.3. 绕过自动网络验证

如果要将带有已知网络配置问题的 OpenShift Dedicated 集群部署到现有的 Virtual Private Cloud (VPC) 中,可以绕过自动网络验证。

如果您在创建集群时绕过网络验证,集群的支持状态是有限的。安装后,您可以解决这个问题,然后手动运行网络验证。在验证成功后,有限的支持状态会被删除。

当使用 Red Hat OpenShift Cluster Manager 将集群安装到现有的 VPC 时,您可以通过在 Virtual Private Cloud (VPC) 子网设置页面中选择 Bypass network verification 来绕过自动验证。

3.4. 手动运行网络验证

您可以使用 Red Hat OpenShift Cluster Manager 手动对现有 OpenShift Dedicated 集群运行网络验证检查。

先决条件

  • 您有一个现有的 OpenShift Dedicated 集群。
  • 您是集群所有者,或具有集群编辑器角色。

流程

  1. 进入到 OpenShift Cluster Manager 并选择您的集群。
  2. Actions 下拉菜单中选择 Verify networking

Legal Notice

Copyright © 2025 Red Hat

OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).

Modified versions must remove all Red Hat trademarks.

Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.

Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.

Linux® is the registered trademark of Linus Torvalds in the United States and other countries.

Java® is a registered trademark of Oracle and/or its affiliates.

XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.

MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.

Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.

The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.

All other trademarks are the property of their respective owners.

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat