×

管理员可以使用MultiNetworkPolicy API创建多个网络策略,以管理连接到辅助网络的Pod的流量。例如,您可以创建根据特定端口、IP/范围或标签允许或拒绝流量的策略。

多网络策略可用于管理集群中辅助网络上的流量。它们无法管理集群的默认网络或用户定义网络的主网络。

作为集群管理员,您可以为以下任何网络类型配置多网络策略

  • 单根I/O虚拟化 (SR-IOV)

  • MAC虚拟局域网 (MacVLAN)

  • IP虚拟局域网 (IPVLAN)

  • 基于SR-IOV的Bond容器网络接口 (CNI)

  • OVN-Kubernetes附加网络

仅支持使用内核网络接口控制器 (NIC) 配置SR-IOV附加网络的多网络策略。SR-IOV不支持数据平面开发工具包 (DPDK) 应用程序。

多网络策略和网络策略之间的区别

虽然MultiNetworkPolicy API实现了NetworkPolicy API,但有一些重要的区别

  • 您必须使用MultiNetworkPolicy API

    apiVersion: k8s.cni.cncf.io/v1beta1
    kind: MultiNetworkPolicy
  • 使用CLI与多网络策略交互时,必须使用multi-networkpolicy资源名称。例如,您可以使用oc get multi-networkpolicy <name>命令查看多网络策略对象,其中<name>是多网络策略的名称。

  • 您必须使用定义macvlan或SR-IOV附加网络的网络附件定义的名称指定注释

    apiVersion: k8s.cni.cncf.io/v1beta1
    kind: MultiNetworkPolicy
    metadata:
      annotations:
        k8s.v1.cni.cncf.io/policy-for: <network_name>

    其中

    <network_name>

    指定网络附件定义的名称。

为集群启用多网络策略

作为集群管理员,您可以启用集群上的多网络策略支持。

先决条件
  • 安装OpenShift CLI (oc)。

  • 使用具有cluster-admin权限的用户登录到集群。

步骤
  1. 使用以下YAML创建multinetwork-enable-patch.yaml文件

    apiVersion: operator.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      useMultiNetworkPolicy: true
  2. 配置集群以启用多网络策略

    $ oc patch network.operator.openshift.io cluster --type=merge --patch-file=multinetwork-enable-patch.yaml
    示例输出
    network.operator.openshift.io/cluster patched

在IPv6网络中支持多网络策略

ICMPv6邻居发现协议 (NDP) 是一组消息和流程,使设备能够发现并维护有关相邻节点的信息。NDP在IPv6网络中起着至关重要的作用,它促进了同一链路上的设备之间的交互。

useMultiNetworkPolicy参数设置为true时,集群网络操作符 (CNO) 部署多网络策略的iptables实现。

为了在IPv6网络中支持多网络策略,集群网络操作符会在受多网络策略影响的每个Pod中部署以下规则集

多网络策略自定义规则
kind: ConfigMap
apiVersion: v1
metadata:
  name: multi-networkpolicy-custom-rules
  namespace: openshift-multus
data:

  custom-v6-rules.txt: |
    # accept NDP
    -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT (1)
    -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT (2)
    # accept RA/RS
    -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT (3)
    -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT (4)
1 此规则允许传入ICMPv6邻居请求消息,这些消息是邻居发现协议 (NDP) 的一部分。这些消息有助于确定相邻节点的链路层地址。
2 此规则允许传入ICMPv6邻居通告消息,这些消息是NDP的一部分,并提供有关发送者链路层地址的信息。
3 此规则允许传入的ICMPv6路由器请求报文。主机使用这些报文请求路由器配置信息。
4 此规则允许传入的ICMPv6路由器广告报文,这些报文向主机提供配置信息。

您无法编辑这些预定义规则。

这些规则共同启用IPv6环境中正确的网络功能所需的ICMPv6流量,包括地址解析和路由器通信。在这些规则到位且多网络策略拒绝流量的情况下,应用程序预计不会遇到连接问题。

使用多网络策略

作为集群管理员,您可以创建、编辑、查看和删除多网络策略。

先决条件

  • 您已为您的集群启用多网络策略支持。

使用CLI创建多网络策略

要定义描述允许集群中命名空间的入站或出站网络流量的粒度规则,您可以创建多网络策略。

先决条件
  • 您的集群使用支持NetworkPolicy对象的网络插件,例如OVN-Kubernetes网络插件,且mode: NetworkPolicy已设置。

  • 您已安装OpenShift CLI (oc)。

  • 您已使用具有cluster-admin权限的用户登录到集群。

  • 您正在多网络策略适用的命名空间中工作。

