×

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 要在其上接受流量的一个或多个目标端口的列表。

使用命令行创建网络策略

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

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

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

  • 您已安装 OpenShift 命令行界面 ( `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 到一个 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 命令行界面 ( `oc` )。

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

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

步骤
  1. 创建以下 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。因此,此策略适用于默认命名空间中的所有 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 命令行界面 ( `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 命令行界面 ( `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="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 命令行界面 ( `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="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>