我现在开发一个 operator ,在 crd 中定义了 group 、version 、kind ,用户 apply 的 cr 指定了 group 、version 、kind ,我就动态的去 watch 用户指定的类型,然后 watch 的资源修改后我的 controller 进行一些处理。kubebuilder 是在代码中提前指定了 controller 要 watch 的资源,这种动态的 watch ,是怎么做的呢?
1
totopper312 2023-05-11 16:22:03 +08:00
你这不是用户插入一条 CR ,然后你执行操作,还是用户要新建新的 CRD ,你要 watch 这个新的 CRD 么?
|
2
birdhk OP 谢谢你的回复。就是用户 apply cr 让我去 watch 什么我就 watch 什么。但是 kubebuilder 这种都是在代码里提前就指定好了要 watch 什么吧。我不知道如何动态去 watch 了,需要自定义 controller 吗?
|
3
Frankcox 2023-05-11 16:34:09 +08:00
你的意思是用户 apply 的 cr 的内容是 k8s 资源的 group kind 等信息,比如用户传的 CR 的内容是 apps v1 Deployment ,那你就去 watch Deployment ?
这样的话你在这个 CRD 的 Controller 中写好逻辑,AddFunc 的时候,获取 apply 的信息,根据这些信息手动启动一个该资源的 informer 或者 Watch 不行吗? |
5
chronos 2023-05-11 17:06:21 +08:00
建立使用 informer 监控资源的变更,informer 有本地缓存速度比较快。我记得好像还可以在重连时恢复事件,而 watch 会丢失事件变更。
|
6
boatrain1111 2023-05-11 19:44:05 +08:00
watch 套中套,6 啊
|
7
strawberryBug 2023-05-11 20:20:48 +08:00 via Android
@chronos informer 针对连接断开有啥好的方案吗?
|
8
frank1256 2023-05-12 09:01:24 +08:00
@birdhk 创建 dynamic informer 就可以了,参考 https://pkg.go.dev/k8s.io/client-go/dynamic/dynamicinformer
@strawberryBug 官方 client 包里的 informer 有同步机制,配置 resync period ,会有自动重连机制,失败会有报错提示。 |
9
pepesii 2023-05-12 16:00:37 +08:00
|