问题标签 [operator-sdk]
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.
go - 使用自定义 fieldSelector 列出来自缓存客户端的自定义资源
我正在使用Operator SDK构建自定义 Kubernetes 运算符。我使用相应的 Operator SDK 命令创建了自定义资源定义和控制器:
在主协调循环中(对于上面的示例,自动生成的ReconcileExample.Reconcile
方法),我有一些自定义业务逻辑,需要我在 Kubernetes API 中查询具有特定字段值的其他同类对象。我突然想到,我可能可以将默认 API 客户端(由控制器提供)与自定义字段选择器一起使用:
当我运行运算符并创建新Example
资源时,运算符失败并显示以下错误消息:
最重要的部分是
名称为字段的索引:spec.someField 不存在
我已经在默认 API 客户端上搜索了 Operator SDK 的文档,并了解了客户端的内部工作原理,但没有详细说明此错误或如何修复它。
此错误消息是什么意思,如何创建此缺失索引以按此字段值有效列出对象?
go - 如何在 Kubernetes Go Operator 中读取 YAML 以创建对象,而不是硬编码?
我正在使用 Golang 开发一个自定义 Kubernetes Operator,作为对基于现有 Helm Charts 生成的 Operator 的一种转变。据我了解,创建 Pod(或我将分享的示例中的 Job)的方式是这样的:
然后在 Reconcile 调用的其他地方,作业实际上是在 Kubernetes 上创建的:
这……很明显不是最优的。我看不到填充诸如“图像”之类的内容或允许覆盖“资源”等内容的好方法,而这仅次于它是一个巨大的硬编码 blob(我删除了识别信息和大约 120 行)上面的规范,诸如附加卷和其他容器之类的东西)。
我希望能够从清单中的现有 YAML 文件中提取(以前与 Helm 图表和 Helm 操作符一起使用的文件),并从诸如此类的方法以 Go 需要的格式返回该文件。
我一直在互联网上搜索类似的东西,但是那里还没有很多 Go 或 k8s Operators 资源,所以我想我会在这里问。
你们有什么想法或解决方案吗?
openshift - operator-sdk 不接受集群范围的关键字
我正在使用 operator-sdk 版本 v0.11.0。但是,当我尝试使用 --cluster-scope 选项创建新项目时,它无法识别该选项并以 unknown option 失败cluster-scope
。我是运营商的新手。知道我错过了什么。
kubernetes - OpenShift 角色创建配额
我正在尝试在我创建的命名空间上创建配额。
这是我的代码:
当我在本地运行它并使用管理员帐户登录到 minishift 时,我看到正在创建配额。但是,我正在尝试创建一个具有正确角色和角色绑定的服务帐户来创建配额。
这是我role.yaml
认为会给服务帐户创建配额的权限:
这是我在日志中看到的:
go - 在协调功能中检测规格更新
我现在从 Kubernetes 和 Operator SDK 开始,我正在尝试构建我的第一个 Operator,我可能有一个简单的问题。
问题
如何在 reconcile 循环中检测自定义资源 yaml 中的配置更改并根据更改采取措施?
我在我的 CR 规范中指定了一些配置属性:
当我添加这种新的自定义资源时,我希望我的控制器创建一个新的 pod,其中运行我的应用程序图像(在网络服务器中)。当我的应用程序第一次启动并运行时,我想通过操作员的 HTTP 请求对其进行配置(以添加规范中的目录)。到目前为止还可以,但我还可以在我的应用程序启动并运行时更改这些目录。
例如,我想在规范中添加新目录(通过 kubectl 补丁)。我的操作员的协调方法将被调用,我如何理解规范已更改?我不确定对我的应用程序进行 HTTP 调用以获取所有目录并将它们与规范中的目录进行比较是一个好主意。这是理解变化的正确方法吗?
我正在考虑其他两种方法来发现某些内容已更新,但我不确定它们是否能正常工作,以及它们是否是最好的方法。
第一个想法是使用 client.Get(...) 请求 StoreApp 的实例,但据我了解,这将调用 API 服务器并获取 mystoreapp 的更新版本。我读到了一些本地索引,它就像这些对象的缓存一样,我可以检查缓存的对象和从 API 服务器返回的对象之间是否存在差异。但是我没有找到如何从这个本地索引中获取对象,所以我无法比较这两个对象。
创建地图,我在其中存储孔规范对象的哈希,并在每次使用 client.Get(...) 获得的对象的哈希时检查此哈希。我认为这会起作用,但应该有更好的方法来做到这一点。
我阅读了一些 K8s 的 Java 运算符,其中有一些方法,如 onAdd、onUpdate、onDelete。我在 Operatod SDK 中找不到类似的东西。Operator SDK 中有类似的东西吗?
每个答案都会有所帮助。先感谢您!
最好的问候, 赫斯蒂扬
kubernetes - Kubernetes Operator CSV 停滞不前
我正在尝试使用 OLM 0.12.0 将 Kubernetes 操作员安装到 OpenShift 集群中。我跑去oc create -f my-csv.yaml
安装。它已成功创建,但我没有得到任何结果。
在 olm 操作员日志中,我发现此消息:
我还注意到,没有创建 InstallPlan 来创建我认为它正在创建的帐户。
怎么了?
go - VSCode 和 CLI 之间的 Golang 行为不一致
我正在使用operator-sdk并且看到 VSCode 和 CLI 之间的行为不一致。
当我跑步时,operator-sdk run --local
我看到以下内容。但是 VSCode 没有显示错误。我不确定为什么会这样或问题出在哪里。
有问题的代码如下所示。
我正在使用gomodules,相关模块是->github.com/tektoncd/pipeline v0.10.0
我知道这与指针引用有关,当我将代码更改为
然后 VSCode 显示如下错误,但 CLI 不报告任何错误。
这只是一个模块依赖问题,我的上游 API 在某个地方发生了变化吗?也许我的 cli 和 VSCode 正在读取不同的依赖项?我什至不知道从哪里开始......任何指针(双关语)都值得赞赏。
kubernetes - 如何检查字段是否在自定义资源中显式设置
更新:
我发现我的代码确实有效。协调循环false
首先出现的原因是因为我的集群中存在另一个运算符并自动进行布尔翻转。删除该运算符后,我的代码按预期工作。
这个问题与 Kubernetes 和 Operator-SDK 有关。假设我有一个自定义资源,其规范显示如下:
最后一个字段open
是布尔类型,用于指示商店是否营业。在我的操作员的协调循环中,我想知道MyStore
类型的 CR 是否明确设置了open
字段值。例如:
- 如果值 CR 的
open
字段已显式设置为true
orfalse
,则协调循环应直接采用此值。 - 如果 CR 没有
open
明确设置字段,或者该字段不存在,则协调循环应考虑默认值open
astrue
。
目前我尝试了这种方式,将open
字段类型设置为我的结构中的布尔指针:
然后在协调循环中,我检查现有的open
字段,如下所示:
上面代码的思路是检查open
field的指针是否存在:如果指针为null,则设置true
为open
field。这个想法来自这个问题Go: How to check if a struct property was explicit set to a zero value?
但是上面的代码没有像我预期的那样工作:如果 open
CR 的字段不存在(没有明确设置值),则 valuestore.Spec.Open
将被解析为false
but not nil
。
还有其他方法可以进行字段值检查吗?
kubernetes - 如何正确连接 K8S 对象?
根据operator-sdk doc ,这是operator开发人员常犯的错误。
通过标签、OwnerRefs、状态等连接 Kubernetes 对象的方法可能与未来的更新不兼容或从长远来看过于限制。
那么正确的方法是什么?labels
如何在没有and的情况下连接相关对象OwnerRefs
?
kubernetes - 两个K8S控制器同时修改同一个资源可以吗?
我有几个 CRD,每个 CRD 都应该Container.Spec
在整个集群中进行编辑。像 ENV、标签等...
如果资源由多个控制器管理,可以吗?
这种方法可能存在哪些缺陷?