限制其他名称空间访问Pod

时间:2020-08-07 15:34:11

标签: kubernetes

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


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

3 个答案:

答案 0 :(得分:1)

这是预期的行为,因为您没有使用namespaceSelector

在名称空间级别限制流量

在默认名称空间中添加标签key=value,并在入口使用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 

这将阻止流量从任何不带有标签run=nginx1的命名空间中的任何Pod发送到带有标签key=value的Pod。

有关更多详细信息,请参阅文档here

答案 1 :(得分:1)

如果您希望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"

答案 2 :(得分:1)

网络策略文档概述了可以在入口notes(collection) note_1(doc) content: 'some words...' tags: ['apple', 'banana'] tags(collection) tag_1(doc) name: 'apple' tag_2(doc) name: 'banana' 部分或出口from部分中指定的四种选择器。

  • podSelector
  • namespaceSelector
  • namespaceSelector和podSelector
  • ipBlock

您应该在用例中使用选择器的第三种类型: namespaceSelector和podSelector

to

Documentation