我正在尝试列出在 operator-sdk 运算符中设置为不可调度的所有节点。通常(1.12 之前)这意味着他们已经spec.unscheduleable
设置。所以我尝试了这个:
nodes := &corev1.NodeList{}
opts := &client.ListOptions{}
if err := opts.SetFieldSelector("spec.unschedulable=true"); err != nil {
reqLogger.Info("Failed to set field selector")
}
这是错误的:
2019-04-23T10:19:39.761-0700 ERROR kubebuilder.controller Reconciler error {"controller": "node-controller", "request": "/nodename", "error": "Index with name field:spec.unschedulable does not exist"}
我对此感到困惑,因为字段选择器适用于 kubectl:
kubectl get nodes --field-selector="spec.unschedulable=true"
除了这个问题,我注意到在 v1.12 之后,spec.unscheduleable 字段已被弃用,取而代之的是 TaintNodeByCondition。这使事情变得更加复杂,因为现在我真的不认为我可以使用任何人的字段选择器,因为我不相信(除非我弄错了?)无论如何你都可以使用带有污点的字段选择器。
所以,我的问题是 - 如何有效地列出集群中所有受污染/不可调度的节点,特别是在使用 operator-sdk 时
更新:
我已经设法通过使用 v1meta.ListOptions 调用解决了字段选择器问题,如下所示:
nodes := &corev1.NodeList{}
opts := &client.ListOptions{
Raw: &metav1.ListOptions{
FieldSelector: "spec.unschedulable=true",
},
}
但是,我仍然不知道如何处理污点,所以我编辑了问题并将其保持打开状态