使用Kubernetes网络策略允许来自所有来源的流量

vcirk6k6  于 2023-03-17  发布在  Kubernetes
关注(0)|答案(2)|浏览(145)

以下两种网络策略有什么区别?它们之间只有spec.ingress.from.podSelector的区别。
第一个网络策略:

controlplane ~ ➜  cat netpol1.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: ingress-to-nptest-1
  namespace: default
spec:
  podSelector:
    matchLabels:
      run: np-test-1
  policyTypes:
    - Ingress
  ingress:
    - ports:
        - protocol: TCP
          port: 80

第二个网络策略:

controlplane ~ ➜  cat netpol2.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: ingress-to-nptest-2
  namespace: default
spec:
  podSelector:
    matchLabels:
      run: np-test-1
  policyTypes:
    - Ingress
  ingress:
    - from:
      - podSelector: {}
      ports:
        - protocol: TCP
          port: 80

当我运行kubectl describe netpol时,它提示了一个不同的行为,但我不知道有什么不同。
在第一种情况下,它允许流量“来自:(流量不受源限制)":

controlplane ~ ➜  k describe netpol ingress-to-nptest-1
Name:         ingress-to-nptest-1
Namespace:    default
Created on:   2023-03-16 07:53:04 -0400 EDT
Labels:       <none>
Annotations:  <none>
Spec:
  PodSelector:     run=np-test-1
  Allowing ingress traffic:
    To Port: 80/TCP
    From: <any> (traffic not restricted by source)
  Not affecting egress traffic
  Policy Types: Ingress

在第二种情况下,它允许来自与“PodSelector:none”匹配的pod的流量:

controlplane ~ ➜  k describe netpol ingress-to-nptest-2
Name:         ingress-to-nptest-2
Namespace:    default
Created on:   2023-03-16 07:54:09 -0400 EDT
Labels:       <none>
Annotations:  <none>
Spec:
  PodSelector:     run=np-test-1
  Allowing ingress traffic:
    To Port: 80/TCP
    From:
      PodSelector: <none>
  Not affecting egress traffic
  Policy Types: Ingress

Kubernetes API参考表明这相当于第一个网络策略:
播客选择器:这是选择Pod的标签选择器。此字段遵循标准标签选择器语义;如果存在但为空,则选择所有pod。
在这两种情况下,来自每个源的流量都被允许,这对吗?两种网络策略是否等效?

cnjp1d6j

cnjp1d6j1#

如果我是对的,我能看到的唯一区别是这一部分:

- from:
      - podSelector: {}

并不排除任何东西。所以理论上它们是一样的。

pexxcrt2

pexxcrt22#

经过更多的研究,我想我自己找到了答案。Kubernetes API参考资料指出:
spec.ingress.from:如果此字段为空或缺失,则此规则将匹配所有源(通信不受源限制)。
它还在另一页上指出:
spec.ingress.from.podSelector:如果存在但为空,则选择所有pod。
spec.ingress.from.namespaceSelector:如果存在但为空,则它选择所有名称空间。
由于我们也可以指定spec.ingress.from.namespaceSelector,因此可以将spec.ingress.from.podSelector设置为{},而将spec.ingress.from.namespaceSelector设置为某个名称空间,这将选择某个名称空间中的所有pod。另一方面,如果我们将spec.ingress.from留空,则将选择所有名称空间中的所有pod。
由此可见,两个网络策略是相同的,但前提是spec.ingress.from.namespaceSelector也为空。

相关问题