【发布时间】:2019-07-17 19:52:56
【问题描述】:
我正在使用Operator SDK 构建自定义 Kubernetes 操作符。我使用相应的 Operator SDK 命令创建了自定义资源定义和控制器:
operator-sdk add api --api-version example.com/v1alpha1 --kind=Example
operator-sdk add controller --api-version example.com/v1alpha1 --kind=Example
在主协调循环中(对于上面的示例,自动生成的 ReconcileExample.Reconcile 方法)我有一些自定义业务逻辑,需要我查询 Kubernetes API 以查找具有特定字段值的其他同类对象.我突然想到,我也许可以将默认 API 客户端(由控制器提供)与自定义字段选择器一起使用:
func (r *ReconcileExample) Reconcile(request reconcile.Request) (reconcile.Result, error) {
ctx := context.TODO()
listOptions := client.ListOptions{
FieldSelector: fields.SelectorFromSet(fields.Set{"spec.someField": "someValue"}),
Namespace: request.Namespace,
}
otherExamples := v1alpha1.ExampleList{}
if err := r.client.List(ctx, &listOptions, &otherExamples); err != nil {
return reconcile.Result{}, err
}
// do stuff...
return reconcile.Result{}, nil
}
当我运行运算符并创建新的Example 资源时,运算符失败并显示以下错误消息:
{"level":"info","ts":1563388786.825384,"logger":"controller_example","msg":"Reconciling Example","Request.Namespace":"default","Request.Name":"example-test"}
{"level":"error","ts":1563388786.8255732,"logger":"kubebuilder.controller","msg":"Reconciler error","controller":"example-controller","request":"default/example-test","error":"Index with name field:spec.someField does not exist","stacktrace":"..."}
最重要的部分是
名称为字段的索引:spec.someField 不存在
我已经在默认 API 客户端上搜索了the Operator SDK's documentation 并了解了一些有关客户端的内部工作原理,但没有对此错误或如何修复它的详细说明。
此错误消息是什么意思,如何创建此缺失索引以按此字段值有效列出对象?
【问题讨论】:
标签: go kubernetes operator-sdk