K8s开发-API详解

基于K8s v1.29

资源对象

一个K8s资源对象描述一般是kind、apiVersion、metadata、spec和status五个部分

资源对象的类型

资源对象的类型用Kind属性表示,总体分为3个类型:

  • 对象(Object)、代表系统中永久资源实体,比如Pod、RC
  • 列表(List):资源对象的合集
  • 简单类别(Simple):作用于资源对象或非持久辅助实体的特定操作,比如Status、Scale、ListOptions等

资源对象的元数据

metadata是资源对象的元数据定义,由一组属性来定义,在K8s中,每个资源对象都必须包含以下元数据属性:

  • namespec:对象所属的命名空间,如果不指定,则昔日会将对象置于名为default中
  • name:对象的名称、在一个ns下,唯一性
  • uid:系统为每个对象生成唯一的ID,符合RFC4122
  • labels:自定义标签
  • annotations:用户自定义注解,被K8s内部进程或者外部工具使用
  • resourceVersion:用于识别资源内部斑斑的字符串,在Watch操作,可以避免Get和下一次Watch不一致,用于区别资源是否改变
  • createTimestamp:创建系统对象的时间戳,符合RFC3339
  • deletionTimestamp:删除系统对象的时间戳,符合RFC3339
  • selfLink:通过API访问资源自身的URL

资源对象的版本

K8s一直在发展,为来兼容API,所以设计来APIVersion

资源对象的主体定义

对资源对象进行详细描述主体部分都是在spec给出,这部分内容会被K8s完整保存到etcd

资源对象的状态

status记录对象在系统中的当前状态信息

Pod的status的主要信息包含conditions、containerStatus、hostIP、phase、podIP、startTime等,

  • phase:描述对象所处生命周期,典型值包含Pending、Running、Active或Terminated
  • condition:表示条件,由条件类型和状态值组成,条件类型可能包含Pod Scheduled、Initialized、Ready、ContainersReady等

K8sAPI详解

API分组管理

K8s API并不是简单以资源对象机械能管理,而是以group/version的方式对资源进行管理

K8s 的API Group的总体分为以下俩组

  1. 核心组(Core Group):作为K8s的核心资源组,比如apiVersion:v1

  2. 拓展组API,除来核心组之外的APIGroup,比如batch/v1

    常见的一些API Group说明:

    • app/v1:最常见的APi Group,其中包含许多核心资源对象
    • batch/v1:包含批处理

通过kubectl api-resources可以查看当前集群的API Group和资源对象 列表

API 版本号通常描述API的成熟阶段:

  • v1表示GA稳定阶段
  • v1beta3表示Beta版本(预发布版本)
  • V1aplpha1表示实验性版本

API标准

API资源使用REST模式,对资源对象的操作方法

  1. GET/<资源名复数格式>:获取某一类型的资源列表,比如GET/pods返回一个Pod资源列表

  2. POST/<资源名复数格式>:创建一个资源,该资源来资源用户提供的JSON对象

  3. GET/<资源名复数格式>/<名称>:通过给出的名称获得单个资源

  4. DELETE/<资源名复数格式>/<名称>:通过给出的名称来删除单个资源,在删除选项可以指定优雅删除的时间

  5. PUT/<资源名复数格式>/<名称>:通过给出的资源名和客户端提供的JSON对象来更新或创建资源

  6. PATCH/<资源名复数格式>/<名称>:选择修改资源详细制定的域

    支持PATCH的类型:

    • JSON Patch,Content-Type:application/json-patch+json
    • Merge Patch,Content-Type:application/merge-json-patch+json
    • Strategic Merge Patch,Content-Type:application/strategic-json-patch+json

K8s API调用和调试

部署swagger-editot

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
apiVersion: apps/v1
kind: Deployment
metadata:
name: swagger-editor
labels:
app: swagger-editor
spec:
replicas: 1
selector:
matchLabels:
app: swagger-editor
template:
metadata:
labels:
app: swagger-editor
spec:
containers:
- name: swagger-editor
image: swaggerapi/swagger-editor:latest
ports:
- containerPort: 8080
resources:
limits:
memory: "256Mi"
cpu: "500m"
apiVersion: v1
kind: Service
metadata:
name: swagger-editor
spec:
selector:
app: swagger-editor
ports:
- protocol: TCP
port: 80
targetPort: 8080