Kubernetes将使用KYAML解决YAML难题

123 阅读4分钟

Kubernetes 1.34版本可能引入KYAML,它是YAML的严格子集,旨在简化Kubernetes配置。KYAML模仿JSON,但支持注释和尾随逗号,且对空格不敏感。尽管如此,KYAML的引入预计会引发争议,但已有Go语言的实现。

译自:Kubernetes Will Solve YAML Headaches with KYAML

作者:Joab Jackson

用于部署和运行 Kubernetes 的数据序列化语言已经过全面改进。

Kubernetes 的 即将发布的 1.34 版本 可能会附带 KYAML,它是 YAML 的一个严格子集,专门为 Kubernetes 用户 格式化。

“YAML 是 Kubernetes 的编程语言,”云原生软件包管理服务 Cloudsmith 的开发者关系主管 Nigel Douglas 在接受 TNS 采访时表示。

然而,许多用户对 YAML 中的许多 设计怪癖 感到沮丧,这些怪癖导致额外的工作和额外的调试(即使创建者本人正在努力使 YAML 成为一个成熟的编程语言)。

解决 YAML 困境的方案是什么?加入少量的 JSON

呼叫 Null 医生

YAML 贯穿 整个 Kubernetes 生态系统:用于创建网络策略,编写部署清单或用于 Helm 部署文件。

一个问题是:YAML 不能很好地处理 空格。特别是,当用户使用嵌套指令时,他们必须密切注意使用的缩进数量。格式化对于 云原生战士 来说是一项繁琐的工作,但是代码中错误的 idents 数量可能会绊倒 Helm。

同样,YAML 中可选的引号导致了歧义,这对于计算机来说始终是危险的。引号的挑战通过“挪威问题”得到了恰当的说明,其中未能用一组引号封装一个两位数的国家/地区缩写可能会绊倒寻找保留关键字的解析器,例如挪威的“NO”。

或者,在另一种情况下,Last_Name=Null 实际上是为名叫 Richard Null 的人准备的。

正如许多人指出的那样,JSON 也可以用来代替 YAML,尽管它在 Kubernetes 环境中也有其自身的局限性:没有注释支持,并且严格遵守尾随逗号和带引号的键。

另一种标记语言

“YAML 最令人沮丧的部分是它不必这么糟糕。YAML 是一个非常广泛的规范。在该规范中,有一个合理的语法尖叫着要被释放出来,”Kubernetes 提案 KEP 5295 断言。

KYAML 就是该规范,至少对于 Kubernetes 用户而言。Douglas 说,KYAML“以一种方式构建,它与 Kubernetes 对象周围的现有设计完全兼容”。

KYAML 是 YAML 的一个严格子集。所有 KAYML 文件也是有效的 YAML,它们可用于编写清单和 Helm charts,而无需 K8s 的其他标志。

如果包含在 Kubernetes 1.34 中(仍在最终确定),KYAML 将与 kubectl Kubernetes 命令行一起使用,该命令行将使用特殊标志以 KYAML 格式输出(即,kubectl get -o kyaml)。

以下是 KYAML 的其他规则。

  • 双引号是值字符串。
  • 键不带引号,除非可能不明确。
  • 映射(关联数组)使用大括号 {}
  • 列表使用方括号 []

这些规则模仿 JSON,尽管与 JSON 不同,KYAML 支持注释和尾随逗号,并且不需要带引号的键。

此外,KYAML 对 空格不敏感

以下是提案提供的示例:

$ kubectl get -o kyaml svc hostnames
---
{
  apiVersion: "v1",
  kind: "Service",
  metadata: {
    creationTimestamp: "2025-05-09T21:14:40Z",
    labels: {
      app: "hostnames",
    },
    name: "hostnames",
    namespace: "default",
    resourceVersion: "37697",
    uid: "7aad616c-1686-4231-b32e-5ec68a738bba",
  },
  spec: {
    clusterIP: "10.0.162.160",
    clusterIPs: [
      "10.0.162.160",
    ],
    internalTrafficPolicy: "Cluster",
    ipFamilies: [
      "IPv4",
    ],
    ipFamilyPolicy: "SingleStack",
    ports: [{
      port: 80,
      protocol: "TCP",
      targetPort: 9376,
    }],
    selector: {
      app: "hostnames",
    },
    sessionAffinity: "None",
    type: "ClusterIP",
  },
  status: {
    loadBalancer: {},
  },
}

但我仍然讨厌它

与任何修改后的数据格式一样,这些更改将 受到激烈争论。开发人员预计到这一点。

“语法一直是我们行业中争论的焦点。我们预计这也不例外。理性的人会不同意我们的选择,这很好,但我们应该对此持有强烈的意见,”开发人员在 ReadMe 文件 中警告说,该文件最初由 Tim Hockin 撰写。

而且反应已经到来了。

“它比 JSON 更好,我明白为什么这比 YAML 更好,但我仍然讨厌它,”一位 Reddit 用户写道

快速搜索显示,至少已经为 Go 编程语言 制作了一个特定于编程语言的 KYAML 实现。

已经采取了其他方法,包括精简的 StrictYAML,尽管 KYAML 在新的 Kubernetes 版本中具有快速通道。让我们看看它还可以在哪里使用。

Kubernetes 1.34 预计将于 8 月下旬发布。