×

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. 创建一个<policy_name>.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. 创建以下定义`拒绝所有`策略以拒绝所有命名空间中所有Pod的入口流量的YAML。将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 仅将策略应用于default命名空间中的`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 仅将策略应用于default命名空间中的`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 集群管理器

  • 您已在 AWS 上创建了一个 Red Hat OpenShift 服务集群。

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

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

  • 您已在 AWS 上的 Red Hat OpenShift 服务集群中创建了一个项目。

步骤
  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. 您可以将所有出站流量限制到一个端口。如果您不添加任何端口,则所有端口都可访问流量。