我有 k8s 操作员,它按预期工作,我需要向其他操作员 CRD(不是我的)添加一个“手表”,为了简单起见,让我们调用它,extCR我们的操作员 cr 调用inCR,
我尝试了以下操作,但有一个问题是它如何触发协调。
func (r *Insiconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&Inv1alpha1.Iget{}}).
Watches(&source.Kind{Type: &ext.Se{}}, handler.EnqueueRequestsFromMapFunc(r.FWatch)).
Complete(r)
}
func (r *Insiconciler) FWatch(c client.Object) []reconcile.Request {
val := c.(*ivi.Srv)
req := reconcile.Request{NamespacedName: types.NamespacedName{Name: val.Name, Namespace: val.Namespace}}
return []reconcile.Request{req}
}
这里的问题是我触发了协调extCR,我想在里面FWatch更新inCR并开始协调 inCR 而不是 extCR,我该怎么做?
我的意思是,为了避免像下面的代码这样的事情,因为有时协调是为 the 完成的inCR,有时是为 theextCR而不是我可以得到一些丑陋的 if's
func (r *Insiconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
var inCR FOO
var extCR BAR
if err := r.Get(ctx, req.NamespacedName, &inCR); err != nil {
return ctrl.Result{}, err
}
if err := r.Get(ctx, req.NamespacedName, &extCR); err != nil {
return ctrl.Result{}, err
}
我想知道处理这种情况的正确/干净的方法是什么
当您需要收听 externalCR(不是您的控制器的一部分)和 internalCR(来自您的控制器)时的情况。
还有一件事——CR 是不同的 GVK,但是 exteranlCR 包含很多不需要的字段,只是其中的一些。但必填字段 在两个 cr 上具有相同的名称
更新
type inCR struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec inSpec `json:"spec,omitempty"` / / ————————here is the difference
Status InsightTargetStatus `json:"status,omitempty"`
}
//—————— 这是在不属于我们的其他程序上定义的,因此不能“重用”
type Bar struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec extSpec `json:"spec,omitempty"` // ———————here is the difference
Status ServiceStatus `json:"status,omitempty"`
}
并且inSpec具有以下字段(extSpec 的子集)
type inSpec struct {
name string
age int
}
HUWWW
相关分类