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

时间:2020-01-09 16:32:49

标签: kubernetes namespaces kubernetes-pod kubernetes-networkpolicy

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

2 个答案:

答案 0 :(得分:2)

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

我在想类似的问题可能是您的网络政策存在问题。您的Pod可能需要建立万维网连接,因此您无法通过egress规则停止从测试到产品的通信,因为您可能要添加0.0.0.0/0以便让任何环境中的Pod都可以与外界通信以进行下载外部库或与您的应用程序关联的任何东西。

由于这个原因,添加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上参考这些示例食谱。

根据评论进行编辑 在入口规则中添加了其他名称空间,以允许来自除测试以外的其他名称空间的流量。

希望这会有所帮助。

答案 1 :(得分: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

...这将阻止名称空间test中带有标签ns=test的任何Pod与matchlabels中列出的命名空间中的Pod之外的任何人进行对话。

您也可以采取其他方法;在命名空间NetworkPolicy中创建prod,并切断标签为ns=prod的Pod的入口流量。结果相同。

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