本文约1700字,阅读约需要8分钟。
刚接触 Kubernetes 的时候,我一直傻傻地以为:
K8s 学的是命令✨
比如:
kubectl get pod
kubectl describe
kubectl logs
敲得飞起,觉得自己快成专家了。
直到后来真正开始部署:
甚至折腾高可用、监控、Ingress 之后……
我才慢慢意识到一个真相:
Kubernetes 真正的核心,其实是 YAML。
因为不管你想让集群做什么,最终都会写成这样一份文件:
apiVersion:
kind:
metadata:
spec:
今天这篇文章,我就结合自己接触 K8s 实验时踩过的一些坑,聊聊:
为什么整个 Kubernetes 世界,都离不开 YAML。
YAML 的全名很长(YAML Ain’t Markup Language),但你不用记。
你只需要知道:
它是一种用来描述数据的语言,专门为人类阅读和书写设计。
最大的特点:
✅ 可读性极强 ✅ 非常适合写配置文件 ✅ 比 JSON 温柔多了
举个例子:
app:
name: nginx
port: 80
是不是跟自然语言差不多?
一看就懂,不用解释。
因为 Kubernetes 的核心思想是:
声明式(Declarative)
什么意思?
你不是在告诉 K8s “怎么启动一个容器” 而是告诉它:
“我希望系统最终变成什么样子”
比如你在 YAML 里写:
replicas: 2
它的意思不是 “启动 2 个 Pod” 而是:
“系统应该始终维持 2 个 Pod”
如果某个 Pod 挂了,Kubernetes 会自动再拉起一个。
这就是声明式的魅力:你说目标,它来执行。

我第一次看到这种内容时:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 2
说实话:完全不知道在看什么😵
每个词都认识,连在一起就天书。
后来才慢慢搞懂——其实每一行都是在回答一个简单的问题。
apiVersionapiVersion: apps/v1
👉 告诉 K8s:这个资源属于哪个 API 版本。 相当于你填表格时,先写“表格版本号”。
kindkind: Deployment
👉 资源类型。 就是你要创建的东西是什么:Pod、Deployment、Service……
常用类型一览:
类型 | 作用 |
|---|---|
Pod | 最小运行单元 |
Deployment | 管理 Pod |
Service | 提供网络访问 |
ConfigMap | 存放配置文件 |
Secret | 存放敏感信息 |
metadatametadata:
name: nginx
👉 给资源起个名字。
之后你敲:
kubectl get deployment
看到的名字就是它。
spec(最重要)spec:
这里才是真正描述 “系统应该长什么样”的地方。
比如:
replicas: 2
意思就是:集群里必须始终有 2 个 Pod。
Kubernetes 的 YAML 看起来复杂, 其实核心就一个规则:缩进。
比如:
resources:
limits:
cpu: "500m"
memory: "512Mi"
这里 limits是从属于 resources的。
缩进多少空格不重要,重要的是同一层级的缩进必须一致。
❌ 千万不能用 “Tab” ,只能使用 “空格”
最常见,也最简单:
image: nginx
用 -表示列表项,在 K8s 里非常常见:
containers:
- name: nginx
- name: redis
这里 -表示一个列表项,相当于数组里的一个元素。
前面学 Deployment,我觉得 YAML 也就是个“配置文件”。
直到我开始搭 Prometheus + Grafana,才真正意识到:
YAML 已经是在描述整个系统的架构了。
比如 Prometheus 的 ConfigMap 里会有这样一段:
data:
prometheus.yml: |
那个 |符号很关键。
它表示:后面的多行内容,保留换行和格式。
示例:
script: |
echo hello
echo world
实际效果就是:
echo hello
echo world
换行不会丢失,缩进也不会乱。 这对于写 Prometheus 的抓取规则来说,太重要了。

spec:
replicas: 2 # 这里缩进不够,错了
replicas必须比 spec多缩进。
YAML 不允许 Tab,只能用空格。 很多编辑器会自动把 Tab 转成空格,但最好把“显示空白字符”打开,避免踩坑。
例如:
replicas: hello
YAML 本身没毛病,但 Kubernetes 会报错,因为 replicas必须是数字。
这是我踩过不少坑之后养成的习惯: 在真正执行apply之前,先校验。
kubectl apply -f deploy.yaml --dry-run=client
只检查 YAML 格式正不正确。
kubectl apply -f deploy.yaml --dry-run=server
这个会让 API Server 真正检查:
比你肉眼检查靠谱一万倍。

刚开始:YAML 好烦,为什么不能全用命令?
后来才明白:
真正复杂的,从来不是 YAML 本身。 复杂的是 你是否真正理解 Kubernetes 系统。
YAML 本质上只是:
系统结构的一张“设计图”
当你真正理解了:
你会发现:
YAML 其实是在用文本描述一个分布式系统的全部样子。
如果现在让我用一句话总结 YAML:
Kubernetes 的世界,就是“YAML 驱动的自动化系统”。
你写下:
replicas: 2
背后可能触发:
这也是为什么,真正进入云原生之后:
YAML 会慢慢变成每个 DevOps 工程师的“第二语言”。