NetworkPolicy Yaml规范中令人困惑的Kubernetes语义

时间:2019-09-14 19:12:14

标签: kubernetes yaml kubernetes-networkpolicy kubernetes-networking

观察:ingressspec的字段值。

情况1:拒绝所有到应用程序的流量。这里的入口将一个空数组作为其值。

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: web-deny-all
spec:
  podSelector:
    matchLabels:
      app: web
  ingress: [] # <-- This DENIES ALL traffic

情况2:允许到应用程序的所有流量。在这里,入口将使用空地图的列表项作为其值。

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: web-allow-all
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: web
  ingress:
  - {}  # <-- This ALLOWS ALL traffic

我只是想知道,如果我要大声读出上面ingress的赋值,我该如何读取?

1 个答案:

答案 0 :(得分:3)

YAML有两种不同的方式来编写列表(就此而言,大多数其他对象)。如果我们都使用相同的列表语法编写这两种代码,这可能会变得更加清晰:

# deny-all
ingress: []

# allow-all
ingress: [{}]

假定其中一项策略是唯一与问题豆荚匹配的策略。第一个策略在ingress列表中没有任何项目,第二个策略。 The NetworkPolicySpec API documentation告诉我们

  

如果流量在其podSelector与该pod匹配的所有NetworkPolicy对象中至少匹配一个入口规则,则允许该Pod流量。

因此,在第一种情况下,该策略与pod匹配,但是没有入口规则,因此至少没有一个匹配的入口规则,因此流量被拒绝。

在第二种情况下,只有一个规则,即空NetworkPolicyIngressRule。其中有两个字段fromports,但是这两个字段的文档都说

  

如果此字段为空或丢失,则此规则匹配所有[源或端口]

因此,空对象规则匹配所有源和所有端口;并且由于存在匹配的入口规则,因此允许流量。