为什么明显畸形的 yaml 是有效的?

Why is the apparently malformed yaml the one that validates?

在下面的第一个 yaml 中,第二个 podSelector 子句(在 to 下)似乎格式正确,matchLabels 有两个空格缩进,与标准和其余部分一致yaml.

第二个yaml是一样的,但是matchLabels有四个空格。此格式遵循 the Kubernetes documentation.(没有制表符。)

然而第一​​个 yaml 失败 kubectl 验证 错误验证 "p.yaml":错误验证数据:ValidationError(NetworkPolicy.spec.egress[0].to[0]): 未知字段"matchLabels" in io.k8s.api.networking.v1.NetworkPolicyPeer,第二个passes 验证。

这没有通过验证:

 apiVersion: networking.k8s.io/v1
 kind: NetworkPolicy
 metadata:
   name: internal-policy
 spec:
   podSelector:
     matchLabels:
       name: internal
   policyTypes:
   - Egress
   egress:
   - to:
     - podSelector:
       matchLabels:
         name: mysql

这通过了验证:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: internal-policy
spec:
  podSelector:
    matchLabels:
      name: internal
  policyTypes:
  - Egress
  egress:
  - to:
    - podSelector:
        matchLabels:
          name: mysql

那么文档是错误的。 matchLabels 确实是 podSelector 下的哈希的子键。请在文档上打开一个问题,以便我们修复它:)

显然 matchLabels 应该是 podSelector 映射值中的一个键,因此它必须缩进更多。这个:

- podSelector:
  matchLabels:

matchLabels 置于与 podSelector 相同的缩进级别,因为根据 YAML 规范,初始 - 被视为缩进的一部分。基本上,这里定义了两个缩进级别:

  • 序列的层级,从-开始。所有后续序列项的 - 必须处于同一级别。
  • 映射的级别,它是序列的一个值,从p开始。映射的所有后续键必须从同一级别开始。

因此,如果想让matchLabels嵌套在podSelector中,就必须多缩进:

- podSelector:
    matchLabels: