第四章 k8s资源清单-资源清单的编写1
资源清单整体结构
K8s资源清单采用YAML格式编写,通过缩进表示对象的层次关系,整体包含5个一级根对象,所有资源清单都必须包含这5个根对象:
-
前4个根对象(apiVersion、kind、metadata、spec)需要用户手动编写,用于定义资源的属性与期望
-
最后一个根对象status由K8s集群自动维护生成,用户无需编写
各根对象详解
apiVersion(接口组+版本)
apiVersion用于指定资源所属的API接口组与版本,格式为<组名>/<版本号>,核心组(K8s落地时就存在的核心功能组)可省略组名,直接写版本号(如v1实际代表core/v1)。
-
设计逻辑类比:类似代码的微服务目录结构,不同组对应不同业务模块(如
classroom对应教室管理模块、student对应学生管理模块),访问不同功能需指定对应路径(如访问教室管理功能需访问classroom/v1/index.php,访问学生管理功能需访问student/v1/index.php),对应K8s中不同组对应不同的资源功能;同一模块下的不同版本(如v1、v2beta1、v3)对应同一功能的不同迭代版本,v1为基础功能版,v2beta1为性能优化版,v3可能新增功能或废弃旧功能,需根据实际需求选择对应版本。 -
查询方式:无需硬背,可通过
kubectl api-versions命令查询当前集群所有可用的API组与版本,输出格式为组名/版本号,核心组仅输出版本号。 -
注意事项:不同K8s版本的同一资源可能对应不同apiVersion,如K8s 1.15及更早版本中Deployment默认使用
extensions/v1beta1,当前版本已改为apps/v1,编写时需勤查避免报错。
kind(资源类别)
kind用于指定要创建的资源类型,如Pod、Deployment,相当于告诉K8s集群你要创建的具体资源,类似工厂生产时告知要生产汽车还是飞机,必须与实际要创建的资源类型匹配。
metadata(元数据)
metadata用于定义资源的描述信息,属于资源的附属属性,常见子对象包括:
-
name:资源的名称,同一命名空间下资源名称唯一 -
namespace:资源所属的命名空间,Pod属于命名空间级资源,不指定时默认归属到default命名空间,若需归属到其他命名空间需显式指定 -
labels:标签,用于给资源打标记,方便后续筛选、归类资源,如app: nginx表示该资源属于nginx应用。
spec(期望)
spec是声明式API的核心,用于定义用户期望的资源状态,比如Pod需要运行哪些容器、使用什么镜像、执行什么命令等。K8s集群会持续朝着用户定义的期望努力,但无法保证最终结果一定符合预期(如镜像不存在时集群会持续重试拉取,多次失败后会停止尝试)。
类比:期望孩子考上北大是spec,实际结果可能考上北大也可能考上其他院校,但会朝着期望努力。
status(状态)
status是K8s集群自动维护的字段,用于实时反映资源当前的实际状态,如Pod的状态是Running、Pending还是CrashLoopBackOff,用户编写资源清单时无需定义该字段。
实操:创建首个Pod资源清单
集群初始化验证
启动K8s集群后需等待containerd、docker、cri-dockerd、kubelet等组件及系统Pod全部启动完成,所有Pod处于Running状态才算初始化完成,可通过以下命令验证:
-
kubectl get node查看节点状态,节点状态为Ready表示节点正常 -
kubectl get pod -A查看所有命名空间的Pod,所有Pod状态为Running表示集群初始化完成
Pod资源清单示例
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: nginx
spec:
containers:
- name: myapp-1
image: nginx:v1
- name: busybox-1
image: busybox
command: [“sh”,"-c",“sleep 3600”]
Pod组成说明:每个Pod包含1个pause容器(基础设施容器)和N个业务容器,所有容器共享网络、IPC、PID命名空间。
创建操作步骤
-
将上述YAML内容保存为
pod-demo.yaml文件 -
执行
kubectl create -f pod-demo.yaml命令,将资源清单提交给K8s集群,集群会根据spec中的期望实例化对应的Pod资源 -
可通过
kubectl get pod命令查看Pod的创建状态
运维提示:执行删除等危险操作前需反复确认目标,避免误删重要文件。
字段查询工具
若不确定资源或子对象的字段定义,可通过kubectl explain命令查询官方手册,实现“哪部分不会查哪部分”,例如:
-
kubectl explain pod查询Pod根对象的字段定义 -
kubectl explain pod.spec查询Pod的spec子对象的字段定义 -
kubectl explain pod.spec.containers查询containers字段的定义与要求
AI 总结
本视频为K8s教程第四章第一节,核心讲解K8s资源清单(YAML格式)的核心构成与编写方法:首先通过代码目录、微服务拆分的类比,帮助学员理解apiVersion的组、版本设计逻辑;随后逐一解析5个一级根对象的含义、编写规则与注意事项,明确用户需要编写的字段范围;接着演示了kubectl api-versions、kubectl explain等实用命令的用法,解决字段记忆痛点;最后以创建Pod为例,完成首个资源清单的编写与提交实操,帮助学员掌握资源清单的基础编写能力,为后续学习其他资源对象的编写打下基础。