gpt4 book ai didi

kubernetes - 在operator-SDK/client-go中按污点列出无法调度的kubernetes节点

转载 作者:行者123 更新时间:2023-12-02 12:36:10 25 4
gpt4 key购买 nike

我试图列出在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字段为 deprecated,以支持TaintNodeByCondition。这使事情变得更加复杂,因为现在我真的不认为任何人都可以使用fieldselector,因为我不相信(除非我弄错了?)无论如何都不能将fieldselector与污点一起使用。

因此,我的问题是-如何有效地列出群集中所有受污染/无法调度的节点,特别是在使用operator-SDK时

更新:

我设法通过使用v1meta.ListOptions调用解决了fieldselector问题,如下所示:
nodes := &corev1.NodeList{}
opts := &client.ListOptions{
Raw: &metav1.ListOptions{
FieldSelector: "spec.unschedulable=true",
},
}

但是,我仍然不知道如何使用异味,因此我已经编辑了问题并将其保留为打开状态

最佳答案

根据Controller Runtime文档,使用原始选项不适用于缓存。

相反,您应该在 Controller 初始化期间将所需的字段添加到索引:

idx := myManager.GetFieldIndexer()
idx.IndexField(&corev1.Node{}, "spec.unschedulable", func(o runtime.Object) []string {
return []string{fmt.Sprintf("%v", o.(*corev1.Node).Spec.Unschedulable)}
})

我不知道这是否可以帮助您使用Operator SDK。

关于kubernetes - 在operator-SDK/client-go中按污点列出无法调度的kubernetes节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55816640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com