拒绝来自特定名称空间的流量的网络策略
Network policy to deny traffic from a particular namespace
假设我有 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(pods 的标签来做到这一点,但不能只使用整个名称空间)。
如果您能添加代码片段会更容易。但是,找出问题所在并不难。
我想这可能是您的网络政策的问题。您的 pods 可能需要万维网连接,因此您无法通过 egress
规则阻止从测试到生产的通信,因为您可能正在添加 0.0.0.0/0
让您的 pods 在任何env 与外部世界通信以下载外部库或与您的应用程序相关的任何东西。
因此,添加 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
...这将阻止命名空间 test
中带有标签 ns=test
的任何 pod 与 matchlabels
下列出的命名空间中除 pods 之外的任何人通信。
你也可以反其道而行之;在命名空间 prod
中创建一个 NetworkPolicy
并切断带有标签 ns=prod
的 pods 的入口流量。同样的结果。
注意:您需要 NetworkPolicy
控制器,因为它不在 kubernetes 的二进制文件中。
假设我有 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(pods 的标签来做到这一点,但不能只使用整个名称空间)。
如果您能添加代码片段会更容易。但是,找出问题所在并不难。
我想这可能是您的网络政策的问题。您的 pods 可能需要万维网连接,因此您无法通过 egress
规则阻止从测试到生产的通信,因为您可能正在添加 0.0.0.0/0
让您的 pods 在任何env 与外部世界通信以下载外部库或与您的应用程序相关的任何东西。
因此,添加 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
...这将阻止命名空间 test
中带有标签 ns=test
的任何 pod 与 matchlabels
下列出的命名空间中除 pods 之外的任何人通信。
你也可以反其道而行之;在命名空间 prod
中创建一个 NetworkPolicy
并切断带有标签 ns=prod
的 pods 的入口流量。同样的结果。
注意:您需要 NetworkPolicy
控制器,因为它不在 kubernetes 的二进制文件中。