6.6. 使用 NetworkPolicy 配置多租户隔离

您可以配置项目,使其与其他项目中的 Pod 和服务分离。

先决条件

  • 使用 OpenShift SDN 网络插件的集群,并设置了 mode: NetworkPolicy。此模式是 OpenShift SDN 的默认模式。
  • 安装 OpenShift 命令行界面 (CLI),通常称为 oc
  • 您必须登录集群。

流程

  1. 创建包含 NetworkPolicy 对象定义的以下文件:

    1. 名为 allow-from-openshift-ingress.yaml 的文件,包含以下内容:

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: allow-from-openshift-ingress
      spec:
        ingress:
        - from:
          - namespaceSelector:
              matchLabels:
                network.openshift.io/policy-group: ingress
        podSelector: {}
        policyTypes:
        - Ingress
    2. 名为 allow-from-openshift-monitoring.yaml 的文件,包含以下内容:

      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
  2. 对于每个策略文件,运行以下命令来创建 NetworkPolicy 对象:

    $ oc apply -f <policy-name>.yaml \ 1
      -n <project> 2
    1
    <policy-name> 替换为包含该策略的文件的文件名。
    2
    <project> 替换为将 NetworkPolicy 对象应用到的项目的名称。
  3. 如果 default Ingress Controller 配置设置了 spec.endpointPublishingStrategy: HostNetwork 值,您需要为 default OpenShift Container Platform 命名空间添加一个标记来允许 Ingress Controller 和项目间的网络流量:

    1. 确定您的 default Ingress Controller 是否使用了 HostNetwork 端点发布策略:

      $ oc get --namespace openshift-ingress-operator ingresscontrollers/default \
        --output jsonpath='{.status.endpointPublishingStrategy.type}'
    2. 如果上个命令报告了端点发布策略为 HostNetwork,在 default 命名空间中设置一个标记:

      $ oc label namespace default 'network.openshift.io/policy-group=ingress'
  4. 可选:运行以下命令确认当前项目中存在 NetworkPolicy 对象:

    $ oc get networkpolicy <policy-name> -o yaml

    在以下示例中会显示 allow-from-openshift-ingress NetworkPolicy 对象:

    $ oc get networkpolicy allow-from-openshift-ingress -o yaml
    
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-from-openshift-ingress
      namespace: project1
    spec:
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              network.openshift.io/policy-group: ingress
      podSelector: {}
      policyTypes:
      - Ingress