ZonoTools

为 Kubernetes 将 JSON 转换为 YAML(含示例)

作者 ZonoTools11 分钟阅读

为什么 Kubernetes 使用 YAML

Kubernetes 以声明式配置为核心:你描述期望状态,例如 replicas、images、env、volumes,controller 会让集群靠近这个状态。这个流程非常适合把 YAML 文件提交到 Git、在 PR 中审查,并用 kubectl apply -f 应用。

控制平面内部大量使用 JSON,但人类通常维护 YAML。YAML 去掉了大括号和逗号,让大型嵌套 spec 更容易 diff 和审查。

Kubernetes 中的 JSON vs YAML

kubectl get deployment nginx -o json 输出 JSON;API server 和 webhook 也交换 JSON。YAML 是作者友好的输入层:kubectl 接受 YAML 后会转换成结构化对象。

所以实际分工是:机器和调试轨迹暴露 JSON,人类维护和审查 YAML。

JSON Deployment 示例

json
{ "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": "nginx-demo", "namespace": "default", "labels": { "app": "nginx-demo" } }, "spec": { "replicas": 2, "selector": { "matchLabels": { "app": "nginx-demo" } }, "template": { "metadata": { "labels": { "app": "nginx-demo" } }, "spec": { "containers": [ { "name": "nginx", "image": "nginx:1.25-alpine", "ports": [{ "name": "http", "containerPort": 80 }] } ] } } }}

转换后的 YAML

应用前可以先运行 kubectl apply --dry-run=client -f -。如果转换丢字段或改变列表结构,应当修正 pipeline,而不是直接进入生产。

yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-demo namespace: default labels: app: nginx-demo spec: replicas: 2 selector: matchLabels: app: nginx-demo template: metadata: labels: app: nginx-demo spec: containers: - name: nginx image: nginx:1.25-alpine ports: - name: http containerPort: 80

提交到 Git 前清理噪声

从集群导出的对象经常包含不应提交的字段:resourceVersionuidcreationTimestampmanagedFields.status。这些字段会制造无意义 diff,甚至影响 server-side apply。

通常保留你控制的 apiVersionkindmetadataspec,以及 ConfigMap 的 data、RBAC 的 rules 等目标字段。

常见问题

缩进是 YAML 语法。多两个空格或少两个空格,都可能改变 PodSpec。数组也要格外小心:containersenvportsvolumeMounts 都必须保持列表结构。

更多缩进、类型和引号问题,可以参考 Common JSON to YAML conversion errors

用 ZonoTools 快速转换

打开 JSON to YAML,粘贴 Deployment 或 CRD 片段,复制 YAML,再用 Kubernetes 工具做 dry-run。处理发生在浏览器中,适合包含内部 registry host 或 placeholder secret 的样例。

结论

JSON to YAML for Kubernetes 不是单纯换语法。转换后还要去掉集群噪声、检查数组和缩进,并用 Kubernetes 自己的校验流程确认。

footer=