YAML 标记语言 交互式学习

掌握云原生时代最核心的配置语言——从缩进理解结构,从结构理解一切。

试试看:在左侧修改 YAML 的缩进、空格、层级,右侧结构树会实时变化。先预测结果,再观察——空白如何决定结构,这是理解 YAML 的第一把钥匙。

编辑器
结构解析
观察

你看到了什么

YAML 没有花括号、没有标签——结构完全由空白决定。

试着做以下实验,每次只改一处:

  • skills 下的某项多缩进一层——注意结构树的变化
  • districtcity 缩进不同——看看层级如何断裂
  • 删除冒号后的空格——观察解析结果

你现在看到的,就是 YAML 全部的语法——空白字符就是结构。

概念

缩进即结构

YAML 用空格缩进表达层级。同一层级对齐,子级比父级多缩进(标准为 2 个空格)。Tab 字符在 YAML 中是非法的。

同一层级的键必须在同一列。子内容向右缩进一个层级。

# 正确 — 2 空格缩进
person:
  name: 李四
  job:
    title: 工程师
    company: ABC公司

# 错误 — 混用了 Tab
person:
	name: 李四    ← Tab 非法!
常见误解:"缩进只是风格问题。"——不是。缩进就是语法。错误的缩进会改变解析结果,甚至直接报错。
概念

键值对映射

YAML 的基础数据单元是 key: value。冒号后必须有空格。无需引号包裹普通字符串。

# 基本类型
name: 张三              # 字符串
age: 28                 # 整数
height: 1.75            # 浮点数
is_student: false       # 布尔值(小写)
favorite_color: "红色"  # 含特殊字符需引号
empty_value: null       # null

# 冒号本身在值中时,值必须加引号
url: "https://example.com:8080/path"
常见误解:"YAML 像 JSON 一样需要引号。"——错。简单字符串直接写,只有含冒号、#、引号、方括号时才需要引号。
概念

复合数据结构

通过缩进嵌套,YAML 可以在映射内部嵌入列表和子映射——这是 YAML 表达复杂结构的方式。

# 列表(连字符 + 缩进)
fruits:
  - apple
  - banana
  - cherry

# 嵌套映射
server:
  host: 192.168.1.1
  ports:
    http: 8080
    https: 8443

# 混合使用
database:
  primary:
    host: db1.example.com
    ports: [5432, 5433]  # 流式内联列表
概念

特殊语法

锚点、别名和多行字符串——让重复配置更精炼,让长文本更可控。

# 锚点(&)定义,别名(*)引用
defaults: &defaults
  timeout: 30
  retries: 3

production:
  <<: *defaults   # 合并
  debug: true    # 覆盖

# | 保留换行
readme: |
  第一行
  第二行
  第三行

# > 折叠为单行
note: >-
  这是一段
  很长的文字
最难的点:&* 在 HTML 中会与实体编码冲突。写 YAML 文件时用原生字符,写 HTML 中展示时转义为 &amp;
练习

编写一个应用配置

编写一个 YAML 配置文件,包含应用名称、端口、环境变量映射和日志级别。

练习 1:应用配置

包含:name(字符串)、port(数字)、env 映射(DB_HOST, DB_PORT)、debug(布尔值)。

结构:app 下嵌套 name、port、env 映射、debug。env 内部是 DB_HOST 和 DB_PORT 两个键。
练习

定义服务列表

用 YAML 列表语法定义三个微服务,每个包含 name 和 port。

练习 2:微服务列表

三个服务:api-gateway:8080、user-service:8081、order-service:8082。

services 是一个列表,每个元素是含 name 和 port 的映射。注意列表项(-)和键值对的缩进关系。
练习

多行字符串

分别使用 |(保留换行)和 >(折叠块)定义多行文本。

练习 3:多行字符串

定义一个 readme 用 |,定义一个 notification 用 >。

readme 字段后跟 |,写多行内容;notification 字段后跟 >,写多行内容。两个字段各自用缩进嵌套在同一个父键下。
实战

Kubernetes Deployment 配置

综合运用所有概念,编写一个可用的 K8s 配置文件。

实战任务

编写 deployment.yaml,包含:apiVersion、kind、metadata(name + labels)、replicas、selector、template(含 containers 列表)、container 的 image/port/resources/env,并使用锚点定义容器默认值。

先写 apiVersion、kind、metadata、spec 四个顶层键。spec 下是 replicas、selector、template。containers 是列表,每个元素含 name、image、ports、resources。锚点 &containerDefaults 放一个默认配置,用 << 合并。

参考示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
  labels:
    app: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: web
          image: nginx:1.25
          ports:
            - containerPort: 80