步骤
  1. 创建策略规则

    1. 创建<policy_name>.yaml文件

      $ touch <policy_name>.yaml

      其中

      <policy_name>

      指定多网络策略文件名。

    2. 在您刚刚创建的文件中定义多网络策略,例如以下示例

      拒绝来自所有命名空间中所有Pod的入站流量

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

      apiVersion: k8s.cni.cncf.io/v1beta1
      kind: MultiNetworkPolicy
      metadata:
        name: deny-by-default
        annotations:
          k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name>
      spec:
        podSelector: {}
        policyTypes:
        - Ingress
        ingress: []

      其中

      <network_name>

      指定网络附件定义的名称。

      允许来自同一命名空间中所有Pod的入站流量
      apiVersion: k8s.cni.cncf.io/v1beta1
      kind: MultiNetworkPolicy
      metadata:
        name: allow-same-namespace
        annotations:
          k8s.v1.cni.cncf.io/policy-for: <network_name>
      spec:
        podSelector:
        ingress:
        - from:
          - podSelector: {}

      其中

      <network_name>

      指定网络附件定义的名称。

      允许来自特定命名空间的特定Pod的入站流量

      此策略允许来自namespace-y中运行的Pod的流量进入标有pod-a的Pod。

      apiVersion: k8s.cni.cncf.io/v1beta1
      kind: MultiNetworkPolicy
      metadata:
        name: allow-traffic-pod
        annotations:
          k8s.v1.cni.cncf.io/policy-for: <network_name>
      spec:
        podSelector:
         matchLabels:
            pod: pod-a
        policyTypes:
        - Ingress
        ingress:
        - from:
          - namespaceSelector:
              matchLabels:
                 kubernetes.io/metadata.name: namespace-y

      其中

      <network_name>

      指定网络附件定义的名称。

      限制对服务的流量

      应用此策略后,确保所有同时具有标签app=bookstorerole=api的Pod只能被具有标签app=bookstore的Pod访问。在这个例子中,应用程序可以是一个REST API服务器,标记为app=bookstorerole=api

      此示例解决了以下用例

      • 将对服务的流量限制为只需要使用它的其他微服务。

      • 限制对数据库的连接,只允许使用它的应用程序。

        apiVersion: k8s.cni.cncf.io/v1beta1
        kind: MultiNetworkPolicy
        metadata:
          name: api-allow
          annotations:
            k8s.v1.cni.cncf.io/policy-for: <network_name>
        spec:
          podSelector:
            matchLabels:
              app: bookstore
              role: api
          ingress:
          - from:
              - podSelector:
                  matchLabels:
                    app: bookstore

        其中

        <network_name>

        指定网络附件定义的名称。

  2. 要创建多网络策略对象,请输入以下命令

    $ oc apply -f <policy_name>.yaml -n <namespace>

    其中

    <policy_name>

    指定多网络策略文件名。

    <namespace>

    可选:如果对象在与当前命名空间不同的命名空间中定义,则指定命名空间。

    示例输出
    multinetworkpolicy.k8s.cni.cncf.io/deny-by-default created

如果您使用具有cluster-admin权限的用户登录到Web控制台,您可以选择直接在YAML中或从Web控制台的表单中在集群的任何命名空间中创建网络策略。

编辑多网络策略

您可以在命名空间中编辑多网络策略。

先决条件
  • 您的集群使用支持NetworkPolicy对象的网络插件,例如OVN-Kubernetes网络插件,且mode: NetworkPolicy已设置。

  • 您已安装OpenShift CLI (oc)。

  • 您已使用具有cluster-admin权限的用户登录到集群。

  • 您正在多网络策略存在的命名空间中工作。

步骤
  1. 可选:要列出命名空间中的多网络策略对象,请输入以下命令

    $ oc get multi-networkpolicy

    其中

    <namespace>

    可选:如果对象在与当前命名空间不同的命名空间中定义,则指定命名空间。

  2. 编辑多网络策略对象。

    • 如果您将多网络策略定义保存到文件中,请编辑该文件并进行必要的更改,然后输入以下命令。

      $ oc apply -n <namespace> -f <policy_file>.yaml

      其中

      <namespace>

      可选:如果对象在与当前命名空间不同的命名空间中定义,则指定命名空间。

      <policy_file>

      指定包含网络策略的文件名。

    • 如果您需要直接更新多网络策略对象,请输入以下命令

      $ oc edit multi-networkpolicy <policy_name> -n <namespace>

      其中

      <policy_name>

      指定网络策略的名称。

      <namespace>

      可选:如果对象在与当前命名空间不同的命名空间中定义,则指定命名空间。

  3. 确认多网络策略对象已更新。

    $ oc describe multi-networkpolicy <policy_name> -n <namespace>

    其中

    <policy_name>

    指定多网络策略的名称。

    <namespace>

    可选:如果对象在与当前命名空间不同的命名空间中定义,则指定命名空间。

