假设我有 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 的标签,但不能只使用整个命名空间(来做到这一点。
如果可以添加代码片段,那会更容易。但是,找出出了什么问题并不难。
我认为这样的事情可能是您的网络策略的问题。您的 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 上的这些示例食谱。
根据注释进行编辑将其他命名空间添加到入口规则以允许来自除测试之外的其他命名空间的流量。
希望这是有帮助的。
你可以这样做:
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
与除matchlabels
下列出的命名空间中的 pod 之外的任何人交谈。
你也可以反过来做;在命名空间prod
创建一个NetworkPolicy
,并使用标签ns=prod
切断 pod 的入口流量。相同的结果。
注意:你需要NetworkPolicy
控制器,因为它在 kubernetes 的二进制文件中没有。