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

一般的,具体表示///,比如Deployment就是apps/v1/deploymets/status

不常见的deletecollection

资源在支持delete的情况下,如果支持删除多个字眼,比如删除命名空间所有的Pod,那就算啥给予deletecollection

# 查看所有
kubectl api -resources --sort-by name -o wide

资源组Group

资源组把不通功能的资源进行了划分,资源组特点如下

  1. 众多资源组按照功能划分不同资源组,并允许单独启用/禁止资源组,也可以单独启用/禁止资源组中的资源
  2. 支持不同资源组有不同资源版本
  3. 支持同名的资源种类在不同资源组中
  4. 资源组和资源版本通过K8s API Server对外暴露,并且允许用HTTP连接
  5. 支持CRD自定义资源拓展
  6. 用户交互简单,使用kubectl不需要指定资源组
# 有组名的访问路径
/apis/<group>/<version>/<resource>
# 没组名
/api/<version>/<resource>

版本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>

// 外部资源版本
corev1 "k8s.io/api/core/v1"
// 内部资源版本
core "k8s.io/kubernetes/pkg/apis/api"
// 外部资源版本 (与资源相关函数,如资源转换函数)
k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1"

资源Resource

一个资源实例化之后表达为(Resource Object),其中K8s有区分为持久性实体(Persistent Entity

)和短暂性实体(Ephemeral Entity),比如持久性的Deployment,短暂性的Pod

资源对象的定义代码定义

内部版本资源定义

比如在/pkg/apis/apps下

├── OWNERS   //开发者名字
├── doc.go //定义了包的注释消息
├── fuzzer //定义Funcs返回的程序api组的fuzzer函数
│   └── fuzzer.go
├── install //把当前资源组下的所有资源注册到资源注册表中
│   └── install.go
├── register.go //定义了在当前资源组、资源版本以及资源的注册信息
├── types.go /定义了在当前资源组、资源版本下所支持的资源类型
├── v1 //外部资源版本
│   ├── conversion.go
│   ├── conversion_test.go
│   ├── defaults.go
│   ├── defaults_test.go
│   ├── doc.go
│   ├── register.go
│   ├── zz_generated.conversion.go
│   └── zz_generated.defaults.go
├── v1beta1 //外部资源版本
│   ├── conversion.go
│   ├── defaults.go
│   ├── defaults_test.go
│   ├── doc.go
│   ├── register.go
│   ├── zz_generated.conversion.go
│   └── zz_generated.defaults.go
├── v1beta2 //外部资源版本
│   ├── conversion.go
│   ├── conversion_test.go
│   ├── defaults.go
│   ├── defaults_test.go
│   ├── doc.go
│   ├── register.go
│   ├── zz_generated.conversion.go
│   └── zz_generated.defaults.go
├── validation 定义了资源的验证方法
│   ├── validation.go
│   └── validation_test.go
└── zz_generated.deepcopy.go 定义了资源的深复制方法,代码生成器生成

每一个K8s的资源目录,都通过register.go代码定义资源组和资源版本,主要是runtime.APIVersionInternal 标识了内部资源版本

// GroupName is the group name use in this package
const GroupName = "apps"

// SchemeGroupVersion is group version used to register these objects
var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: runtime.APIVersionInternal}

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
const GroupName = "apps"

// SchemeGroupVersion is group version used to register these objects
var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"}

资源注册

在K8s的资源组目录中,都有intsall/install.go,它负责将资源信息注册到资源注册表(Scheme)中,以core为例,

代码路径:pkg/apis/core/install/install.go

legacyscheme.Schemekube-apiserver组件的全局资源注册表,K8s的所有资源对象交给资源注册表统一管理,core.AddToScheme函数注册core资源组内部版本的资源。v1.AddToScheme函数注册core资源组外部版本的资源,scheme.SetVersionPriority函数注册组的版本顺序,如果有多个资源版本,排在最前面的是资源首选版本。

package install

import (
"k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/apis/apps"
"k8s.io/kubernetes/pkg/apis/apps/v1"
"k8s.io/kubernetes/pkg/apis/apps/v1beta1"
"k8s.io/kubernetes/pkg/apis/apps/v1beta2"
)

func init() {
Install(legacyscheme.Scheme)
}

// Install registers the API group and adds types to a scheme
func Install(scheme *runtime.Scheme) {
utilruntime.Must(apps.AddToScheme(scheme))
utilruntime.Must(v1beta1.AddToScheme(scheme))
utilruntime.Must(v1beta2.AddToScheme(scheme))
utilruntime.Must(v1.AddToScheme(scheme))
utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion, v1beta2.SchemeGroupVersion, v1beta1.SchemeGroupVersion))
}

资源的优先版本

当资源存在当个版本的时候,就会初心啊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

func (vs Verbs) String() string {
return fmt.Sprintf("%v", []string(vs))
}

资源对象操作方法接口

操作方法(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)