Hero Image of content
编写K8s API对象YAML文件小技巧

k8s API 对象多,编写 YAML 文件时有时候不知道 apiVersion 的值是什么、kind 的值是什么及在 spec 里又需要用哪些字段。且 YAML 写起来容易出错,比如容易搞错缩进之类。

查看 Kubernetes 的官方参考文档是最准确的: Kubernetes api ,但文档内容太多太细,查看起来比较麻烦,所以下面介绍 3 种相对简单实用的小技巧。

技巧一:使用kubectl api-resources命令

kuberctl api-resources命令会显示资源对象相应的 API 版本和类型,如图

api resources
  • NAME一栏是对象的名字;
  • SHORTNAMES一栏是资源对象的简写,在敲kubectl命令时很有用,建议使用对应的简写;
  • APIVERSION一栏是资源对象的 API 版本号,由于 Kubernetes 的迭代速度很快,不同的 k8s 版本创建的对象可能存在差异,为了区分就需要用到这个apiVersion字段,其值就是该栏的对象的值;
  • NAMESPACED一栏表示资源对象是命令空间资源还是非命名空间资源;
  • KIND一栏是资源对象的类型。

技巧二:使用kubectl explain命令

kubectl explain命令相当于是 Kubernetes 自带的 API 文档,会给出对象字段的详细说明。比如想查看 Pod 里的字段怎么写,就可以这样查看:

kubectl explain pod

kubectl explain pod.apiVersion

kubectl explain pod.spec

kubectl explain pod.spec.containers
explain

技巧三:使用kubectl命令生成文档样板

这个技巧是利用 kubectl 命令的两个特殊参数--dry-run=client-o yaml,前者是空运行,后者是生成 YAML 格式,结合起来使用就会让 kubectl 不会有实际的创建动作,而只是生成 YAML 文件。

例如,生成一个 Pod 的 YAML 样板示例:

kubectl run http-sever --image=nginx:apline --dry-run=client -o yaml

在终端上生成了一个绝对正确的 YAML 文件内容:

apiVersion: v1
kind: Pod
metadata:
    creationTimestamp: null
    labels:
        run: http-sever
    name: http-sever
spec:
    containers:
        - image: nginx:apline
          name: http-sever
          resources: {}
    dnsPolicy: ClusterFirst
    restartPolicy: Always
status: {}

使用 kubectl run 命令只能创建 Pod,要创建 Pod 之外的 API 对象,需要使用命令kubectl create,及加上对象名。

例如,生成一个 Job 对象,命令为:

kubectl create job echo-job --image=busybox --dry-run=client -o yaml
apiVersion: batch/v1
kind: Job
metadata:
    creationTimestamp: null
    name: echo-job
spec:
    template:
        metadata:
            creationTimestamp: null
        spec:
            containers:
                - image: busybox
                  name: echo-job
                  resources: {}
            restartPolicy: Never
status: {}

接下来就是查看对象的说明文档,比如技巧一、二的命令或者官网文档,添加或者删除字段来定制这个 YAML 了。