一、Customer Resource
自定义资源是Kubernetes API的扩展,本文将讨什么时候应该向Kubernetes集群添加自定义资源以及何时使用独立服务。它描述了添加自定义资源的两种方法以及如何在它们之间进行选择。
1.1 自定义资源概述
资源就是Kubernetes API集合中的某个的对象。例如,内置pods资源包含Pod对象的集合。
自定义资源是扩展了Kubernetes API,但在默认的API集合中是不可用的,因为没有对应的controller处理业务逻辑。使用自定义资源,不仅可以解耦大多数的自研功能,还可用使得Kubernetes更加模块化。
自定义资源可以通过动态注册的方法,于正在running的集群中创建、删除和更新,并且与集群本身的资源是相互独立的。当自定义资源被创建,就可以通过kubectl创建和访问对象,和对内置资源的操作完全一致。
1.2 是否需要自定义资源
在创建新的API时,应该考虑与Kubernetes的API聚合,还是让API独立运行。
API聚合 | API独立 |
---|---|
声明式 | 非声明式 |
kubectl可读可写 | 不需要kubectl支持 |
接受k8s的REST限制 | 特定API路径 |
可限定为cluster或者namespace | 不适用namespace |
重用k8s API支持的功能 | 不需要这些功能 |
1.3 声明式API VS 命令式API
在声明式API,通过具有以下特性:
- 对象颗粒度小
- 基础结构的定义
- 读写多,更新少,操作主要为CRUD
- API表期望状态
命令式API,通过具有以下特性:
- 同步响应
- RPC调用
- 大量数据存储(大对象或多对象)
- 高带宽访问
- 操作非CRUD
- API不易抽象
二、Customer Resource Definition
Kubernetes提供了两种向集群添加自定义资源的方法:
- 创建自定义API server并聚合到API中
- CRDs
2.1 Customer Resource Definition介绍
通过CRD创建自定义资源,只要符合CRD结构体定义,均可以被Kubernetes所接收,以下是CRD的定义:
type CustomResourceDefinition struct {
//Kind,APIVersion
metav1.TypeMeta
//metadata
metav1.ObjectMeta
//spec
Spec CustomResourceDefinitionSpec
//status
Status CustomResourceDefinitionStatus
}
type CustomResourceDefinitionSpec struct {
Group string
Version string
//Plural,Singular,ShortNames,Kind,ListKind,Categories