4

我在client-go的帮助下为 Go 中的 Kubernetes 编写了一个自定义控制器。它基于采样控制器,到目前为止运行良好。

可以选择SharedIndexInformer定期重新同步所有对象。(样品控制器中的参数resyncPeriod设置为 30 秒。)

有没有办法立即强制重新同步?

似乎处理定期重新同步的代码似乎调用store.Resync(). 我试过打电话fooInformer.Informer().GetStore().Resync()。调用成功,但没有发生重新同步。我错过了什么?


我正在使用client-go v0.17.2,服务器是 EKS v1.14.9-eks-c0eccc

4

2 回答 2

1

这是不可能的。

cache.Store定期重新同步的 被实例化为newInformer队列:k8s.io/client-go/tools/cache/controller.gocache.DeltaFIFO

    // This will hold incoming changes. Note how we pass clientState in as a
    // KeyLister, that way resync operations will result in the correct set
    // of update/delete deltas.
    fifo := NewDeltaFIFOWithOptions(DeltaFIFOOptions{
        KnownObjects:          clientState,
        EmitDeltaTypeReplaced: true,
    })

这是cache.New()作为未导出的字段返回的cache.controller{}.config.Queue,没有导出的函数可供访问,因此无法手动调用Resync()

于 2021-01-13T20:36:19.597 回答
0

调用fooInformer.Informer().GetStore().Resync()时,您正在使用Resync以下定义的 Store 类型的函数/方法:client-go/tools/cache/store.go

在那里我们可以看到以下内容:

在 Store 类型定义中:

// Resync is meaningless in the terms appearing here but has
// meaning in some implementations that have non-trivial
// additional behavior (e.g., DeltaFIFO).
Resync() error

在下面的 Resync 定义中:

// Resync is meaningless for one of these
func (c *cache) Resync() error {
return nil
}

除非您实际上有其他类来执行重新同步,否则这应该什么都不做。

这就是为什么

调用成功,但没有发生重新同步。

希望有帮助!

于 2020-02-06T13:43:02.037 回答