为 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 示例
{ "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,而不是直接进入生产。
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 前清理噪声
从集群导出的对象经常包含不应提交的字段:resourceVersion、uid、creationTimestamp、managedFields 和 .status。这些字段会制造无意义 diff,甚至影响 server-side apply。
通常保留你控制的 apiVersion、kind、metadata、spec,以及 ConfigMap 的 data、RBAC 的 rules 等目标字段。
常见问题
缩进是 YAML 语法。多两个空格或少两个空格,都可能改变 PodSpec。数组也要格外小心:containers、env、ports、volumeMounts 都必须保持列表结构。
更多缩进、类型和引号问题,可以参考 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 自己的校验流程确认。