问题标签 [kubernetes-operator]
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 - Kubebuilder:资源删除没有预期的副作用
我正在使用kubebuilder创建一个带有关联控制器的自定义资源定义 (CRD) 。我的控制器协调循环创建了一个部署子资源,并使用 controllerutil.SetControllerReference(&myResource, deployment, r.Scheme)
. 我还配置了我的协调器,以便“拥有”子资源,如下所示:
但是,当我使用 本地运行我的控制器时make run
,我注意到删除我的 CR(根对象)不会导致部署子资源被垃圾收集。我还注意到删除部署子资源不会触发我的协调器运行。为什么是这样?有什么我没有做的,或者这可能是本地开发/测试的限制?
istio - 如何使用 istio-operator 更改 istiod 部署的配置?
我正在使用 calico CNI 的 EKS 集群上使用 istio-operator 设置 istio 控制平面。在集群上安装 istio 后,我知道新的 pod 没有出现,我在谷歌搜索后得到的原因如下:
现在,我想仅使用 istio-operator 对 istiod 部署应用hostNetwork: true
更改spec.template.spec
。
我做了一些谷歌搜索来更改或覆盖 istiod 部署的值,并获得了以下 yamls 文件:
但他们也没有工作。以下是我应用的最后一个配置:
任何人都可以帮助我仅使用 istio-operator 添加到 istiod 部署吗hostNetwork: true
?spec.template.spec
go - 在外部资源更改上调用 kubernetes 操作员协调循环
我正在开发一个 k8s 自定义资源,作为业务逻辑的一部分,当集群中的外部作业更改其自身状态时,它需要协调其状态。
这些作业不是由自定义资源本身创建的,而是为第三方服务在外部创建的,但是我需要协调 CRO 的状态,例如当任何这些外部作业完成时。
在阅读了一堆文档之后,我想出了为控制器设置一个观察者,像下面的例子一样观察乔布斯
不,我正在为 Jobs 和具有相应 名称和命名空间的 CR 触发我的协调循环,但我对对象类型一无所知。
如何在 Reconcile 对象类型中检查?所以我可以检索完整的对象数据调用r.Get
kubernetes - Kubernetes Operators:根据内部容器信息构建自定义资源状态
我正在实现一个 kubernetes 运算符,只要发现特定的 pod 处于运行状态,它就应该简单地部署一个服务。问题是 pod 容器内的进程(我无法以任何方式修改)正在随机服务端口,在有效运行进程本身之前,我无法知道端口号。那时我可以编写一个脚本来从 pod 内部收集此端口信息并通过特定端点提供服务。
我想在我的协调循环中带来有关端口的这些信息,以便我可以生成指向正确 targetPort 的服务,但不能真正提出一个干净的 kubernetes 兼容解决方案。
我能想到的唯一方法是强制我的控制器查询 pod 上直接指向其 ip 地址的端点。
你能帮我找出更好或更标准的方法吗?
mongodb - mongodb-community-operator 成员增加不起作用
当我增加副本集时,mongodb 代理永远不会变得健康。如果我最初从 3 个成员开始,则所有 3 个成员都会成功创建。如果我减少,它也会起作用(一段时间后)。
重现步骤:
- 在集群范围内安装了 mongodb-community-operator 版本 0.7.0。
- 创建一个有 1 个成员的 mongodb 社区对象(参见下面的代码)。使用版本 4.4.0 和 5.0.0 测试
- 等到 pod 运行。
- 增加会员
- 第一个成员的 mongodb-agent 永远不会变得健康。不会创建第二个成员。
发现:
根据https://github.com/mongodb/mongodb-kubernetes-operator/blob/98b3c78aaca0c58b951156e6f4d7770fd913ebb6/docs/deploy-configure.md#deploy-a-replica-set中的第 4 点,操作员应创建一个包含连接字符串的密钥。事实并非如此。
mongodb 社区对象没有获得状态,尽管它应该有。在 mongodb operator pod 日志中发现此错误:
Error updating the status of the MongoDB resource: MongoDBCommunity.mongodbcommunity.mongodb.com "my-database" is invalid: status.version: Required value
在 mongodb-agent 容器中找到了一条日志,这表明缺少填充的状态字段导致在协调时出现了“StartFresh”步骤而不是“Start”:
[2021-10-05T08:21:04.124+0000] [.info] [src/director/director.go:tracef:794] 0> [08:21:04.124] 运行步骤:移动“Start”的“StartFresh” [2021-10-05T08:21:04.124+0000] [.info] [src/director/director.go:tracef:794] 0> [08:21:04.124] 因为[以下所有情况均为真:['currentState .Running' = false] ['currentState.IsVCRedistCorrect' = true] ['desiredState.ProcessType' != mongos ('desiredState.ProcessType' = mongod)] ['currentState.StorageFieldsChangeFinished' = true] [以下全部为真: ['currentState.BackupRestoreFinished' = true] ['currentState.IsDirectAttachRestoreRequested' = false] ] ['currentState.CanStartFresh' = true] ]
我还检查了,将所有 pod 部署在一个节点上,以缓解子网连接问题。没变。增加成员数量的唯一(有效)方法是删除所有 pvc 并使用增加的成员数量开始新部署。但是数据随后被删除,因此这并不是真正的解决方法。
这是我的 mongodbcommunity 对象的代码:
kubernetes - 调试 Kubernetes Custom Operator 上的 Reconcile 触发器的原因
我有一个自定义操作符,它监听我在 Kubernetes 集群中定义的 CRD 中的变化。
每当定义的自定义资源发生变化时,自定义运算符将协调并幂等地创建一个秘密(将由自定义资源拥有)。
我期望操作员仅在自定义资源或它拥有的秘密发生更改时才进行协调。
我观察到的是,由于某种原因,该函数会以奇怪的间隔Reconcile
触发集群上的每个 CR,而对相关实体没有可观察到的变化。我已经尝试专注于 CR 的特定实例,并遵循Reconcile
需要它的时间。这些调用的间隔很奇怪。电话似乎在两个系列之间交替 - 一个从 10 小时开始,一次减少 7 分钟。另一个从 7 分钟开始,每次增长 7 分钟。
为了演示,在这些时间进行协调triggered
(给或花几秒钟):
每当递减间隔小于 7 小时时,它会重置为 10 小时间隔。与不断增长的系列相同 - 一旦间隔高于 3 小时,它就会重置回 7 分钟。
我的主要问题是如何调查 Reconcile 被触发的原因?
我在此处附上 CRD 的清单、操作员和 CR 的示例清单:
笔记:
- Reconcile 完成后,我返回:
所以这不应该是重复触发的原因。
- 我要补充一点,我最近将 Kubernetes 集群版本更新为 v1.20.8-gke.2101。
kubernetes - Kubernetes编程:CRD、控制器和算子学习资料
我正在学习 Kubernetes,因为越来越多的公司在其上构建他们的基础设施。作为一名 DevOps 和 SRE 人员,我发现在 Kubernetes 中使用自定义资源和操作符非常有用,可以帮助用户在将新应用程序部署到集群时减轻他们的负担,因为我可以总结有用的应用程序并为它们定义模板。这些模板是 CRD 和 Operators。
问题
我想知道是否有专门的资料或课程来学习如何编写自己的 CRD、控制器和操作员;学习曲线比查看源代码更温和。最好是系列课程。
我已经做过的事情:
我已经下载了示例控制器并学会了使用它。但是,我发现我对控制器的理解仍然不足以从头开始构建控制器。
我还搜索了udemy的课程。但是几乎所有的都是关于如何构建和操作 k8s,这是我已经知道的最基本的知识。
我在谷歌和媒体上搜索过材料。许多较旧的材料已经过时(例如,用于部署的资源组仍然
extensions
不是apps
)或不够详细。我还研究了 operatorhub.io 中流行的源代码模板。然而,阅读源代码的学习曲线实在是太陡了。
kubernetes - kubernetes Operator如何将环境变量注入或更新到容器中
我有一个项目需要在 pod 容器中注入或更新环境变量kubebuilder
,使用and controller-runtime
,
我的计划如下:
我尝试更新后,出现以下错误
但似乎无法在源代码中更新env
// k8s.io/api/core/v1/types.go
如果您能告诉我如何解决它,我将不胜感激。
kubernetes - 如何更新 K8S Pod 的 DNS 配置
我有一个项目想用 Operator 更新 Pod 的 DNS 配置,
但是当我实现它时,我得到了以下错误:
DNSConfig
和DNSPoicy
字段在源码中没有声明不能更新,那为什么更新失败呢?
我在使用kubect edit pod busybox
andkubectl apply -f modifyed_pod.yml(add DNSConfig)
命令时遇到了同样的错误。
如果您能告诉我如何解决它,我将不胜感激。