如果您使用具有cluster-admin权限的用户登录到Web控制台,您可以选择直接在YAML中或通过Web控制台中的操作菜单从策略中在集群的任何命名空间中编辑网络策略。

使用CLI查看多网络策略

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

先决条件
  • 您已安装OpenShift CLI (oc)。

  • 您已使用具有cluster-admin权限的用户登录到集群。

  • 您正在多网络策略存在的命名空间中工作。

步骤
  • 列出命名空间中的多网络策略

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

      $ oc get multi-networkpolicy
    • 可选:要检查特定的多网络策略,请输入以下命令

      $ oc describe multi-networkpolicy <policy_name> -n <namespace>

      其中

      <policy_name>

      指定要检查的多网络策略的名称。

      <namespace>

      可选:如果对象在与当前命名空间不同的命名空间中定义,则指定命名空间。

如果您使用具有cluster-admin权限的用户登录到Web控制台,您可以选择直接在YAML中或从Web控制台的表单中在集群的任何命名空间中查看网络策略。

使用CLI删除多网络策略

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

先决条件
  • 您的集群使用支持NetworkPolicy对象的网络插件,例如OVN-Kubernetes网络插件,且mode: NetworkPolicy已设置。

  • 您已安装OpenShift CLI (oc)。

  • 您已使用具有cluster-admin权限的用户登录到集群。

  • 您正在多网络策略存在的命名空间中工作。

步骤
  • 要删除多网络策略对象,请输入以下命令

    $ oc delete multi-networkpolicy <policy_name> -n <namespace>

    其中

    <policy_name>

    指定多网络策略的名称。

    <namespace>

    可选:如果对象在与当前命名空间不同的命名空间中定义,则指定命名空间。

    示例输出
    multinetworkpolicy.k8s.cni.cncf.io/default-deny deleted

如果您使用具有cluster-admin权限的用户登录到Web控制台,您可以选择直接在YAML中或通过Web控制台中的操作菜单从策略中在集群的任何命名空间中删除网络策略。

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

这是一个基本策略,阻止所有跨Pod网络,除了已部署的其他网络策略配置允许的网络流量。此过程强制执行默认的拒绝所有策略。

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

先决条件
  • 您的集群使用支持NetworkPolicy对象的网络插件,例如OVN-Kubernetes网络插件,且mode: NetworkPolicy已设置。

  • 您已安装OpenShift CLI (oc)。

  • 您已使用具有cluster-admin权限的用户登录到集群。

  • 您正在多网络策略适用的命名空间中工作。

步骤
  1. 创建以下YAML,该YAML定义一个拒绝所有策略,以拒绝来自所有命名空间中所有Pod的入站流量。将YAML保存在deny-by-default.yaml文件中

    apiVersion: k8s.cni.cncf.io/v1beta1
    kind: MultiNetworkPolicy
    metadata:
      name: deny-by-default
      namespace: default (1)
      annotations:
        k8s.v1.cni.cncf.io/policy-for: <namespace_name>/<network_name> (2)
    spec:
      podSelector: {} (3)
      policyTypes: (4)
      - Ingress (5)
      ingress: [] (6)
    1 namespace: default将此策略部署到default命名空间。
    2 network_name:指定网络附件定义的名称。
    3 podSelector:为空,这意味着它匹配所有Pod。因此,该策略适用于default命名空间中的所有Pod。
    4 policyTypes: NetworkPolicy相关的规则类型列表。
    5 仅指定为Ingress policyType
    6 没有指定ingress规则。这会导致所有Pod的传入流量被丢弃。
  2. 通过输入以下命令来应用策略

    $ oc apply -f deny-by-default.yaml
    示例输出
    multinetworkpolicy.k8s.cni.cncf.io/deny-by-default created

创建允许来自外部客户端的流量的多网络策略

拒绝所有策略到位的情况下,您可以继续配置允许来自外部客户端到标有app=web的Pod的流量的策略。

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

按照此步骤配置允许来自公共互联网的外部服务直接或通过使用负载均衡器访问Pod的策略。流量仅允许到标有app=web的Pod。

先决条件
  • 您的集群使用支持NetworkPolicy对象的网络插件,例如OVN-Kubernetes网络插件,且mode: NetworkPolicy已设置。

  • 您已安装OpenShift CLI (oc)。

  • 您已使用具有cluster-admin权限的用户登录到集群。

  • 您正在多网络策略适用的命名空间中工作。

