在Kubernetes(K8s)集群管理中,YAML是核心的声明式配置文件格式,我们通过编写YAML资源清单文件,可精准定义Pod、命名空间、服务等各类集群资源,实现集群资源的自动化创建、管理与调度。本文全面梳理YAML基础语法、数据结构,以及K8s专属资源配置字段和实战案例,适合新手入门与日常查阅。
一、YAML核心介绍
YAML 全称 YAML Ain't Markup Language(仍是一种标记语言),是一种以数据为核心、高可读性、轻量化的数据序列化格式。
不同于XML、HTML等以标签嵌套为核心的标记语言,YAML专注于数据表达,语法简洁、结构清晰,非常适合用于配置文件编写,也是Kubernetes、Docker、SpringCloud等主流技术栈的标配配置格式。
二、YAML基础语法规则
YAML语法对缩进、格式有严格要求,核心规则如下,是编写正确配置文件的基础:
- 缩进规则:低版本YAML严格禁止使用Tab键,仅支持空格缩进;相同层级的元素左侧对齐即可,缩进空格数量不固定(统一规范一般用2个空格)。
- 注释规则:以
#作为注释起始符号,从该符号到当前行末尾的所有内容,都会被解释器忽略,仅用于人工备注说明。 - 大小写敏感:YAML严格区分大小写,键名、值的大小写不同会被判定为不同内容。
- 空行无效:文件中的空白行会被自动忽略,不影响配置解析。
三、YAML支持的三大数据结构
YAML所有配置内容均由三种基础数据结构组成,可单独使用,也可组合形成复杂复合结构,完美适配K8s复杂的资源配置场景。
3.1 对象(键值对)
对象是键值对的集合,也称为映射(mapping)、哈希(hashes)、字典(dictionary),是YAML最常用的结构,格式为
key: value(冒号后必须跟一个空格)。基础换行写法:
name: Steve
age: 18行内简写写法(紧凑格式):
hash: { name: Steve, age: 18 }3.2 数组(序列/列表)
数组是有序的值集合,也称为序列(sequence)、列表(list),多用于存储多个同类型配置项,K8s中容器列表、端口列表、环境变量列表均采用数组结构。
基础换行写法(连词线
- 开头):animal:
- Cat
- Dog行内简写写法:
animal: [Cat, Dog]3.3 纯量(基础值)
纯量是YAML中不可再拆分的基础值,是构成对象和数组的最小单元,支持字符串、数值、布尔、空值、时间、日期等多种类型。
常见纯量类型及写法示例:
# 浮点数/整数
number: 12.30
# 布尔值
isSet: true
# 空值
parent: ~
# ISO8601时间格式
iso8601: 2001-12-14t21:59:43.10-05:00
# ISO8601日期格式
date: 1976-07-31
# 强制数据类型转换(!!类型)
e: !!str 123 # 强制数字转为字符串
f: !!str true # 强制布尔值转为字符串3.4 重点:字符串详细规则
字符串是K8s配置中使用频率最高的纯量,YAML对字符串的写法灵活且有专属规则:
- 默认无引号:普通字符串无需添加引号,直接书写即可。示例:
str: 这是一行字符串 - 特殊字符需加引号:字符串包含空格、冒号等特殊字符时,必须用单/双引号包裹。示例:
str: '内容: 字符串' - 引号转义规则:单引号、双引号均可使用;双引号不会转义
\n等特殊字符,单引号会原样输出;单引号嵌套需双写转义。示例:str: 'labor''s day' - 多行字符串:普通多行换行自动转为空格;
|保留原始换行符,>折叠所有换行符。
多行字符串示例:
# 普通多行(换行转空格)
str: 这是一段
多行
字符串
# | 保留换行
this: |
Foo
Bar
# > 折叠换行
that: >
Foo
Bar3.5 复合结构
实际K8s配置中,大多为对象+数组嵌套的复合结构,多层嵌套实现复杂资源定义,示例如下:
languages:
- Ruby
- Perl
- Python
websites:
YAML: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: use.perl.org四、Kubernetes YAML资源清单核心详解
K8s通过YAML声明式文件定义各类集群资源,这类文件统称为资源清单文件。用户只需在YAML中定义「期望资源状态」,K8s控制器会自动比对集群实际状态,完成资源创建、更新和修复。
4.1 K8s YAML通用核心字段
所有K8s资源(Pod、Namespace、Deployment等)的YAML配置,均遵循统一字段规范,以下是生产、学习中高频核心字段详解:
参数名 | 字段类型 | 详细说明 |
|---|---|---|
apiVersion | String | K8S API版本,定义资源所属接口版本,常规资源默认 v1,可通过 kubectl api-versions 命令查询所有可用版本 |
kind | String | 资源类型,定义当前YAML管理的资源角色,常用值:Pod、Namespace、Deployment、Service等 |
metadata | Object | 资源元数据,固定字段,用于定义资源名称、命名空间、标签等基础信息 |
metadata.name | String | 资源名称,自定义,集群内同类型资源名称唯一 |
metadata.namespace | String | 资源所属命名空间,用于资源隔离,自定义命名空间名称 |
spec | Object | 资源详细规格定义,核心字段,用于描述资源的运行参数、配置细节 |
spec.containers[] | List | Pod核心配置,容器列表,一个Pod可包含多个容器,为数组结构 |
spec.containers[].name | String | 容器名称,自定义,当前Pod内容器名称唯一 |
spec.containers[].image | String | 容器镜像名称,指定容器运行依赖的镜像(如nginx:latest、centos:7) |
spec.containers[].imagePullPolicy | String | 镜像拉取策略:1. Always:每次重启都拉取最新镜像(默认)2. Never:仅使用本地镜像,不拉取远程镜像3. IfNotPresent:本地有则用本地,无则拉取远程 |
spec.containers[].command[] | List | 容器启动命令,数组格式可指定多个,不配置则使用镜像默认启动命令 |
spec.containers[].args | List | 容器启动命令参数,配合command使用,支持多个参数配置 |
spec.containers[].workDir | String | 容器内部工作目录,指定容器启动后的默认执行目录 |
spec.containers[].volumeMounts[] | List | 容器存储卷挂载配置,用于数据持久化、目录挂载 |
spec.containers[].volumeMounts[].name | String | 待挂载存储卷的名称,需与外部存储卷名称对应 |
spec.containers[].volumeMounts[].mountPath | String | 容器内部挂载路径,指定存储卷在容器内的访问目录 |
spec.containers[].volumeMounts[].readOnly | String | 挂载目录读写权限,true为只读,false为读写(默认) |
spec.containers[].ports[] | String | 容器端口配置列表,定义容器对外暴露的端口 |
spec.containers[].ports[].containerPort | String | 容器内部监听端口,服务运行的端口 |
spec.containers[].ports[].hostPort | String | 宿主机映射端口,将容器端口映射到主机,同主机端口唯一,不可重复 |
spec.containers[].ports[].protocol | String | 端口协议,支持TCP、UDP,默认TCP |
spec.containers[].env[] | List | 容器环境变量列表,用于配置容器运行所需的环境参数 |
spec.containers[].env[].name | String | 环境变量名称 |
spec.containers[].env[].value | String | 环境变量对应值 |
spec.containers[].resources | Object | 容器资源配额配置,用于限制CPU、内存资源使用,避免资源抢占 |
spec.containers[].resources.limits | Object | 资源上限限制,容器运行时最大可占用的CPU、内存资源 |
spec.containers[].resources.limits.cpu | String | CPU最大限制,单位为core |
spec.containers[].resources.limits.memory | String | 内存最大限制,单位为MiB、GiB |
spec.containers[].resources.requests | Object | 资源初始请求,容器启动时需要分配的最小资源,用于集群调度 |
spec.containers[].resources.requests.cpu | String | CPU初始申请量 |
spec.containers[].resources.requests.memory | String | 内存初始申请量 |
spec.restartPolicy | String | Pod重启策略:1. Always:无论异常与否,终止即重启(默认)2. OnFailure:仅非0退出码异常时重启3. Never:终止后永不重启 |
spec.nodeSelector | Object | 节点选择器,通过标签筛选Pod调度的目标节点 |
spec.imagePullSecrets | Object | 镜像拉取密钥,配置私有镜像仓库的认证密钥 |
spec.hostNetwork | Boolean | 是否启用宿主机网络,默认false;true则共享宿主机网络,端口不可重复 |
4.2 实战YAML配置案例
通过两个入门级实战案例,快速掌握K8s YAML文件编写与使用规范。
案例1:YAML创建命名空间(Namespace)
命名空间用于集群资源隔离,适合多环境、多项目资源区分,最简配置如下:
apiVersion: v1
kind: Namespace
metadata:
name: test # 自定义命名空间名称生效命令:
kubectl apply -f 文件名.yaml案例2:YAML创建基础Pod
Pod是K8s最小资源调度单元,以下为Nginx镜像的基础Pod配置,包含镜像、拉取策略核心配置:
apiVersion: v1
kind: Pod
metadata:
name: pod1 # 自定义Pod名称
spec:
containers:
- name: k8sonline1 # 容器名称
image: nginx:latest # 镜像名称
imagePullPolicy: IfNotPresent # 本地有镜像则优先使用生效命令:
kubectl apply -f 文件名.yaml查看Pod状态:
kubectl get pods五、学习总结
1. YAML是K8s声明式配置的核心,核心掌握空格缩进、键值对、数组、纯量四大基础语法,规避语法报错;
2. K8s YAML配置遵循固定结构:apiVersion(版本)→ kind(资源类型)→ metadata(元数据)→ spec(资源规格);
3. 核心业务配置集中在spec字段,容器参数、资源配额、网络、存储、重启策略均在此定义;
4. 声明式配置的核心优势:一次编写、永久生效,K8s自动维持资源期望状态,适配集群自动化运维场景。
