关联学习
- 【转载】k8s中Apimachinery、Api、Client-go库之间的关系_client go 依赖-CSDN博客
附录1 | k8s 各个库(apimachinery、api、kubernetes)
k8s.io/api
、k8s.io/apimachinery
和 k8s.io/kubernetes
是 Kubernetes 的核心模块,它们在功能上有明确的分工,共同构建 Kubernetes 的生态系统。以下是它们的详细对比和区别:
1. k8s.io/api
定义:
- Kubernetes 的资源对象(如 Pod、Deployment、Service 等) API 类型定义的模块。
- 用于描述 Kubernetes 对象的结构和字段,通常用于序列化/反序列化 Kubernetes 资源。
功能:
- 定义 Kubernetes API 对象的结构(例如
Deployment
,Pod
,Service
等)。 - 这些对象是 Kubernetes 使用的标准资源定义,通常用在客户端代码中(例如
kubectl
和自定义控制器)。
用途:
-
用于编写客户端代码,比如使用
client-go
与 Kubernetes API Server 交互时引用这些类型。 -
模块位置:
k8s.io/api/apps/v1/types.go # Deployment 定义 k8s.io/api/core/v1/types.go # Pod 和 Service 定义
2. k8s.io/apimachinery
定义:
- Kubernetes 的通用工具库,提供基础结构和工具,供 Kubernetes 和其他基于 Kubernetes 的项目使用。
功能:
- 定义通用的 API 模型和工具,例如
metav1.ObjectMeta
、ListOptions
、TypeMeta
等。 - 提供了 Kubernetes 对象的元信息(如名称、标签、注解)。
- 定义了一些通用接口和工具,包括:
- 深拷贝工具。
- 客户端和服务端数据转换工具。
- 类型的注册和 Scheme 处理。
- REST 客户端实现。
用途:
-
为
k8s.io/api
和k8s.io/kubernetes
提供基础支持。 -
模块位置:
k8s.io/apimachinery/pkg/apis/meta/v1 # 元信息定义 k8s.io/apimachinery/pkg/runtime # 类型系统和工具
3. k8s.io/kubernetes
定义:
- Kubernetes 的主仓库,包含核心实现(如调度器、API Server、控制器管理器等)。
功能:
- 定义 Kubernetes 的核心逻辑和组件:
- API Server 的实现。
- 调度器(Scheduler)的实现。
- 控制器管理器(Controller Manager)的实现。
- kubelet、kubectl 的实现。
- 提供 Kubernetes 的核心二进制文件。
用途:
- 提供 Kubernetes 的整体实现,是运行 Kubernetes 集群的必备模块。
- 一般不会作为依赖直接引用,因为其结构复杂,且包含了所有代码。
- 推荐使用
k8s.io/client-go
和其他模块与 Kubernetes 交互,而不是直接依赖k8s.io/kubernetes
。
主要区别对比
特性 | k8s.io/api | k8s.io/apimachinery | k8s.io/kubernetes |
---|---|---|---|
核心功能 | 定义 Kubernetes API 对象类型(就是 GVK 的定义) | 提供元信息、工具和通用组件(理解为 metada、ObjectMeta、TypeMeta 之类) | 实现 Kubernetes 的核心功能(理解为控制器、apiserver之类) |
模块类型 | 轻量级 API 类型模块 | 底层工具模块 | 核心实现模块 |
适用场景 | 客户端使用,用于定义和解析资源 | 提供对象元信息和类型转换工具 | Kubernetes 集群运行和核心功能 |
依赖关系 | 依赖 k8s.io/apimachinery | 独立存在 | 依赖 k8s.io/api 和 k8s.io/apimachinery |
使用场景 | 客户端工具或控制器开发 | 类型注册、元信息操作、深拷贝工具 | Kubernetes 核心开发 |
建议使用的模块
- 如果开发 控制器 或 操作 Kubernetes 资源,选择:
k8s.io/api
:用来定义资源类型(如Pod
,Deployment
)。k8s.io/apimachinery
:用来操作元信息或类型系统。k8s.io/client-go
:用来与 Kubernetes 集群交互。
k8s.io/kubernetes
:只在开发 Kubernetes 本身或调试 Kubernetes 源码时使用,不建议直接作为依赖。