【问题标题】:Network policy to deny traffic from a particular namespace拒绝来自特定命名空间的流量的网络策略
【发布时间】:2020-04-27 07:40:33
【问题描述】:

假设我有 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(pod 标签,但不只使用整个命名空间)来做到这一点。

【问题讨论】:

  • 是的@Jonas。正如我所说的 podSelector 正在为我工​​作。可以分享一下sn-p吗?
  • 你用的是什么CNI?
  • 我正在使用 Wea​​ve。

标签: kubernetes namespaces kubernetes-pod kubernetes-networkpolicy


【解决方案1】:

如果您可以添加代码 sn-p 会更容易。但是,找出问题所在并不难。

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

因此,添加egress 规则来阻止通信到任何环境有点困难。但相反,您可以将igress 规则添加到prod ns,以不允许来自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 上参考这些示例食谱。

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

希望这有帮助。

【讨论】:

  • 您的解决方案将只允许来自 prod 命名空间的入口,但我想允许来自除 test 之外的所有其他命名空间的流量。
  • 更新了答案,只是你需要添加任何你想允许流量来自的命名空间。
  • 这个解决方案有一个问题,假设我有很多ns。所以,当你有多个 ns 时,没有办法只拒绝一个命名空间。我必须指定他们每个人。
【解决方案2】:

你可以这样做:

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 下列出的命名空间中的 pod 之外的任何人交谈。

你也可以反过来做;在命名空间prod 中创建一个NetworkPolicy 并切断带有标签ns=prod 的Pod 的入口流量。结果一样。

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

【讨论】:

  • 这个解决方案有一个问题,假设我有很多ns。所以,当你有多个 ns 时,没有办法只拒绝一个命名空间。 @suren
  • 不。使用NetworkPolicies,您首先否认这一切(使用policyTypes),然后使用ingressegress 开始打开。可能你可以给他们所有相同的标签(例如allowed=true)并使用podSelector,而不是namespaceSelector
  • 我可以使用podSelector 做到这一点。我已经提到过这个问题。
猜你喜欢
  • 2021-01-20
  • 2019-09-25
  • 2021-03-25
  • 2021-02-09
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 2021-10-16
  • 2020-03-01
相关资源
最近更新 更多