×

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
1 NetworkPolicy对象的名称。
2 描述策略应用于哪些Pod的选择器。策略对象只能选择定义NetworkPolicy对象的项目中的Pod。
3 与策略对象允许入站流量的Pod匹配的选择器。选择器与NetworkPolicy相同命名空间中的Pod匹配。
4 要接受流量的一个或多个目标端口的列表。

使用CLI创建网络策略

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

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

前提条件
  • 您的集群使用支持`NetworkPolicy`对象的网络插件,例如OVN-Kubernetes网络插件,并设置了`mode: NetworkPolicy`。

  • 您已安装OpenShift CLI ( `oc` )。

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

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

步骤
  1. 创建策略规则

    1. 创建一个`.yaml`文件

      $ touch <policy_name>.yaml

      其中

      <policy_name>

      指定网络策略文件名。

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

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

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

      kind: NetworkPolicy
      apiVersion: networking.k8s.io/v1
      metadata:
        name: deny-by-default
      spec:
        podSelector: {}
        policyTypes:
        - Ingress
        ingress: []
      允许来自同一命名空间中所有Pod的入站流量
      kind: NetworkPolicy
      apiVersion: networking.k8s.io/v1
      metadata:
        name: allow-same-namespace
      spec:
        podSelector:
        ingress:
        - from:
          - podSelector: {}
      允许来自特定命名空间的入站流量到一个Pod

      此策略允许流量从`namespace-y`中运行的Pod到标记为`pod-a`的Pod。

      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
  2. 要创建网络策略对象,请输入以下命令

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

    其中

    <policy_name>

    指定网络策略文件名。

    <namespace>

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

    示例输出
    networkpolicy.networking.k8s.io/deny-by-default created

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

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

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

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

前提条件
  • 您的集群使用支持`NetworkPolicy`对象的网络插件,例如OVN-Kubernetes网络插件,并设置了`mode: NetworkPolicy`。

  • 您已安装OpenShift CLI ( `oc` )。

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

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

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

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: deny-by-default
      namespace: default (1)
    spec:
      podSelector: {} (2)
      ingress: [] (3)
    1 `namespace: default` 将此策略部署到`default`命名空间。
    2 `podSelector:` 为空,这意味着它匹配所有Pod。因此,该策略适用于default命名空间中的所有Pod。
    3 没有指定`ingress`规则。这会导致所有Pod的传入流量被丢弃。
  2. 通过输入以下命令应用策略

    $ oc apply -f deny-by-default.yaml
    示例输出
    networkpolicy.networking.k8s.io/deny-by-default created

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

有了`拒绝所有`策略后,您可以继续配置允许外部客户端访问带有标签`app=web`的Pod的策略。

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

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

前提条件
  • 您的集群使用支持`NetworkPolicy`对象的网络插件,例如OVN-Kubernetes网络插件,并设置了`mode: NetworkPolicy`。

  • 您已安装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:
        - {}
  2. 通过输入以下命令应用策略

    $ oc apply -f web-allow-external.yaml
    示例输出
    networkpolicy.networking.k8s.io/web-allow-external created

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

Allow traffic from external clients

创建允许所有命名空间中的应用程序访问的网络策略

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

请按照此步骤配置允许所有命名空间中所有 Pod 访问特定应用程序的策略。

前提条件
  • 您的集群使用支持`NetworkPolicy`对象的网络插件,例如OVN-Kubernetes网络插件,并设置了`mode: NetworkPolicy`。

  • 您已安装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)
    1 仅将策略应用于默认命名空间中的app:web Pod。
    2 选择所有命名空间中的所有 Pod。

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

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

    $ oc apply -f web-allow-all-namespaces.yaml
    示例输出
    networkpolicy.networking.k8s.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="http://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` )。

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

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

步骤
  1. 创建一个策略,允许来自带有标签purpose=production的特定命名空间中的所有 Pod 的流量。将 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)
    1 仅将策略应用于默认命名空间中的app:web Pod。
    2 将流量限制为仅限于具有标签purpose=production的命名空间中的 Pod。
  2. 通过输入以下命令应用策略

    $ oc apply -f web-allow-prod.yaml
    示例输出
    networkpolicy.networking.k8s.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="http://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>

使用 OpenShift 集群管理器创建网络策略

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

前提条件
  • 您已登录到OpenShift 集群管理器

  • 您已创建 OpenShift Dedicated 集群。

  • 您已为集群配置了身份提供程序。

  • 您已将您的用户帐户添加到已配置的身份提供程序。

  • 您已在 OpenShift Dedicated 集群中创建了一个项目。

步骤
  1. OpenShift 集群管理器中,点击您要访问的集群。

  2. 点击打开控制台以导航到 OpenShift Web 控制台。

  3. 点击您的身份提供程序并提供您的凭据以登录到集群。

  4. 从管理员角度,在网络下,点击网络策略

  5. 点击创建网络策略

  6. 策略名称字段中提供策略的名称。

  7. 可选:如果此策略仅适用于一个或多个特定 Pod,则可以为特定 Pod 提供标签和选择器。如果您没有选择特定 Pod,则此策略将适用于集群上的所有 Pod。

  8. 可选:您可以使用拒绝所有入站流量拒绝所有出站流量复选框阻止所有入站和出站流量。

  9. 您还可以添加任何组合的入站和出站规则,允许您指定要批准的端口、命名空间或 IP 块。

  10. 向您的策略添加入站规则

    1. 选择添加入站规则以配置新规则。此操作将创建一个新的入站规则行,其中包含一个添加允许的来源下拉菜单,使您可以指定要如何限制入站流量。下拉菜单提供三个选项来限制您的入站流量

      • 允许来自同一命名空间的 Pod将流量限制为同一命名空间内的 Pod。您可以指定命名空间中的 Pod,但将此选项留空允许来自命名空间中所有 Pod 的所有流量。

      • 允许来自集群内部的 Pod将流量限制为与策略位于同一集群内的 Pod。您可以指定要允许其入站流量的命名空间和 Pod。将此选项留空允许来自此集群内所有命名空间和 Pod 的入站流量。

      • 允许通过 IP 块进行对等将流量限制为指定的无类别域间路由 (CIDR) IP 块。您可以使用例外选项阻止某些 IP。将 CIDR 字段留空允许来自所有外部来源的所有入站流量。

    2. 您可以将所有入站流量限制到一个端口。如果您不添加任何端口,则所有端口都可访问流量。

  11. 向您的网络策略添加出站规则

    1. 选择添加出站规则以配置新规则。此操作将创建一个新的出站规则行,其中包含一个添加允许的目标"* 下拉菜单,使您可以指定要如何限制出站流量。下拉菜单提供三个选项来限制您的出站流量

      • 允许来自同一命名空间的 Pod将出站流量限制为同一命名空间内的 Pod。您可以指定命名空间中的 Pod,但将此选项留空允许来自命名空间中所有 Pod 的所有流量。

      • 允许来自集群内部的 Pod将流量限制为与策略位于同一集群内的 Pod。您可以指定要允许其出站流量的命名空间和 Pod。将此选项留空允许来自此集群内所有命名空间和 Pod 的出站流量。

      • 允许通过 IP 块进行对等将流量限制为指定的 CIDR IP 块。您可以使用例外选项阻止某些 IP。将 CIDR 字段留空允许来自所有外部来源的所有出站流量。

    2. 您可以将所有出站流量限制到一个端口。如果您不添加任何端口,则所有端口都可访问流量。