你看到了什么
YAML 没有花括号、没有标签——结构完全由空白决定。
试着做以下实验,每次只改一处:
- 把
skills下的某项多缩进一层——注意结构树的变化 - 让
district和city缩进不同——看看层级如何断裂 - 删除冒号后的空格——观察解析结果
你现在看到的,就是 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 可以在映射内部嵌入列表和子映射——这是 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 中展示时转义为 &。编写一个应用配置
编写一个 YAML 配置文件,包含应用名称、端口、环境变量映射和日志级别。
包含:name(字符串)、port(数字)、env 映射(DB_HOST, DB_PORT)、debug(布尔值)。
定义服务列表
用 YAML 列表语法定义三个微服务,每个包含 name 和 port。
三个服务:api-gateway:8080、user-service:8081、order-service:8082。
多行字符串
分别使用 |(保留换行)和 >(折叠块)定义多行文本。
定义一个 readme 用 |,定义一个 notification 用 >。
Kubernetes Deployment 配置
综合运用所有概念,编写一个可用的 K8s 配置文件。
编写 deployment.yaml,包含:apiVersion、kind、metadata(name + labels)、replicas、selector、template(含 containers 列表)、container 的 image/port/resources/env,并使用锚点定义容器默认值。
参考示例
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