K8s-三大核心数据结构
K8s-三大核心数据结构
构成
- Group:资源组,在K8s API Server称之为APIGroup
- Version:资源版本,在K8s API Server称为APIVersion
- Resource:资源,在K8s API Server称为APIResource
- Kind:资源种类,描述K8s种类,与Resource统一级别
K8s支持多Group
,每个Group
支持多Version
,每个Version
支持多Resource
,部分资源还有自己的子资源(Sub Resource),比如Deployment
的status
一般的,具体表示
不常见的deletecollection
资源在支持delete
的情况下,如果支持删除多个字眼,比如删除命名空间所有的Pod
,那就算啥给予deletecollection
# 查看所有 |
资源组Group
资源组把不通功能的资源进行了划分,资源组特点如下
- 众多资源组按照功能划分不同资源组,并允许单独启用/禁止资源组,也可以单独启用/禁止资源组中的资源
- 支持不同资源组有不同资源版本
- 支持同名的资源种类在不同资源组中
- 资源组和资源版本通过K8s API Server对外暴露,并且允许用
HTTP
连接 - 支持
CRD
自定义资源拓展 - 用户交互简单,使用
kubectl
不需要指定资源组
# 有组名的访问路径 |
版本Version
版本迭代为:Alpha
➡️ Beta
➡️ Stable
- Alpha: 开发内部测试,
v1akpha1,v1aplpha2,v2alpha1
- Beta: 相对稳定版本,
v1beta1,v1beat2,v2beta1
- Stable: 正式发布版本,
v1,v2,v3
内部和外部版本
- External Object:外部版本资源对象,也称为
Versioned Object
- Interbal Object: 内部版本,
runtime.APIVersionInternal
标识的就是内部版本资源对象
外部版本代码定义在:pkg/apis/<group>/<version>
内部版本资源在:pkg/apis/<group>
// 外部资源版本 |
资源Resource
一个资源实例化之后表达为(Resource Object),其中K8s有区分为持久性实体(Persistent Entity
)和短暂性实体(Ephemeral Entity),比如持久性的Deployment
,短暂性的Pod
资源对象的定义代码定义
内部版本资源定义
比如在/pkg/apis/apps下
├── OWNERS //开发者名字 |
每一个K8s的资源目录,都通过register.go
代码定义资源组和资源版本,主要是runtime.APIVersionInternal
标识了内部资源版本
// GroupName is the group name use in this package |
在types.go
标识了资源组下,支持的资源对象
外部版本资源对象代码定义
就是里面具体的版本/pkg/apis/apps/v1
- Conversion.go: 定义了资源的转换函数,并且默认转换函数注册到资源注册表中
- default.go:定义了资源的默认值函数,并将默认值对象注册到资源注册表中
- doc.go:定义了包的注释信息,还有代码生成器的Tags描述文件
- register.go: 定义了资源组、资源版本和资源的注册信息
- zz_generated.conversion.go:代码生成器生成的资源转换函数
- zz_generated.defaults.go:代码生成器生成的资源默认值函数
Version: “v1” 外部版本标识
// GroupName is the group name use in this package |
资源注册
在K8s的资源组目录中,都有intsall/install.go
,它负责将资源信息注册到资源注册表(Scheme)中,以core
为例,
代码路径:pkg/apis/core/install/install.go
legacyscheme.Scheme
是kube-apiserver
组件的全局资源注册表,K8s的所有资源对象交给资源注册表统一管理,core.AddToScheme
函数注册core
资源组内部版本的资源。v1.AddToScheme
函数注册core
资源组外部版本的资源,scheme.SetVersionPriority
函数注册组的版本顺序,如果有多个资源版本,排在最前面的是资源首选版本。
package install |
资源的优先版本
当资源存在当个版本的时候,就会初心啊PereferredVersion.
依次是v1.v1beta2.v1beta1
utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion, v1beta2.SchemeGroupVersion, v1beta1.SchemeGroupVersion)) |
资源对象的操作方法
操作方法主要通过metav1.Verbs
进行数据结构描述。
代码路径:vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go
type Verbs []string |
资源对象操作方法接口
操作方法(verbs) | 操作方法接口 | 说明 |
---|---|---|
create | rest.Creater | 创建 |
delete | rest.CracefullDeleter | 删除(单个) |
deletecollection | rest.CollectionDeleter | 删除(多个) |
update | rest.Updater | 更新(完整的对象) |
patch | rest.Patcher | 更新(局部) |
get | rest.Getter | 获取(单个) |
list | rest.Lister | 获取(多个) |
watch | rest.Watcher | 监控 |
命名空间
四个K8s自带的namespace
- default:所有未指定命名空间的资源对象都会分配给该命名空间
- kube- system:所有的K8s系统创建的资源对象都会分配给该空间
- kube- public:此命名空间是自动创建的,所有用户均可以读取。主要保留供集群用,以防某些资源在整个集群中公开可见和刻度。
通过kubectl api-resource --namespaced=true
显示出资源是否所属namespace
自定义资源
自定义资源对象是K8s API资源的拓展(CRD,Custom Resource Default)