0

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

4

2 回答 2

2

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

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

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

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上的这些示例食谱。

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

希望这会有所帮助。

于 2020-01-09T18:37:35.170 回答
1

你可以这样做:

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

...这将阻止命名空间中的任何 podtest和带有标签ns=test的任何人交谈,但 . 下列出的命名空间中的 pod 除外matchlabels

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

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

于 2020-01-10T09:09:30.263 回答