在非阻塞协调循环中重新排队 kubernetes 事件

J.C*_*age 4 go kubernetes kubernetes-custom-resources

我们有一个 kubernetes 集群,其中会触发协调以响应自定义事件。使用以下格式在 Golang 中实现:

type reconciler struct {}

func (reconciler) Reconcile(ctx context.Context, o reconcile.Request) (reconcile.Result, error) {
    // Implement business logic of reading and writing objects here
    return reconcile.Result{}, nil
}
Run Code Online (Sandbox Code Playgroud)

当自定义事件太多时,我们已经确定了协调逻辑中可能存在的瓶颈。因此,代码已更新为具有非阻塞协调逻辑。例子:

type reconciler struct {}

func (reconciler) Reconcile(ctx context.Context, o reconcile.Request) (reconcile.Result, error) {
    go func() {
        // Implement business logic of reading and writing objects here
    }()
    return reconcile.Result{}, nil
}
Run Code Online (Sandbox Code Playgroud)

然而,有些地方非阻塞 go 例程可能会返回 return ctrl.Result{Requeue: true}, nilreturn ctrl.Result{RequeueAfter: someTime}, nil

在这种情况下,我们如何将此类事件重新排队到协调循环中,因为返回不会返回到调用者 Reconcile()

Evy*_*ged 6

我认为更好的方法是使用并发协调,允许处理其他请求,而单个协调请求处理速度很慢。这样,协调请求队列就不会被阻塞,并且空闲的 go 例程相当便宜,因此它不会对您的性能产​​生太大影响。

查看: MaxConcurrentReconcileshttps : //pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/controllercontroller-runtime