问题标签 [kubernetes-custom-resources]
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.
kubernetes - 如何在手动将现有对象升级到 k8s 客户资源中的新存储版本时从 status.storedVersions 中删除版本
如何在将现有对象手动升级到 kubernetes 自定义资源中的新存储版本时从“status.storedVersions”中删除版本
CRD 的 apiVersion:apiextensions.k8s.io/v1beta1
使用 aws EKS
CRD YAML
并将 CRD 升级到 v2
禁用版本 v1 后,我想将其从版本列表中删除,我需要将其从 status.storedVersions 中删除,我该怎么做才能让 kubernetes 文档没有提供有关该内容的详细信息
kubernetes - 如何在自定义资源对象的状态更新时忽略 CRD 修改事件
处理 CRD 实例后,我试图通过我在 python 中的自定义入口控制器修补 CRD 的状态。
在状态补丁之后,我从 crd 实例上的 kube-api 服务器接收到一个修改事件,因为在状态更新后资源版本正在增加。
事件示例:
{'type': 'MODIFIED', 'object': {'apiVersion': '...', 'kind': '...', 'metadata': {'creationTimestamp': '...', 'generation': 1, ' name':'thro','namespace':'default','resourceVersion':'9927551','selfLink':'...','uid':'...'},'spec':{'...},' status': {'state': 'Success', 'status_message': 'CRD Activated'}}}
我的要求是忽略此修改事件,因为规范没有变化。但唯一的方法是跟踪 CRD 实例对象的上一代值,并比较一代中是否有更新。我想避免。
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 - 我可以暂停 kubectl apply 的类型检查吗?
我正在通过操作员安装自定义资源。但是,在“来自服务器的错误 (NotFound): customresourcedefinitions.apiextensions.k8s.io "my-crd.example.com" not found."kubectl apply
中被阻止。
如果有一个 kubectl apply
沿线的开关--no-typechecking
,它会解决这个问题。我不会导致缺少 CRD 的问题,因为它apply
只是将 Kubernetes 对象发送到 etcd。然后,当 Operator 实际构建自定义资源时,自定义资源定义将可用。(我有其他代码可以保证这一点。)
那么,我可以暂停产生此错误的类型检查吗?
kubernetes - 是否可以使用“子类”CRD 扩展 Kubernetes CRD?
例如,如果我定义了 的 CRD kind: Animal
,我可以将 CRD 定义为的Dog
特定吗?CRD 将具有与基本 CRD 不同/扩展的架构要求。type
Animal
Dog
Animal
我的目标是能够做 akubectl get animals
并且能够看到所有不同type
的 'sAnimals
被创建。
这似乎是通过使用type
某些资源的元数据来实现的Secret
,但我似乎无法找到如何使用 CRD 来实现这一点。
注意:我的真实用例不是围绕存储Animals
,而是来自 OOP 的一个典型示例。
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控制器同时修改同一个资源可以吗?
我有几个 CRD,每个 CRD 都应该Container.Spec
在整个集群中进行编辑。像 ENV、标签等...
如果资源由多个控制器管理,可以吗?
这种方法可能存在哪些缺陷?
kubernetes - Kubernetes CRDs - 参考现有的验证规范
有没有办法访问现有的验证规范?例如,我希望能够在我的 CRD 上设置 NodeAffinity,并且只想设置 $ref: 。我在这里找到了整个 API:https ://github.com/kubernetes/kubernetes/blob/master/api/openapi-spec/swagger.json 或 kubectl proxy -> localhost:8001/openapi/v2(来自我的集群)
我可以手动复制粘贴 api 验证模式,但我想知道是否有一种方法可以使用 $ref 从我的 CRD 中自动引用现有的 OpenAPI 验证规范。我想像 $ref: localhost:8001/openapi/v2/definitions/io.k8s.api.core.v1.NodeAffinity
如果这是可能的,它是否也会解决内部的 $refs ?
作为参考,以下是 API 中的 nodeaffinity 定义:
(使用带有 Ansible 的 Operator-SDK,以防万一)
编辑:(添加一个完整的例子来进一步解释)
我有一个名为 Workshop 的 CRD,我需要对某些规格参数进行验证。
现在我需要添加一个 nodeAffinity 规范字段,该字段将应用于此 CustomResourceDefinition 下的任何 pod。它的验证将与 Pod 中的 nodeAffinity 验证完全相同。
让我从以下网址提取已经在 OpenApi 中编写的验证规范:https ://github.com/kubernetes/kubernetes/blob/master/api/openapi-spec/swagger.json 并将其转换为 YAML,然后将其添加到我的规范中.
哇,为了验证一个字段(及其子字段),我的 CRD 定义增加了 100 多行,所有这些都只是为了重新实现 Kubernetes 原生 pod api 定义中已经存在的东西。手动复制粘贴并手动解析 Kubernetes 规范中的所有引用也需要大约 15 分钟。这不是很有意义吗:
A) 将此长 API 规范存储在外部文件中,并使用 $ref: externalfile.json 将其拉入以保持我的 CRD 小而干净。
或者更好
B) 使用 $ref 标签插入已经存在的实际 Kubernetes 原生验证规范,如下所示:
回到 30 行左右的代码,并且验证规范与 Kubernetes 原生验证保持同步,因为它从 Kubernetes API 本身提取信息。据此,应该支持 $ref 这样做:https ://swagger.io/docs/specification/using-ref/#syntax
kubernetes - Kubernetes Ansible Operators - 修补现有 Kubernetes 资源
使用 ansible:是否可以使用 json 或 yaml 片段修补资源?我基本上希望能够完成与kubectl patch <Resource> <Name> --type='merge' -p='{"spec":{ "test":"hello }}'
追加/修改资源规范相同的事情。
https://docs.ansible.com/ansible/latest/modules/k8s_module.html 是否可以使用 k8s ansible 模块做到这一点?它说如果资源已经存在并且设置了“状态:存在”,它将对其进行修补,但据我所知,它并没有修补
谢谢
kubernetes - K8s CRD 错误:不支持的媒体类型 415
所以我一直在关注本教程(https://www.youtube.com/watch?v=KBTXBUVNF2I),在设置协调器后,当我执行“make run”时,我收到以下错误:
该错误似乎来自这一行:
任何想法可能导致此错误以及如何解决它?