YAML: Kubernetes世界里的通用语言

181 阅读4分钟

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
    }
}

yaml.webp (1920×2030) (raw.githubusercontent.com)

什么是API对象

Kubernetes 归纳总结了 Google 多年的经验,在理论层面抽象出了很多个概念,用来描述系统的管理运维工作,这些概念就叫做“API 对象”。

查看当前Kubernetes支持的所有对象

kubectl api-resources

image-20230128234405212.png (1029×765) (raw.githubusercontent.com)

我们在使用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对象分成headerbody两部分

“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

image-20230130185201749.png (869×602) (raw.githubusercontent.com)

生成文档样板

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

总结

  1. YAML 是 JSON 的超集,支持数组和对象,能够描述复杂的状态,可读性也很好。
  2. Kubernetes 把集群里的一切资源都定义为 API 对象,通过 RESTful 接口来管理。描述 API 对象需要使用 YAML 语言,必须的字段是 apiVersion、kind、metadata。
  3. 命令 kubectl api-resources 可以查看对象的 apiVersion 和 kind,命令 kubectl explain 可以查看对象字段的说明文档。
  4. 命令 kubectl apply、kubectl delete 发送 HTTP 请求,管理 API 对象。
  5. 使用参数 --dry-run=client -o yaml 可以生成对象的 YAML 模板,简化编写工作。

13dc437dda840dda4850fb72237b8e36.jpg (1920×2868) (raw.githubusercontent.com)

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