限制其他命名空间访问pod



我已经在默认名称空间中创建了如下所示的网络策略


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"

文档

最新更新