问题标签 [kubebuilder]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
377 浏览

kubernetes - 如何为某个资源 Kubernetes Go Operator 生成事件

我正在用 Go 编写一个 Kubernetes Operator,我想以与 Pod 相同的方式生成事件,即在协调的每个点我想编写一个可以使用kubectl describe myresource.

我找到了可以让我这样做的包,但我不明白如何使用它:https ://github.com/kubernetes/client-go/blob/master/tools/record/event.go

示例骨架代码:

0 投票
2 回答
2144 浏览

kubernetes - 如何为任意对象触发 Kubernetes 控制器协调器?

概述

我正在为可以在集群中垂直扩展部署的 VerticalScaler CRD 编写 Kubernetes 控制器。我的规范引用了集群中现有的部署对象。如果修改或删除了引用的部署,我想将 VerticalScaler 的协调请求排入队列。

问题

当该资源不属于控制器并且该资源不包含对其资源由控制器管理的对象的引用时,是否有一种观察任意资源的好方法?

我发现了什么

我认为这应该在控制器的 Kubebuilder 标准SetupWithManager函数中进行配置,尽管可以在其他地方设置手表。

我一直在controller-runtime/pkg/builder和 Kubebuilder 文档中寻找一种好的方法。我发现的最接近的例子是kubebuilder-v1 文档中关于 watch 的“Watching Arbitrary Resources”部分:

控制器可以监视任意资源并将它们映射到控制器管理的资源的键。控制器甚至可以将一个事件映射到多个键,为每个键触发 Reconciles。

示例:为了响应集群扩展事件(例如删除或添加节点),控制器将监视节点并将监视事件映射到控制器管理的对象的键。

我的挑战是如何将部署映射到依赖的 VerticalScaler,因为部署中不存在此信息。我可以在 VerticalScaler 上创建一个索引,并使用字段选择器从MapFunc中查找依赖的 VerticalScalers ,但我似乎不应该在 MapFunc 中执行 I/O。如果 list-Deployments 操作失败,我将无法重试或重新排队更改。

我让这段代码使用这种不完美的方法工作:

其他考虑的方法

只是为了覆盖我的基础,我应该提到我不想将 VerticalScaler 设置为 Deployment 的所有者,因为如果 VerticalScaler 被删除,我不想垃圾收集 Deployment。即使是非控制器 ownerReference 也会导致垃圾收集。

我也考虑过使用Channel watcher,但文档说这是针对源自集群外部的事件,但事实并非如此。

我还可以为 Deployment 创建一个单独的控制器,并从该控制器的 Reconcile 函数更新依赖 VerticalScaler(s) 上的某些字段,但是我还需要一个终结器来处理在删除 Deployment 时触发 VerticalScaler 协调,并且似乎有点矫枉过正。

我可以让我的 VerticalScaler 协调器向部署添加注释,但是如果由例如 Helm 管理,部署注释可能会被覆盖。在部署之前创建 VerticalScaler 的情况下,这也不会导致协调请求。

0 投票
1 回答
304 浏览

go - 获取触发 kubebuilder 中的控制器的事件类型

我刚刚开始使用 kubebuilder 和 Golang 来使用自定义资源扩展我们的 Kubernetes 集群。我很想根据实际调用它的事件在协调器功能中做不同的事情。

资源是否创建?更新了吗?被删除了吗?

这些事件中的每一个都会触发控制器,但是,我似乎无法找到查看这些事件中实际发生了哪些事件的可能性。我可以通过编写这样的协调器来解决这个问题:

然而,这感觉奇怪的隐含和有点hacky。

是否有一种干净的(可能是本机的)方法来获取协调器调用的事件类型?

0 投票
1 回答
51 浏览

kubernetes - 我想创建一个扩展 Cronjob 的自定义控制器

我想为在某些情况下不生成作业的 Cronjob 创建一个自定义控制器。

有什么方法可以轻松创建一个几乎完全像 Cronjob 一样工作的自定义控制器?

0 投票
1 回答
137 浏览

kubernetes - Kubebuilder:资源删除没有预期的副作用

我正在使用kubebuilder创建一个带有关联控制器的自定义资源定义 (CRD) 。我的控制器协调循环创建了一个部署子资源,并使用 controllerutil.SetControllerReference(&myResource, deployment, r.Scheme). 我还配置了我的协调器,以便“拥有”子资源,如下所示:

但是,当我使用 本地运行我的控制器时make run,我注意到删除我的 CR(根对象)不会导致部署子资源被垃圾收集。我还注意到删除部署子资源不会触发我的协调器运行。为什么是这样?有什么我没有做的,或者这可能是本地开发/测试的限制?

0 投票
0 回答
106 浏览

kubernetes - Kubernetes Operator 从配置映射中读取监视命名空间

我有一个通过 kube builder 构建的运算符,它从“WATCH_NAMESPACE”环境中读取,以了解要监视的命名空间。这就是当前设置的工作方式。

这工作正常。但问题是每次我们需要添加一个新的命名空间来观察时,我们都需要重启算子。我相信这里最好的选择是观看配置图并每次都从中读取。但我不确定如何进行此操作。任何建议或文档或链接都会有所帮助。

0 投票
0 回答
36 浏览

kubernetes - Kubernetes Operators:根据内部容器信息构建自定义资源状态

我正在实现一个 kubernetes 运算符,只要发现特定的 pod 处于运行状态,它就应该简单地部署一个服务。问题是 pod 容器内的进程(我无法以任何方式修改)正在随机服务端口,在有效运行进程本身之前,我无法知道端口号。那时我可以编写一个脚本来从 pod 内部收集此端口信息并通过特定端点提供服务。

我想在我的协调循环中带来有关端口的这些信息,以便我可以生成指向正确 targetPort 的服务,但不能真正提出一个干净的 kubernetes 兼容解决方案。

我能想到的唯一方法是强制我的控制器查询 pod 上直接指向其 ip 地址的端点。

你能帮我找出更好或更标准的方法吗?

0 投票
1 回答
59 浏览

kubernetes - 是否有从自定义资源定义生成客户资源对象的工具?

我有一个复杂的kubernetes 客户资源定义。我想从定义中生成一个有效的自定义资源对象,然后用我的替换一些值。这是为了快速测试。

我不想从头开始创建 yaml 文件,而是想使用一个工具来自动生成它。就像 kubebuilder在创建 API 时所做的一样(将示例对象放在 config/samples 下)。

问题:是否有任何现成的工具可用于此目的?

0 投票
0 回答
38 浏览

kubernetes - Kubernetes中多版本CRD存储和Hub版本的区别

Kubernetes 中的多版本 CRD 存储和 Hub 版本有什么区别?可以存储版本和集线器版本可以不同。

假设我有 2 个版本的 CRD v1 和 v2,最初 v1 被标记为集线器版本和存储版本。现在,如果我想将 v2 迁移/标记为存储版本,我是否也必须更改我的转换 webhook 并且必须将 v2 标记为集线器版本,或者不进行任何更改并将 v1 作为集线器并将 v2 作为存储版本。

0 投票
1 回答
70 浏览

kubernetes - Kubebuilder 谓词跳过某些命名空间

我在控制器中使用 kubebuilder 框架,我想完全忽略给定系统名称空间列表中的事件。我认为谓词必须是最好的选择,因此我有以下代码

但是,我仍然接收来自所有命名空间的事件,而不仅仅是我允许的事件。这是一个正确有效的谓词用例吗?