<aside> 🥳 本节主要讲解 Kubernetes 核心的资源类型 Scheme 的定义和用途。

</aside>

介绍

当我们操作资源和 apiserver 进行通信的时候,需要根据资源对象类型的 Group、Version、Kind 以及规范定义、编解码等内容构成 Scheme 类型,然后 Clientset 对象就可以来访问和操作这些资源类型了,Scheme 的定义主要在 api 子项目之中,源码仓库地址: https://github.com/kubernetes/api ,被同步到 Kubernetes 源码的 staging/src/k8s.io/api 之下。

主要就是各种资源对象的原始结构体定义,比如查看 apps/v1 目录下面的定义:

$ tree staging/src/k8s.io/api/apps/v1
staging/src/k8s.io/api/apps/v1
├── BUILD
├── doc.go
├── generated.pb.go
├── generated.proto
├── register.go
├── types.go
├── types_swagger_doc_generated.go
└── zz_generated.deepcopy.go

0 directories, 8 files

types.go 文件

其中 types.go 文件里面就是 apps/v1 这个 GroupVersion 下面所有的资源对象的定义,有 Deployment、DaemonSet、StatefulSet、ReplicaSet 等几个资源对象,比如 Deployment 的结构体定义如下所示:

TypeMetaObjectMetaDeploymentSpec 以及 DeploymentStatus 4个属性组成,和我们使用 YAML 文件定义的 Deployment 资源对象也是对应的。

apiVersion: apps/v1
kind: Deployment  
metadata:
  name:  nginx-deploy
  namespace: default
spec:
  selector:  
    matchLabels:
      app: nginx
  template:  
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

其中 apiVersionkind 就是 TypeMeta 属性,metadata 属性就是 ObjectMeta,spec 属性就是 DeploymentSpec,当资源部署过后也会包含一个 status 的属性,也就是 DeploymentStatus ,这样就完整的描述了一个资源对象的模型。

zz_generated.deepcopy.go 文件

上面定义的规范在 Kubernetes 中称为资源类型 Scheme,此外zz_generated.deepcopy.go 文件是由 deepcopy-gen 工具创建的定义各资源类型 DeepCopyObject() 方法的文件,所有注册到 Scheme 的资源类型都要实现 runtime.Object 接口:

// staging/src/k8s.io/apimachinery/pkg/runtime/interface.go
type Object interface {
	GetObjectKind() schema.ObjectKind
	DeepCopyObject() Object
}

而所有的资源类型都包含一个 TypeMeta 类型,而该类型实现了 GetObjectKind() 方法,所以各资源类型只需要实现 DeepCopyObject() 方法即可:

// staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go
func (obj *TypeMeta) GetObjectKind() schema.ObjectKind { return obj }

各个资源类型的 DeepCopyObject() 方法也不是手动定义,而是使用 deepcopy-gen 工具命令统一自动生成的,该工具会读取 types.go 文件中的 +k8s:deepcopy-gen 注释,以 Deployment 为例:

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// Deployment enables declarative updates for Pods and ReplicaSets.
type Deployment struct {
......
}

然后将自动生成的代码保存到 zz_generated.deepcopy.go 文件中。