×

具有限制性网络策略的集群

如果您使用的是多个用户可以访问的集群,则您的集群可能会使用网络策略来控制哪些 Pod、服务和命名空间可以通过网络相互通信。如果您的集群使用限制性网络策略,则 Knative 系统 Pod 可能无法访问您的 Knative 应用程序。例如,如果您的命名空间具有以下网络策略(拒绝所有请求),则 Knative 系统 Pod 无法访问您的 Knative 应用程序。

拒绝对命名空间的所有请求的示例 NetworkPolicy 对象
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: deny-by-default
  namespace: example-namespace
spec:
  podSelector:
  ingress: []

在具有限制性网络策略的集群上启用与 Knative 应用程序的通信

要允许 Knative 系统 Pod 访问您的应用程序,您必须为每个 Knative 系统命名空间添加标签,然后在您的应用程序命名空间中创建一个NetworkPolicy对象,允许其他具有此标签的命名空间访问该命名空间。

拒绝对集群上非 Knative 服务的请求的网络策略仍然会阻止对这些服务的访问。但是,通过允许 Knative 系统命名空间访问您的 Knative 应用程序,您允许集群中所有命名空间访问您的 Knative 应用程序。

如果您不想允许集群中所有命名空间访问您的 Knative 应用程序,则可能需要改用*Knative 服务的 JSON Web 令牌身份验证*。Knative 服务的 JSON Web 令牌身份验证需要 Service Mesh。

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

  • 在您的集群上安装 OpenShift Serverless Operator 和 Knative Serving。

步骤
  1. knative.openshift.io/system-namespace=true标签添加到需要访问您的应用程序的每个 Knative 系统命名空间

    1. 标记knative-serving命名空间

      $ oc label namespace knative-serving knative.openshift.io/system-namespace=true
    2. 标记knative-serving-ingress命名空间

      $ oc label namespace knative-serving-ingress knative.openshift.io/system-namespace=true
    3. 标记knative-eventing命名空间

      $ oc label namespace knative-eventing knative.openshift.io/system-namespace=true
    4. 标记knative-kafka命名空间

      $ oc label namespace knative-kafka knative.openshift.io/system-namespace=true
  2. 在您的应用程序命名空间中创建一个NetworkPolicy对象,以允许来自具有knative.openshift.io/system-namespace标签的命名空间的访问

    示例NetworkPolicy对象
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: <network_policy_name> (1)
      namespace: <namespace> (2)
    spec:
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              knative.openshift.io/system-namespace: "true"
      podSelector: {}
      policyTypes:
      - Ingress
    1 为您的网络策略提供名称。
    2 您的应用程序所在的命名空间。