【问题标题】:Kubernetes network policy to filter on both namespaces and pod's labelsKubernetes 网络策略过滤命名空间和 pod 的标签
【发布时间】:2021-02-16 19:31:47
【问题描述】:

是否可以同时按命名空间 pod的标签进行过滤?

https://kubernetes.io/docs/user-guide/networkpolicies/#the-networkpolicy-resource 文档中的示例

 - from:
 - namespaceSelector:
    matchLabels:
     project: myproject
 - podSelector:
    matchLabels:
     role: frontend

表示允许与role=frontend来自namespace myproject的pod进行通信。

有什么办法可以把“或”改成“和”吗?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    Kubernetes 1.11 及更高版本支持将 podSelector 和 namespaceSelector 与逻辑 AND 组合:

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: database.postgres
      namespace: database
    spec:
      podSelector:
        matchLabels:
          app: postgres
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              namespace: default
          podSelector:
            matchLabels:
              app: admin
      policyTypes:
      - Ingress
    

    在此处查看更多详细信息:https://medium.com/@reuvenharrison/an-introduction-to-kubernetes-network-policies-for-security-people-ba92dd4c809d/#f416

    【讨论】:

    • 唯一对我有帮助的解决方案!
    • 我正在使用 Calico CNI 在 1.16.4 上尝试此操作,但它似乎对我不起作用。它的行为类似于 OR,允许来自命名空间中的任何 pod 或具有其他命名空间中标签的任何 pod 的流量。 (完全一样,就好像我要输入两个 namespaceSelectorpodSelector。)我遇到错误了吗?我似乎也无法在 Kubernetes 文档中找到这种组合。
    • 1) Kubernetes 文档在这里:kubernetes.io/docs/concepts/services-networking/…。 2) 看来我创建了没有标签的命名空间,然后 Kubernetes 变得不稳定。
    【解决方案2】:

    编辑:这已在此处实现:https://github.com/kubernetes/kubernetes/pull/60452

    目前,还没有办法从另一个命名空间中选择某个 pod。 https://github.com/kubernetes/kubernetes/issues/50451

    有一个未解决的问题

    【讨论】:

    • 感谢您提供问题链接。
    • 这个问题现在已经解决了,查看我的答案示例:)。
    【解决方案3】:

    我认为您误解了选择器。在NetworkPolicyPeer 的 API 文档中,您会找到以下描述:

    命名空间选择器

    使用集群范围标签选择命名空间。这匹配此标签选择器选择的所有命名空间中的所有 pod。该字段遵循标准标签选择器语义。如果省略,则此选择器不选择命名空间。如果存在但为空,此选择器将选择所有命名空间。

    podSelector

    这是一个标签选择器,用于选择此命名空间中的 Pod。该字段遵循标准标签选择器语义。如果未提供,则此选择器不选择任何 pod。如果存在但为空,此选择器将选择此命名空间中的所有 pod。

    因此,两个选择器的组合并没有真正实现布尔运算,它们针对不同的范围(当前命名空间与所有其他命名空间)。

    因此,解决您的问题的唯一方法是使用命名空间相关标签标记每个 pod,您可以在 namespaceSelector 中选择该标签

    【讨论】:

    • 我不明白这是如何工作的。你介意再解释一遍吗?
    • 您的 pod 需要一个包含命名空间的标签 - 以便 podSelector 也可以匹配此标签
    • 但是你永远无法从不同的命名空间中选择一个 pod,对吧?
    • 不确定您的问题与什么有关...我的回答与最初的问题有关,即 Adam 试图在 NetworkPolicy 资源的上下文中混合两个选择器。
    • 我知道 Adam 在最初的问题中想要从不同的命名空间中选择一个特定的 pod,并且要使其工作,您需要 AND 选择器。但我认为这是不可能的。对不起,如果我错了。
    【解决方案4】:

    此语句无效:

    - from:
    - namespaceSelector:
       matchLabels:
        project: myproject
    - podSelector:
      matchLabels:
        role: frontend
    

    如果您选择命名空间选择器并将特定的 pod 连接到您的 pod,那么会发生什么,将无法正常工作。因为仅仅指定了命名空间,你就打开了整个命名空间来连接你的 pod。放podSelector是没用的。另一种方法是使用ipBlock,但同样不建议在大型集群中使用,因为 IP 可能会更改。

    GitHub 上有一个更新来解决这个问题。

    【讨论】:

      猜你喜欢
      • 2021-01-17
      • 2020-12-10
      • 2021-04-10
      • 2020-06-16
      • 2021-07-16
      • 2021-07-15
      • 2022-11-14
      • 2021-03-25
      • 1970-01-01
      相关资源
      最近更新 更多