YAML: Kubernetes世界里的通用语言
声明式与命令式
YAML是声明式的,Docker命令和Dockerfile就属于命令式的。
命令式
交互性强,注重顺序和过程,必须告诉计算机每步该做什么。
声明式
不关注具体的过程,更注重结果,不需要教计算机怎么做,只要告诉它一个目标状态,它自己就会想办法去完成任务。
什么是YAML
YAML是JSON的超集,支持整数、浮点数、布尔、字符串、数组和对象等数据类型。任何合法的JSON文件都是YAML文档。
YAML相比JSON的语法更简洁:
- 可以使用空白和缩进表示层次,可以不适用花括号和方括号
- 可以使用 # 书写注释,比起 JSON是很大改进
- 对象(字典)的格式与JSON基本相同,但Key不需要双引号
- 数组(列表)是使用 - 开头的清单形式
- 表示对象的 : 和表示数组的 - 后面都必须要有空格
- 可以使用 --- 在一个文件里分割多个 YAML 对象
几个 YAML 的简单示例
数组列表
YAML格式
# YAML数组(列表)
OS:
- linux
- macOS
- Windows
相当于
{
"OS": ["linux", "macOS", "Windows"]
}
对象字典
YAML 格式
# YAML对象(字典)
Kubernetes:
master: 1
worker: 3
相当于
{
"Kubernetes": {
"master": 1,
"worker": 3
}
}

什么是API对象
Kubernetes 归纳总结了 Google 多年的经验,在理论层面抽象出了很多个概念,用来描述系统的管理运维工作,这些概念就叫做“API 对象”。
查看当前Kubernetes支持的所有对象
kubectl api-resources

我们在使用kubectl命令时,可以使用SHORTNAMES,比如Pods 可以简写为 po,Service简写成 svc
使用kubectl命令时,可以加上 --v=9,可以显示出详细的命令执行过程,看到发出的HTTP请求
kubectl get pod --v=9
kubectl 客户端等价于调用了 curl,向 8443 端口发送了 HTTP GET 请求,URL 是 /api/v1/namespaces/default/pods
如何描述API对象
apiVersion: v1
kind: Pod
metadata:
name: ngx-pod
labels:
env: demo
owner: chrono
spec:
containers:
- image: nginx:alpine
name: ngx
ports:
- containerPort: 80
API对象采用标准的HTTP协议,可以将上面的API对象分成header和body两部分
“header”包含的是 API 对象的基本信息,有三个字段:apiVersion、kind、metadata。
- apiVersion 表示操作这种资源的 API 版本号。
- kind 表示资源对象的类型,这个应该很好理解,比如 Pod、Node、Job、Service 等等。
- metadata 这个字段顾名思义,表示的是资源的一些“元信息”,也就是用来标记对象。
header中的apiVersion和kind使用的是kubectl api-resources中的相应字段值。
“header”里的 apiVersion、kind、metadata 这三个字段是任何对象都必须有的,而“body”部分则会与对象特定相关,每种对象会有不同的规格定义,在 YAML 里就表现为 spec 字段(即 specification),表示我们对对象的“期望状态”(desired status)。
spec:
containers:
- image: nginx:alpine
name: ngx
ports:
- containerPort: 80
这里指定了具体使用的镜像、名称、端口
使用 kubectl apply、kubectl delete,再加上参数 -f,你就可以使用这个 YAML 文件,创建或者删除对象了:
kubectl apply -f ngx-pod.yml
kubectl delete -f ngx-pod.yml
如何编写YAML
几个简单实用小技巧
kubectl api-resources
kubectl api-resources 命令,它会显示出资源对象相应的 API 版本和类型,比如 Pod 的版本是“v1”,Ingress 的版本是“networking.k8s.io/v1”,照着它写绝对不…
kubectl explain
相当于是 Kubernetes 自带的 API 文档,会给出对象字段的详细说明
kubectl explain pod
kubectl explain pod.metadata
kubectl explain pod.spec
kubectl explain pod.spec.containers

生成文档样板
kubectl 的两个特殊参数 --dry-run=client 和 -o yaml,前者是空运行,后者是生成 YAML 格式,结合起来使用就会让 kubectl 不会有实际的创建动作,而只生成 YAML 文件
kubectl run ngx --image=nginx:alpine --dry-run=client -o yaml
生成一个绝对正确的YAML文件
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: ngx
name: ngx
spec:
containers:
- image: nginx:alpine
name: ngx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
接着借助对象的说明文档,添加或删除字段来定制这个YAML
这个技巧可以优化一下
export out="--dry-run=client -o yaml"
kubectl run ngx --image=nginx:alpine $out
总结
- YAML 是 JSON 的超集,支持数组和对象,能够描述复杂的状态,可读性也很好。
- Kubernetes 把集群里的一切资源都定义为 API 对象,通过 RESTful 接口来管理。描述 API 对象需要使用 YAML 语言,必须的字段是 apiVersion、kind、metadata。
- 命令 kubectl api-resources 可以查看对象的 apiVersion 和 kind,命令 kubectl explain 可以查看对象字段的说明文档。
- 命令 kubectl apply、kubectl delete 发送 HTTP 请求,管理 API 对象。
- 使用参数 --dry-run=client -o yaml 可以生成对象的 YAML 模板,简化编写工作。

《极客时间-Kubernetes入门实战课》学习笔记 Day11