Kubernetes Project Layout
根据 Standard Go Project Layout 方案,我们对标一下 Kubernetes Project Layout 的设计。
由于 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
type Pod struct {metav1.TypeMeta `json:",inline"`metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`Spec PodSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`Status PodStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`}
pod的内部版本定义:pkg/apis/core/type.go
type Pod struct {
metav1.TypeMeta
metav1.ObjectMeta
Spec PodSpec
Status PodStatus
}
