因此,假设我有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的标签,但不能仅使用整个命名空间)来做到这一点。
答案 0 :(得分:2)
如果您可以添加代码段,将会更容易。但是,找出问题所在并不难。
我在想类似的问题可能是您的网络政策存在问题。您的Pod可能需要建立万维网连接,因此您无法通过egress
规则停止从测试到产品的通信,因为您可能要添加0.0.0.0/0
以便让任何环境中的Pod都可以与外界通信以进行下载外部库或与您的应用程序关联的任何东西。
由于这个原因,添加egress
规则来停止对任何环境的通信有点困难。但是相反,您可以在产品中添加igress
规则,以禁止来自test
或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上参考这些示例食谱。
根据评论进行编辑 在入口规则中添加了其他名称空间,以允许来自除测试以外的其他名称空间的流量。
希望这会有所帮助。
答案 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的二进制文件中不是。