我已经在默认名称空间中创建了如下所示的网络策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: access-nginx
spec:
podSelector:
matchLabels:
run: nginx1
ingress:
- from:
- podSelector:
matchLabels:
run: "nginx2"
并且在默认名称空间中具有以下pod
master $ k get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx1 1/1 Running 0 30m run=nginx1
nginx2 1/1 Running 0 30m run=nginx2
nginx3 1/1 Running 0 30m run=nginx3
当我试图从不同的命名空间访问pod时,我仍然可以访问pod(nginx1(
master $ kubectl run busybox -n mynamespace --rm --labels=run=nginx2 -ti --image=busybox -- /bin/sh
/ # wget --spider --timeout=2 nginx1.default
Connecting to nginx1.default (10.107.249.117:80)
remote file exists
如何限制其他命名空间访问默认命名空间中的pod
这是预期的行为,因为您没有使用namespaceSelector
在命名空间级别限制流量
将标签key=value
添加到默认命名空间,并在ingress中使用namespaceSelector
以仅允许来自带有该标签的命名空间的流量。
key=value
只是一个例子,你可以有不同的标签。
kubectl label ns default key=value
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: access-nginx
spec:
podSelector:
matchLabels:
run: nginx1
ingress:
- from:
- namespaceSelector
matchLabels
key: value
- podSelector:
matchLabels:
run: "nginx2"
如何限制其他命名空间访问默认命名空间中的pod
如果只想在命名空间级别进行限制,那么只需使用namespaceSelector
kubectl label ns default key=value
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: access-nginx
spec:
podSelector:
matchLabels:
run: nginx1
ingress:
- from:
- namespaceSelector
matchLabels
key: value
这将阻止来自任何命名空间中没有标签key=value
的任何pod的到标签为run=nginx1
的pod的流量
有关更多详细信息,请参阅此处的文档
如果您希望AND条件(同时匹配POD和Namespace条件(与您的需求相匹配。您可以使用下面的NetworkPolicy yaml文件和label命令(请查看namespaceSelector和PodSelector是如何定义的,它在同一个数组中定义,将其标记为and条件(。但你确定你的网络策略是在默认命名空间中创建的吗?
kubectl label ns default name=default
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: access-nginx
spec:
podSelector:
matchLabels:
run: nginx1
ingress:
- from:
- namespaceSelector:
matchLabels:
name: "default"
podSelector:
matchLabels:
run: "nginx2"
网络策略文档概述了可以在入口from
部分或出口to
部分中指定的四种选择器。
- podSelector
- 名称空间选择器
- namespaceSelector和podSelector
- ipBlock
您应该在您的用例中使用第三种类型的选择器:namespaceSelector和podSelector
- namespaceSelector
matchLabels
preferedNS: someNS
- podSelector:
matchLabels:
run: "nginx2"
文档