k8s crd和API Aggregation的区别

本文围绕 Kubernetes 定制资源展开,介绍了定制资源和定制控制器,分析是否添加定制资源及选择 ConfigMap 或定制资源的条件。阐述添加定制资源的两种方式(CRD 和 API 聚合)的特点,还提及准备安装时的注意事项及访问定制资源的方法。

定制资源

资源(Resource) 是 Kubernetes API 中的一个端点, 其中存储的是某个类别的 API 对象的一个集合。 例如内置的 Pod 资源包含一组 Pod 对象。

定制资源(Custom Resource) 是对 Kubernetes API 的扩展,不一定在默认的 Kubernetes 安装中就可用。 定制资源所代表的是对特定 Kubernetes 安装的一种定制。 不过,很多 Kubernetes 核心功能现在都用定制资源来实现,这使得 Kubernetes 更加模块化。

定制资源可以通过动态注册的方式在运行中的集群内或出现或消失,集群管理员可以独立于集群更新定制资源。 一旦某定制资源被安装,用户可以使用 kubectl 来创建和访问其中的对象, 就像他们为 Pod 这种内置资源所做的一样。

定制控制器

就定制资源本身而言,它只能用来存取结构化的数据。 当你将定制资源与定制控制器(Custom Controller) 结合时, 定制资源就能够提供真正的声明式 API(Declarative API)

Kubernetes 声明式 API 强制对职权做了一次分离操作。 你声明所用资源的期望状态,而 Kubernetes 控制器使 Kubernetes 对象的当前状态与你所声明的期望状态保持同步。 声明式 API 的这种机制与命令式 API(你指示服务器要做什么,服务器就去做什么)形成鲜明对比。

你可以在一个运行中的集群上部署和更新定制控制器,这类操作与集群的生命周期无关。 定制控制器可以用于任何类别的资源,不过它们与定制资源结合起来时最为有效。 Operator 模式就是将定制资源与定制控制器相结合的。 你可以使用定制控制器来将特定于某应用的领域知识组织起来,以编码的形式构造对 Kubernetes API 的扩展。

我是否应该向我的 Kubernetes 集群添加定制资源?

在创建新的 API 时, 请考虑是将你的 API 与 Kubernetes 集群 API 聚合起来, 还是让你的 API 独立运行。

考虑 API 聚合的情况 优选独立 API 的情况
你的 API 是声明式的 你的 API 不符合声明式模型。
你希望可以是使用 kubectl 来读写你的新资源类别。 不要求 kubectl 支持。
你希望在 Kubernetes UI (如仪表板)中和其他内置类别一起查看你的新资源类别。 不需要 Kubernetes UI 支持。
你在开发新的 API。 你已经有一个提供 API 服务的程序并且工作良好。
你有意愿取接受 Kubernetes 对 REST 资源路径所作的格式限制,例如 API 组和名字空间。(参阅 API 概述 你需要使用一些特殊的 REST 路径以便与已经定义的 REST API 保持兼容。
你的资源可以自然地界定为集群作用域或集群中某个名字空间作用域。 集群作用域或名字空间作用域这种二分法很不合适;你需要对资源路径的细节进行控制。
你希望复用 
### 关于Kubernetes CRDOperator模式 #### 自定义资源定义(CRD) CRD允许扩展API服务器的功能,无需修改核心组件即可引入新的API对象。通过CRD可以创建特定业务需求的对象类型[^1]。 ```yaml apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: kvdis.example.com spec: group: example.com versions: - name: v1alpha1 served: true storage: true scope: Namespaced names: plural: kvdis singular: kvdI kind: Kvdi shortNames: - kd ``` 这段YAML配置文件展示了如何定义一个新的名为`kvdI`的自定义资源,在命名空间范围内可用,并属于`example.com`组的一部分。 #### Operator模式 Operators是一种封装、部署并管理Kubernetes应用的方法。它利用定制控制器来实现复杂的状态管理操作逻辑自动化。对于像KVDI这样的虚拟桌面基础设施项目来说,operator可以帮助简化集群中的VDI环境管理工作流。 为了构建一个基于Go语言编写的简单Operator,通常会遵循如下结构: - 定义所需的Custom Resource Definitions (CRDs). - 创建Controller用于监听这些新类型的事件变化. - 编写Reconcile函数处理实际的任务执行. ```go package main import ( "context" appsv1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" ctrl "sigs.k8s.io/controller-runtime" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/manager/signals" ) func main() { ctx := context.Background() log := logf.Log.WithName("controller_kvd") mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{}) if err != nil { panic(err.Error()) } clientset, _ := kubernetes.NewForConfig(mgr.GetConfig()) kvdiCtrl := &KvdiController{ ClientSet: clientset, Log: log, Scheme: mgr.GetScheme(), } err = kvdiCtrl.SetupWithManager(mgr) if err != nil { panic(err.Error()) } log.Info("starting manager") if err := mgr.Start(signals.SetupSignalHandler()); err != nil { log.Error(err, "problem running manager") } } ``` 上述代码片段提供了一个基本框架,其中包含了启动带有自定义控制器的manager所需的关键部分. #### 最佳实践建议 当开发针对KVDI或其他项目的operators时,请考虑以下几点最佳做法: - **模块化设计**: 将功能分解成独立的小型服务或库,以便更容易维护发展。 - **幂等性保障**: 确保每次调用都能得到相同的结果,即使重复多次也不会影响最终状态。 - **错误恢复机制**: 实现重试策略其他方法来应对临时性的失败情况。 - **监控与日志记录**: 添加足够的指标暴露以及详细的日志输出支持调试工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值