指南文章·阅读 5 分钟
安全地将 Kubernetes YAML 转换为 JSON
Kubernetes YAML 到 JSON 的转换发生在 API 边界:Kubernetes 表示 JSON,而 YAML 是 kubectl 及其客户端库为您转换的便利层 - 这就是为什么当出现问题时理解转换很重要。
已更新
Kubernetes YAML 到 JSON:为什么要转换?
- 使用实际的 API 形状进行调试:当字段被拒绝时,JSON 会准确显示服务器所看到的内容,不会出现 YAML 键入歧义。
- 供给管道:许多工具(策略引擎、CI 脚本、jq 管道)消耗 JSON 比 YAML 更舒适。
- 比较渲染输出:比较两个 Helm 版本作为 JSON 使类型更改可见 - 经典的“true 不是“true””错误。
- 文档和教学:JSON 大括号使spec.template.spec.containers 的嵌套清晰无误。
多文档问题
清单文件通常包含许多由 --- 分隔的资源:命名空间、ConfigMap、部署、服务、入口、HPA。一个简单的 YAML 到 JSON 转换器会读取第一个文档,然后默默地丢弃其余部分——对于基础设施工作来说,这是一种真正危险的故障模式。好的转换器会生成一个 JSON 数组,每个文档一个元素,并告诉您他们找到了多少个元素。
Helm、锚点以及“为什么我的输出中没有锚点?”
YAML 锚点和别名可以删除一个文件内的重复块。 Helm 模板更进一步——在渲染之前它们根本不是 YAML。仅转换渲染输出(helm 模板/helm 获取清单),而不转换原始模板文件。将锚点合并到它们的值中是正确的行为:JSON没有别名,因此转换器必须取消引用它们。
打字陷阱
- 布尔值:“y”、“yes”、“on”等版本和名称在 YAML 1.1 中是布尔值。在Kubernetes中,像“on”这样的图像标签或像“1.10”这样的版本是一个典型的无声腐败案例——总是在源代码中引用它们。
- 端口和资源:containerPort:8080是一个int;对于键入的字段,“8080”作为字符串将被 API 拒绝。 JSON 保持了明确的区别。
- 内存数量:128Mi 是两种格式的字符串 - 正确,因为它是按 Kubernetes 解析的,而不是 YAML 。
- 环境值:env值是按spec定义的字符串; value:3000在YAML中变为数字3000,API拒绝该数字。这是最常见的明显错误之一,JSON 输出使其立即显而易见。
实用的工作流程
- 首先渲染(如果Helm):helm 模板 mychart > render.yaml。
- 通过多文档支持转换为 JSON 数组,因此不会丢失任何资源。
- 与集群的内容进行比较:与 1 diff 工具相比,kubectl get deploy web-app -o json — 重要的更改会立即显现出来。
- 充满信心地打补丁:JSON 补丁 (RFC 6902) 和战略合并补丁更容易针对明确的 JSON 进行编写。
此站点上的工具涵盖了这两个步骤:YAML 到 JSON 用于转换,JSON Diff 用于将结果与 kubectl 输出进行比较 — 集群数据不会离开您的机器。