步骤
  1. 创建允许来自公共互联网的流量(直接或通过负载均衡器)访问Pod的策略。将YAML保存在web-allow-external.yaml文件中

    apiVersion: k8s.cni.cncf.io/v1beta1
    kind: MultiNetworkPolicy
    metadata:
      name: web-allow-external
      namespace: default
      annotations:
        k8s.v1.cni.cncf.io/policy-for: <network_name>
    spec:
      policyTypes:
      - Ingress
      podSelector:
        matchLabels:
          app: web
      ingress:
        - {}
  2. 通过输入以下命令来应用策略

    $ oc apply -f web-allow-external.yaml
    示例输出
    multinetworkpolicy.k8s.cni.cncf.io/web-allow-external created

    此策略允许来自所有资源的流量,包括下图所示的外部流量

Allow traffic from external clients

创建允许来自所有命名空间的应用程序的流量的多网络策略

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

按照此步骤配置策略,允许所有命名空间中所有 Pod 与特定应用程序之间的流量。

先决条件
  • 您的集群使用支持NetworkPolicy对象的网络插件,例如OVN-Kubernetes网络插件,且mode: NetworkPolicy已设置。

  • 您已安装OpenShift CLI (oc)。

  • 您已使用具有cluster-admin权限的用户登录到集群。

  • 您正在多网络策略适用的命名空间中工作。

步骤
  1. 创建一个策略,允许所有命名空间中所有 Pod 与特定应用程序之间的流量。将 YAML 保存到web-allow-all-namespaces.yaml文件中。

    apiVersion: k8s.cni.cncf.io/v1beta1
    kind: MultiNetworkPolicy
    metadata:
      name: web-allow-all-namespaces
      namespace: default
      annotations:
        k8s.v1.cni.cncf.io/policy-for: <network_name>
    spec:
      podSelector:
        matchLabels:
          app: web (1)
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector: {} (2)
    1 仅将策略应用于默认命名空间中的app:web Pod。
    2 选择所有命名空间中的所有 Pod。

    默认情况下,如果省略namespaceSelector,则不会选择任何命名空间,这意味着策略仅允许来自部署网络策略的命名空间的流量。

  2. 通过输入以下命令来应用策略

    $ oc apply -f web-allow-all-namespaces.yaml
    示例输出
    multinetworkpolicy.k8s.cni.cncf.io/web-allow-all-namespaces created
验证
  1. 通过输入以下命令,在default命名空间中启动一个 Web 服务

    $ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
  2. 运行以下命令,在secondary命名空间中部署一个alpine镜像并启动一个 shell

    $ oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- sh
  3. 在 shell 中运行以下命令,并观察请求是否被允许

    # wget -qO- --timeout=2 http://web.default
    预期输出
    <!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="https://nginx.ac.cn/">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>

创建允许来自命名空间的应用程序流量的多网络策略

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

按照此步骤配置策略,允许来自特定命名空间的具有标签app=web的 Pod 的流量。您可能希望这样做是为了:

  • 将生产数据库的流量限制到部署生产工作负载的命名空间。

  • 允许部署到特定命名空间的监控工具从当前命名空间抓取指标。

先决条件
  • 您的集群使用支持NetworkPolicy对象的网络插件,例如OVN-Kubernetes网络插件,且mode: NetworkPolicy已设置。

  • 您已安装OpenShift CLI (oc)。

  • 您已使用具有cluster-admin权限的用户登录到集群。

  • 您正在多网络策略适用的命名空间中工作。

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

    apiVersion: k8s.cni.cncf.io/v1beta1
    kind: MultiNetworkPolicy
    metadata:
      name: web-allow-prod
      namespace: default
      annotations:
        k8s.v1.cni.cncf.io/policy-for: <network_name>
    spec:
      podSelector:
        matchLabels:
          app: web (1)
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              purpose: production (2)
    1 仅将策略应用于默认命名空间中的app:web Pod。
    2 将流量限制到仅具有标签purpose=production的命名空间中的 Pod。
  2. 通过输入以下命令来应用策略

    $ oc apply -f web-allow-prod.yaml
    示例输出
    multinetworkpolicy.k8s.cni.cncf.io/web-allow-prod created
验证
  1. 通过输入以下命令,在default命名空间中启动一个 Web 服务

    $ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
  2. 运行以下命令创建prod命名空间

    $ oc create namespace prod
  3. 运行以下命令为prod命名空间添加标签

    $ oc label namespace/prod purpose=production
  4. 运行以下命令创建dev命名空间

    $ oc create namespace dev
  5. 运行以下命令为dev命名空间添加标签

    $ oc label namespace/dev purpose=testing
  6. 运行以下命令在dev命名空间中部署一个alpine镜像并启动一个 shell

    $ oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- sh
  7. 在 shell 中运行以下命令,并观察请求是否被阻止

    # wget -qO- --timeout=2 http://web.default
    预期输出
    wget: download timed out
  8. 运行以下命令在prod命名空间中部署一个alpine镜像并启动一个 shell

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

    # wget -qO- --timeout=2 http://web.default
    预期输出
    <!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="https://nginx.ac.cn/">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>