Kubernetes Project Layout

根据 Standard Go Project Layout 方案,我们对标一下 Kubernetes Project Layout 的设计。
image.png
由于 Kubernetes 项目全球开发者众多,这导致早期的代码包较多,尤其是 kube-apiserver 组件,其内部所引用的代码包特别多。随着 Kubernetes 系统版本的迭代,逐渐将部分包进行了合并,其中 staging/ 目录为核心包暂存目录,该目录下的核心包多以软连接的方式链接到 vendor/k8s.io 目录。

k8s核心数据结构

资源组,资源版本,资源,子资源完整形式: ///
例如deployment:apps/v1/deployments/status
资源分类:kubernetes内置资源、自定义资源(Custom Resource)即用户CRD定义的资源。
资源操作方式(Verbs): create、delete、deletecollection、get、list、patch、update、watch

group资源组:

  • 有组名的资源组://,例如apps/v1/deployments
  • 没有组名的资源组(Core Group):/,例如/v1/pods

资源外部版本与内部版本:
外部版本需要暴露给用户,所以资源代码定义JSON Tags和Proto Tags
内部版本资源不对外暴露,所以没有任何JSON Tags和Proto Tags

pod的外部版本定义:
/vendor/k8s.io/api/core/v1/types.go

  1. type Pod struct {
  2. metav1.TypeMeta `json:",inline"`
  3. metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
  4. Spec PodSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
  5. Status PodStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
  6. }

pod的内部版本定义:
pkg/apis/core/type.go

type Pod struct {
    metav1.TypeMeta
    metav1.ObjectMeta
    Spec PodSpec
    Status PodStatus
}