拒绝来自特定名称空间的流量的网络策略

Network policy to deny traffic from a particular namespace

假设我有 5 个名称空间 - prod、preprod、uat、dev 和 test。每个命名空间都有不同的标签 - ns=prod、ns=preprod、ns=uat、ns=dev 和 ns=test。

问题: 所以我想创建一个网络策略,我不想将流量(出口)从 ns=test 发送到标签为 ns=prod 的特定名称空间。但是 ns=test 应该能够出口到所有其他命名空间。

文档: https://kubernetes.io/docs/concepts/services-networking/network-policies/ https://kubernetes.io/docs/tasks/administer-cluster/declare-network-policy/

我尝试根据上述文档创建清单文件,但没有成功。我可以使用 podSelector(pods 的标签来做到这一点,但不能只使用整个名称空间)。

如果您能添加代码片段会更容易。但是,找出问题所在并不难。

我想这可能是您的网络政策的问题。您的 pods 可能需要万维网连接,因此您无法通过 egress 规则阻止从测试到生产的通信,因为您可能正在添加 0.0.0.0/0 让您的 pods 在任何env 与外部世界通信以下载外部库或与您的应用程序相关的任何东西。

因此,添加 egress 规则来停止与任何环境的通信有点困难。但相反,您可以将 igress 规则添加到产品中,以不允许来自 testdev 的通信。这样的事情可能会奏效,但同样,我们可以根据需要进行更改。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: prod-network-policy
  namespace: prod
spec:
  podSelector:
    matchLabels:
      ns: prod
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          ns: prod
          ns: dev
          ns: uat
    - podSelector:
        matchLabels:
          ns: prod
          ns: dev
          ns: uat
    - ipBlock:
        cidr: 10.0.1.101/32 #Assuming allow incoming request from ingress controller
  egress:
  - to: []

有多种方法可以实现这一目标。但是,我有时也会在 Github 上参考这些示例食谱。

根据评论编辑 将其他命名空间添加到入口规则以允许来自除测试之外的其他命名空间的流量。

希望对您有所帮助。

你可以这样做:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy-example
  namespace: test
spec:
  podSelector:
    matchLabels:
      ns: test
  policyTypes:
  - Egress
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          ns: preprod
          ns: uat
          ns: dev
          ns: test
    ports:
    - protocol: TCP
      port: 80

...这将阻止命名空间 test 中带有标签 ns=test 的任何 pod 与 matchlabels 下列出的命名空间中除 pods 之外的任何人通信。

你也可以反其道而行之;在命名空间 prod 中创建一个 NetworkPolicy 并切断带有标签 ns=prod 的 pods 的入口流量。同样的结果。

注意:您需要 NetworkPolicy 控制器,因为它不在 kubernetes 的二进制文件中。